MySQL 基于 GTID 主从复制:跳过异常事务的正确姿势
版本说明
本文基于 MySQL 5.7/8.0 的 GTID 复制模式(gtid_mode=ON)验证,8.0 上命令语法未变。
# 1. 现象:主从复制因某条事务报错中断
开启了 GTID 复制的主从架构里,如果从库执行某个 GTID 事务时报错(比如主库上手动改过数据、从库唯一约束冲突、DDL 与业务写入冲突等),复制线程会直接停在这个事务上,show slave status\G 里能看到 Slave_SQL_Running: No 且 Last_Error 有具体报错信息,之后所有新的 binlog 事件都会被卡住,无法继续同步。
传统的基于文件位置(file:pos)复制可以用 sql_slave_skip_counter 跳过指定条数的事件;但 GTID 模式下这个命令不可用,必须用 GTID 专属的跳过方式——这也是排查 GTID 复制故障时最容易卡壳的地方。
# 2. 定位:确认卡在哪个 GTID
先在从库确认当前复制状态和报错:
mysql> show slave status\G
重点看 Retrieved_Gtid_Set(从库已经收到的 GTID 范围)和 Executed_Gtid_Set(已成功执行的 GTID 范围)——两者之间缺的那一段,就是卡住的事务。同时 Last_SQL_Error 会给出具体是哪条 SQL 报的什么错。
如果需要进一步确认这个事务在主库上的具体内容,可以在主库上按 binlog 文件和位置查看:
mysql> show binlog events in 'mysql-bin.000022' from 1814 limit 2\G
为什么要先看这一步而不是直接跳过:跳过 GTID 本质是"放弃同步这条变更",从库数据会因此和主库产生差异。生产环境操作前必须先确认这条事务到底改了什么、跳过之后数据差异是否可接受——如果差异不可接受,正确做法是手动在从库上补齐对应的数据变更,而不是简单跳过。
# 3. 跳过流程:五步
第一步,停止从库复制(跳过操作必须在复制线程停止的状态下进行):
mysql> STOP SLAVE;
第二步,在当前 session 里显式指定要跳过的 GTID:
mysql> SET @@SESSION.GTID_NEXT = 'a47892ad-e207-11e9-bd0d-5254003519fe:185';
GTID_NEXT 告诉 MySQL"下一个要执行的事务用这个 GTID 标识"——正常情况下这个值是自动生成的,这里手动指定,是为了让接下来的空事务顶替掉这个 GTID 的位置。
第三步,提交一个空事务,"用掉"这个 GTID:
mysql> BEGIN;
mysql> COMMIT;
2
这个空事务本身不做任何数据变更,但它会被记录为已经执行过的 GTID a47892ad-...:185——相当于告诉复制系统"这个事务已经处理完了,不用再重放"。
第四步,把 session 恢复成自动生成 GTID 的模式:
mysql> SET SESSION GTID_NEXT = AUTOMATIC;
不恢复这一步,当前 session 后续所有操作都会尝试复用同一个 GTID,导致新的报错。
第五步,重新启动复制:
mysql> START SLAVE;
# 4. 验证
mysql> show slave status\G
确认 Slave_IO_Running 和 Slave_SQL_Running 都变回 Yes,且 Seconds_Behind_Master 开始正常追赶(不再停滞或报错)。如果后续又跳到下一个 GTID 报错,说明这批变更里有连续多个冲突事务,需要重复本流程或考虑更彻底的数据核对。
# 5. 坑
- 跳过 GTID 会造成主从数据不一致——这是"止血"手段,不是"治病"。跳过之后强烈建议用
pt-table-checksum之类工具核对主从数据差异,必要时手动补数据。 - 如果同一批次有连续多个 GTID 都需要跳过,可以用一个 GTID 范围一次性指定(
GTID_NEXT只接受单个 GTID,连续多个需要循环执行本流程,或使用sql_slave_skip_counter的 GTID 等价方案批量处理)。 - 跳过前一定要先看清楚
Last_SQL_Error的报错原因——如果是主库误操作导致的持续性问题(比如某张表结构一直不一致),单纯跳过治标不治本,后面还会反复卡住同一类事务,需要从根源修复。
# 6. 可复用要点
- GTID 模式下跳过异常事务不能用传统的
sql_slave_skip_counter,必须走"设置GTID_NEXT+ 提交空事务"这套流程。 - 跳过前先确认这条事务改了什么、数据差异是否可接受,跳过是有代价的操作,不是无损修复。
- 跳过后务必核对主从数据一致性,必要时用工具做全量校验并补数据。
- 01
- Nginx 运维知识地图:从配置基础到反向代理实战 原创07-29
- 02
- MySQL 运维知识地图:从入门配置到高可用排障 原创07-29