使用PolarDB-X作为PolarDB-X的Slave

MySQL主从复制,分为MasterSlave两种角色,PolarDB-XCDC提供的日志服务使PolarDB-X可以作为Master。同时,PolarDB-XCDC还具备对标MySQL Replica的能力,使PolarDB-X作为Slave。

注意事项

  • 操作方式和使用MySQL作为PolarDB-XSlave基本一致。

  • PolarDB-X提供的Replication SQL高度兼容MySQL,具体信息,请参见Replication语句

  • 受限于网络,在通过控制台购买的PolarDB-X实例上,用户无法创建复制链路,该功能主要面向自建场景。

  • PolarDB-X5.4.12版本开始默认对包含全局二级索引(GSI)的表上的INSERT IGNORE语句开启RETURNING优化,如果您使用PolarDB-X作为PolarDB-XSlave,该优化可能导致PolarDB-X消费Binlog过程出现数据不一致的风险。您可以通过 SET GLOBAL DML_USE_RETURNING = FALSE关闭对INSERT IGNORERETURNING优化。关闭RETURNING优化会导致包含GSI的表上的INSERT IGNROE语句性能下降,可能影响数据导入任务,建议结合业务使用情况进行评估后谨慎决定是否需要关闭。

    模拟场景

    1. 创建包含UGSI的示例表t

      CREATE TABLE t(
        pk INT,
        sk INT,
        uk INT,
        PRIMARY KEY(pk),
        UNIQUE GLOBAL INDEX g_i_k(uk) PARTITION BY uk
      ) PARTITION BY sk;
    2. 分别使用INSERT INTOINSERT IGNORE插入数据。

      INSERT INTO t VALUES (1,1,1),(2,2,2);
      INSERT IGNORE INTO t VALUES (1,2,2);
    3. RETURNING优化的INSERT IGNORE执行流程会先向存储节点乐观执行INSERT IGNORE,再对误插入的数据执行DELETE, 该流程下主表的Binlog会包含如下内容。

      INSERT INTO t VALUES(1,2,2);
      DELETE FROM t WHERE pk = 1 AND sk = 2;
      说明

      下游PolarDB-X在消费该Binlog时,INSERT语句执行便会在列uk上出现UK冲突报错,此时Replica组件会将该INSERT转为REPLACE执行插入从而插入成功,但该REPLACE也替换了表中的原记录,进而导致了上下游数据不一致。

操作方法

创建主从复制链路

  • 语法

    CHANGE MASTER TO option [, option] ... [ channel_option ]
    
    option: {
        MASTER_HOST = 'host_name'
      | MASTER_USER = 'user_name'
      | MASTER_PASSWORD = 'password'
      | MASTER_PORT = port_num
      | MASTER_LOG_FILE = 'source_log_name'
      | MASTER_LOG_POS = source_log_pos
      | MASTER_LOG_TIME_SECOND = source_log_time
      | SOURCE_HOST_TYPE = {RDS|POLARDBX|MYSQL}
      | STREAM_GROUP = 'stream_group_name'
      | WRITE_SERVER_ID = write_server_id
      | TRIGGER_AUTO_POSITION = {FALSE|TRUE}
      | WRITE_TYPE = {SPLIT|SERIAL|TRANSACTION}
      | MODE = {INCREMENTAL|IMAGE}
      | CONFLICT_STRATEGY = {OVERWRITE|INTERRUPT|IGNORE|DIRECT_OVERWRITE}
      | IGNORE_SERVER_IDS = (server_id_list)
    }
    
    channel_option:
        FOR CHANNEL channel
    
    server_id_list:
        [server_id [, server_id] ... ]
  • 参数说明

    • MASTER_HOST:主实例地址。

    • MASTER_USER:主实例用户。

    • MASTER_PASSWORD:主实例密码。

    • MASTER_PORT:主实例端口。

    • MASTER_LOG_FILE:主实例文件名。

    • MASTER_LOG_POS:主实例文件内位点,从该位点开始进行binlog复制。

    • MASTER_LOG_TIME_SECOND:主实例时间位点,采用unix标准时间戳,单位为秒。当指定MASTER_LOG_FILEMASTER_LOG_POS作为精确位点时,MASTER_LOG_TIME_SECOND将被忽略。

    • SOURCE_HOST_TYPE:主实例的类型,默认为MYSQL,如主实例为PolarDB-X 2.0,需显示设置该参数为POLARDBX。

    • STREAM_GROUP:开通多流服务时指定的流组名称,如主实例为PolarDB-X 2.0且需要对接主实例的多流binlog服务,则需要填入该选项。

    • WRITE_SERVER_ID:写入server_id。

    • TRIGGER_AUTO_POSITION:是否自动采用主实例最新位点,默认为false。

    • WRITE_TYPE:写入方式,默认为 SPLIT,表示非事务完整的并行复制;SERIAL表示非事务完整的串行复制;TRANSACTION表示事务完整的串行复制。

    • MODE:模式,INCREMENTAL表示仅增量同步,IMAGE表示结构,全量以及增量同步。

    • CONFLICT_STRATEGY:冲突策略,默认为OVERWRITE(覆盖),表示对于约束冲突的数据会采取Replace Into写入;INTERRUPT表示复制中断;IGNORE表示忽略。

    • IGNORE_SERVER_IDS:需要忽略的server_id。

    • channel_option:指定该链路的名字,需要与当前已存在的链路名不同。

  • 示例1

    执行以下语句,可根据创建复制链路,并从binlog1713159938(2024-04-15 13:45:38)开始同步。

    CHANGE MASTER TO 
    MASTER_HOST='pxc-YOURENDPOINT.com', 
    MASTER_PORT=3306, 
    MASTER_USER='polardbx', 
    MASTER_PASSWORD='123456', 
    SOURCE_HOST_TYPE=polardbx, 
    MASTER_LOG_TIME_SECOND=1713159938, 
    write_server_id=1944903859
    FOR CHANNEL 'pxc-bjrcsnbyagcdxh';
  • 示例2

    执行以下语句,可根据创建复制链路,并从主实例binlog.000001offset 4处开始同步。

    CHANGE MASTER TO 
    MASTER_HOST='pxc-YOURENDPOINT.com', 
    MASTER_PORT=3306, 
    MASTER_USER='polardbx', 
    MASTER_PASSWORD='123456', 
    SOURCE_HOST_TYPE=polardbx, 
    MASTER_LOG_FILE='binlog.000001', 
    MASTER_LOG_POS=4, 
    write_server_id=1944903859
    FOR CHANNEL 'pxc-bjrcsnbyagcdxh';
