复制排查清单是什么
复制异常容易越查越乱,按固定顺序推进最高效:先看 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 往往意味着数据已经不一致,跳过后必须做校验与补偿,否则后续查询会读到错误结果。