什么是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 跳过事务。
相反,我们需要注入一个空事务。
步骤是:
- 找到需要跳过的交易的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 中 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