首页/数据/数据库速查/复制故障排查清单(从症状到根因)
主从复制与高可用53 条

复制故障排查清单(从症状到根因)

复制异常按清单推进:先看 SHOW REPLICA STATUS 两线程与错误码,再查网络/账号/位点/数据冲突,最后才是参数与性能。

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

复制排查清单是什么

复制异常容易越查越乱,按固定顺序推进最高效:先看 SHOW REPLICA STATUS 里 IO 与 SQL 两个线程谁不对、读 Last_IO_Error 与 Last_SQL_Error 的错误码,再查网络与复制账号,接着看位点与数据冲突,最后才讨论参数与性能。两个线程职责不同,定位方向也完全不同。

基本信息

核心命令SHOW REPLICA STATUS / performance_schema.replication_applier_status_by_worker
线程语义IO 线程负责拉日志,SQL 线程负责回放
常见错误码2003 连不上源、1236 日志被清、1062 主键冲突、1032 行不存在
必备信息复制的源主机、账号、位点或 GTID 集合
辅助手段错误日志、relay log 占用、SHOW PROCESSLIST

排查顺序

  • 看两个线程状态:先判断是拉不到日志还是回放失败
  • 读 Last_IO_Error 与 Last_SQL_Error:错误码直接定位方向
  • 查网络:从库到源端 3306 是否通、SSL 证书是否过期
  • 查账号:repl 账号密码、来源主机限制是否被改
  • 查位点:是否报 1236(源端日志已被清理)或位点漂移
  • 查数据:1062 与 1032 用一致性校验工具定位差异行
  • 查性能:relay 积压时看并行度、大事务与元数据锁

速诊命令

速诊命令
SHOW REPLICA STATUS\G     -- 重点看两个线程状态与 Last_*_Error
SELECT * FROM performance_schema.replication_applier_status_by_worker\G   -- 哪个 worker 卡住
SHOW PROCESSLIST;          -- 看回放线程当前执行的语句
SHOW VARIABLES LIKE 'replica_parallel_workers';   -- 并行回放度
SELECT @@GLOBAL.gtid_executed;                    -- GTID 环境记录当前进度
SHOW VARIABLES LIKE 'binlog_expire_logs_seconds'; -- 源端日志保留是否够长
-- GTID 环境不能用 sql_replica_skip_counter 跳过错误,需要按具体 GTID 注入空事务,操作前务必评估影响

症状到根因对照

症状可能根因下一步
IO 线程 Connecting / 报 2003网络不通、端口或防火墙、源端未启动从库执行 telnet 源端端口,检查账号来源限制
SQL 线程报 1062主键或唯一键冲突定位冲突行,确认是重复写入还是人为操作
SQL 线程报 1032回放时找不到对应行校验数据一致性,评估是否需重建从库
报 1236源端 binlog 已被清理扩大日志保留或用备份重建从库
Seconds_Behind_Source 持续增长大事务、并行度不足、从库 IO 慢查正在执行的事务与 relay log 增长速度
每次处理完把「症状到根因到动作」记入运维日志,复制问题高度重复。
跳过错误是权宜手段而不是修复:1062 与 1032 往往意味着数据已经不一致,跳过后必须做校验与补偿,否则后续查询会读到错误结果。

易错点

  • 只看到复制中断就重启复制,不读错误码,问题反复出现
  • 用跳过 N 个事务的方式绕过 1062,跳掉的事务包含业务写入,数据从此不一致
  • 源端日志保留过短,从库断连稍久就必须整库重建
  • 并行回放度设置不合理(单线程大事务),从库延迟长期无法收敛
  • 没有记录故障与处理过程,同类问题下次还得从头查

数据来源与参考

  • MySQL 8.0 Reference Manual: Replication Troubleshooting

相关工具

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