MySQL 5.7.3+启用GTID后sql_slave_skip_counter被禁用,必须通过SET GTID_NEXT+空事务跳过指定GTID;操作前需确认gtid_mode=ON、定位出错GTID、停复制、执行空事务、重置GTID_NEXT并重启同步,之后须人工核验数据一致性。

主从同步报错 1062 或 1032 时,为什么不能直接用 SET GLOBAL sql_slave_skip_counter = 1
MySQL 5.7.3 之后默认启用了 gtid_mode=ON,此时 sql_slave_skip_counter 已被禁用,强行执行会报错 ERROR 1791 (HY000): Variable 'sql_slave_skip_counter' is a read-only variable。跳过错误必须基于 GTID,而不是靠“跳过一条事件”这种老方式。
实操建议:
- 先确认是否启用 GTID:
SHOW VARIABLES LIKE 'gtid_mode';,输出ON就必须走 GTID 跳过流程 - 查当前从库卡在哪个事务:
SHOW SLAVE STATUS\G,重点关注Retrieved_Gtid_Set和Executed_Gtid_Set的差异 - 不要试图用
RESET SLAVE清空再重配——容易丢 GTID 连续性,导致后续无法跳过
用 mysqlbinlog 找出出错事务的 GTID 值
核心是定位那个让 SQL 线程停住的 binlog 事件对应的 GTID,不是看错误日志里的语句,而是看从库 relay log 中实际执行到的位置。
实操建议:
- 从
SHOW SLAVE STATUS\G中拿到Relay_Master_Log_File和Exec_Master_Log_Pos - 登录主库(或从库已有的 binlog 文件),用
mysqlbinlog --base64-output=decode-rows -v /path/to/mysql-bin.0000xx | grep -A 5 -B 5 "your_error_keyword"快速筛,但更稳的方式是解析出 GTID: -
mysqlbinlog --base64-output=decode-rows -v mysql-bin.0000xx | grep -E "^#.*GTID.*uuid" | head -n 20,结合Exec_Master_Log_Pos向前/向后翻几条,确认出错事务的完整 GTID(格式如3e11fa47-71ca-11e1-9e33-c80aa9429562:23) - 注意:relay log 是从库自己生成的,若未开启
relay_log_info_repository = TABLE,Relay_Master_Log_File指向的是主库的 binlog 名,要到主库查对应文件
用 SET GTID_NEXT + 空事务跳过指定 GTID
这不是“忽略错误”,而是让从库假装自己已经执行过那个出问题的 GTID,从而让 GTID 集合向前推进,SQL 线程得以继续。本质是修补 GTID 执行序列的断点。
实操建议:
- 停止同步:
STOP SLAVE; - 设置单次 GTID:
SET GTID_NEXT = '3e11fa47-71ca-11e1-9e33-c80aa9429562:23';(填你上一步找到的 GTID) - 执行空事务:
BEGIN; COMMIT; - 重置 GTID_NEXT 回自动模式:
SET GTID_NEXT = 'AUTOMATIC'; - 重启同步:
START SLAVE; - 验证:
SHOW SLAVE STATUS\G中Seconds_Behind_Master开始下降,且Executed_Gtid_Set包含刚跳过的 GTID
跳过之后还要检查什么
跳过只是让同步跑起来,不代表数据一致。尤其 1032(找不到行)和 1062(重复键)往往意味着主从数据已出现偏差,跳过只是掩盖问题。
实操建议:
- 检查跳过的事务是否涉及关键业务表,比如订单、用户余额——这类必须人工核对,不能只信同步状态
- 确认从库是否开启了
read_only=ON,避免误写入干扰 GTID 序列 - 如果频繁出现同类错误,大概率是主库有
binlog_format=STATEMENT下的非确定性函数(如NOW()、UUID()),或应用直连从库写了数据 - 别依赖单次跳过解决长期问题;真正该修的是 binlog 格式、应用写法,或者加
replicate-ignore-db这类过滤规则
GTID 跳过看着就三步,但前提是 GTID 链路没断、relay log 没被 purge、出错事务没跨多个 GTID。这些细节一漏,SET GTID_NEXT 就会直接让从库拒绝启动同步。










