启用 GTID 时如何跳过 MySQL 复制从属服务器上的事务

什么是GTID

全局事务标识符 (GTID) 是在源服务器(主服务器)上创建并与提交的每个事务相关联的唯一标识符。
此标识符是唯一的,不仅对于它起源的服务器,而且对于给定复制设置中的所有服务器也是唯一的。
所有事务和所有 GTID 之间存在一对一的映射。

GTID 表示为一对坐标,以冒号 (:) 分隔:

GTID = source_id:transaction_id

source_id 选项标识原始服务器。
通常,服务器的 server_uuid 选项用于此目的。
transaction_id 选项是由事务在此服务器上提交的顺序确定的序列号。
例如,要提交的第一个事务的 transaction_id 为 1,要在同一源服务器上提交的第十个事务分配的 transaction_id 为 10.

on  It Road.com

启用 GTID 时跳过事务

当“gtid_mode = ON”时,我们不能使用 sql_slave_skip_counter 跳过事务。
相反,我们需要注入一个空事务。
步骤是:

  1. 找到需要跳过的交易的GTID。
    最好的方法是使用mysqlbinlog在复制停止的点读取master的二进制日志。
    例如,如果 SHOW SLAVE STATUS 显示:
Relay_Master_Log_File: binlog.000010
...
          Exec_Master_Log_Pos: 194

然后将 mysqlbinlog(在复制主节点上)与该文件和位置一起使用:

$ mysqlbinlog --start-position=194 binlog.000010

并查找“SET @@SESSION.GTID_NEXT”语句,例如:

# at 194
#180710  9:47:54 server id 572238408  end_log_pos 259 CRC32 0x83a04322  GTID    last_committed=0        sequence_number=1       rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= '4ab8feff-5272-11e8-9320-08002715584a:201840'/*!*/;

大多数情况下,“SET @@SESSION.GTID_NEXT”中的 GTID 将是复制主服务器 UUID 的“SHOW SLAVE STATUS”输出中 Executed_Gtid_Set 中显示的值的下一个值,但不能保证是这种情况.

  1. 跳过 1 中 SET @@SESSION.GTID_NEXT 语句中带有 GTID 的事务。
    (假设要跳过的 GTID 是 '4ab8feff-5272-11e8-9320-08002715584a:201840'):
mysql> SET @@SESSION.GTID_NEXT= '4ab8feff-5272-11e8-9320-08002715584a:201840';
Query OK, 0 rows affected (0.04 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GTID_NEXT='AUTOMATIC';
Query OK, 0 rows affected (0.00 sec)

请注意,我们可以简单地从 mysqlbinlog 输出中复制 SET @@SESSION.GTID_NEXT 语句。

日期:2020-09-17 00:11:50 来源:oir作者:oir