首页/数据/数据库速查/复制跳错事务(GTID 与其他方式)
主从复制与高可用53 条

复制跳错事务(GTID 与其他方式)

跳过事务是危险但必要的能力:GTID 模式用空事务占位(SET GTID_NEXT + BEGIN/COMMIT),非 GTID 用 sql_replica_skip_counter(8.0.23+ 名),跳过要限一次一事务。

数据库速查数据更新于 2026-10-13

跳过事务是什么

复制中断时,跳过报错事务是危险但必要的能力。GTID 模式下的做法是造一个空事务占位:把下一个待执行事务的 GTID 赋给 GTID_NEXT,然后执行一个空的 BEGIN 与 COMMIT,让从库「假装已经执行过」。非 GTID 模式使用 sql_replica_skip_counter(8.0.23 之前叫 sql_slave_skip_counter),它一次跳过的事件数并不确定,因此必须一次只跳一个、逐步推进。

基本信息

GTID 模式SET GTID_NEXT 后执行空事务占位
非 GTID 模式SET GLOBAL sql_replica_skip_counter = 1
作用范围需要先单独停止 SQL 线程
操作原则一次只跳一个事务,跳完立刻核对
记录要求写下事务号、原因与后续补偿动作

典型使用场景

  • 从库因唯一键冲突导致复制中断
  • 主库执行了涉及从库不存在对象的操作
  • DDL 在从库上重复执行报错
  • 临时恢复复制链路,先让业务可用
  • 演练中验证跳错流程与记录的完整性

两种跳过方式

两种跳过方式
-- GTID 模式
STOP REPLICA SQL_THREAD;
-- 从 Last_SQL_Error 附近找到下一个待执行的 GTID
SET GTID_NEXT = '3a7f1e3b-1111-2222-3333-444455556666:4711';
BEGIN;
COMMIT;
SET GTID_NEXT = 'AUTOMATIC';
START REPLICA SQL_THREAD;

-- 非 GTID 模式(一次跳一个)
STOP REPLICA SQL_THREAD;
SET GLOBAL sql_replica_skip_counter = 1;
START REPLICA SQL_THREAD;

方式与风险

方式适用与风险注意事项
GTID_NEXT 空事务GTID 模式下的标准做法填错 GTID 会把后续事务也一起跳过
skip_counter非 GTID 模式一次跳过的实际事件数并不确定
STOP SQL_THREAD两种方式的前置动作只停 IO 线程无法完成跳过
记录事务号事后核对与补偿不记录就无法判断影响范围
重放校验跳过之后的必做动作跳过即意味着接受不一致
跳过事务等于接受主从数据不一致:必须记录事务号、原因与后续补偿动作,并在业务低峰核对受影响的数据,否则差异会长期留在系统里。
GTID 模式下 skip_counter 被禁用,用了会直接报错。不要两种方式混着用,先确认实例到底运行在哪种模式下再动手。
被跳过的 GTID 在从库是永久缺失的:如果该从库将来被提升为主,这部分数据必须从旧主单独核对并补齐,否则丢失会一直传递下去。

易错点

  • 在 GTID 模式下使用 skip_counter:命令被拒绝,白白折腾一轮
  • 一次跳过多个事务:影响面扩大,事后核对极其困难
  • 不记录被跳过的事务号:事后根本不知道跳过了什么
  • 跳过后不做数据核对:差异长期潜伏,切换时才集中爆发

数据来源与参考

  • MySQL 8.0 Reference Manual: Skipping Transactions
  • MySQL 8.0 Reference Manual: GTID_NEXT

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