说明

更多信息,请参见CHANGE MASTER TO

修改主从复制链路过滤配置

  • 语法

    CHANGE REPLICATION FILTER option [, option] ... [ channel_option ]
    
    option: {
        REPLICATE_DO_DB = (do_db_list)
      | REPLICATE_IGNORE_DB = (ignore_db_list)
      | REPLICATE_DO_TABLE = (do_table_list)
      | REPLICATE_IGNORE_TABLE = (ignore_table_list)
      | REPLICATE_WILD_DO_TABLE = (wild_do_table_list)
      | REPLICATE_WILD_IGNORE_TABLE = (wile_ignore_table_list)
      | REPLICATE_SKIP_TSO = 'tso_num'
      | REPLICATE_SKIP_UNTIL_TSO = 'tso_num'
      | REPLICATE_ENABLE_DDL = {TRUE|FALSE}
    }
    
    channel_option:
        FOR CHANNEL channel
  • 参数说明

    • REPLICATE_SKIP_TSO:跳过该TSO对应的binlog event,TSO相关介绍请参见分布式事务

    • REPLICATE_SKIP_UNTIL_TSO:跳过该TSO之前所有的binlog event(不包含该TSO)。

    • REPLICATE_ENABLE_DDL:是否同步DDL,默认为TRUE。

    • 以下参数说明请参见CHANGE REPLICATION FILTER

      • REPLICATE_DO_DB

      • REPLICATE_IGNORE_DB

      • REPLICATE_DO_TABLE

      • REPLICATE_IGNORE_TABLE

      • REPLICATE_WILD_DO_TABLE

      • REPLICATE_WILD_IGNORE_TABLE

  • 示例1

    执行以下语句,可修改复制链路,只同步库TEST内的变更。

    CHANGE REPLICATION FILTER REPLICATE_DO_DB=(TEST);
  • 示例2

    1. TSO获取

      执行SHOW BINLOGS EVENTS语句获取对应binlog eventTSO,返回示例如下:

      image

      其中INFO列中以CTS:: 开头的数字串即为该event对应的TSO。

    2. 跳过TSO对应的event

      执行以下语句,可修改复制链路,跳过TSO:716669064683978758416977558623632834560000000000000000对应的binlog event,即上图中POS=372binlog event。

      CHANGE REPLICATION FILTER REPLICATE_SKIP_TSO='716669064683978758416977558623632834560000000000000000';

      更多内容请参见CHANGE REPLICATION FILTER

说明

更多信息,请参见CHANGE REPLICATION FILTER

启动主从复制链路

  • 语法

    START SLAVE [ channel_option ]
    
    channel_option:
        FOR CHANNEL channel
  • 示例1

    执行以下语句,可启动所有由CHANGE MASTER TO语句创建的主从复制链路。

    START SLAVE;
  • 示例2

    执行以下语句,可启动channel name为'TEST' 的主从复制链路。

    START SLAVE for channel 'TEST';
说明

更多信息,请参见START SLAVE

暂停主从复制链路

  • 语法

    STOP SLAVE [ channel_option ]
    
    channel_option:
        FOR CHANNEL channel
  • 示例1

    执行以下语句,可暂停所有由CHANGE MASTER TO语句创建的主从复制链路。

    STOP SLAVE;
  • 示例2

    执行以下语句,可暂停channel name为'TEST' 的主从复制链路。

    STOP SLAVE for channel 'TEST';
说明

更多信息,请参见STOP SLAVE

删除主从复制链路

重要

执行之前需要先停止数据复制进程。

  • 语法

    RESET SLAVE ALL [ channel_option ]
    
    channel_option:
        FOR CHANNEL channel
  • 示例1

    执行以下语句,可删除所有由CHANGE MASTER TO语句创建的主从复制链路。

    RESET SLAVE ALL;
  • 示例2

    执行以下语句,可删除channel name为'TEST' 的主从复制链路。

    RESET SLAVE ALL for channel 'TEST';
说明

更多信息,请参见RESET SLAVE ALL