在mysql运维过程中,主从复制是最常用的高可用与读写分离方案之一。但当网络抖动、数据冲突或误操作发生时,从库很容易出现复制错误,导致同步中断。了解mysql如何排查主从复制错误,是每一位后端和数据库工程师的必备技能。

一、查看从库复制状态
最直接的方式是在从库执行如下命令,观察关键字段:
SHOW SLAVE STATUSG
重点关注以下指标:
- Slave_IO_Running:负责从主库拉取binlog,若为No说明连接或读取异常。
- Slave_SQL_Running:负责在从库回放事件,若为No说明执行报错。
- Last_Error / Last_SQL_Error:记录SQL线程停止的具体原因。
- Retrieved_Gtid_Set / Executed_Gtid_Set:GTID模式下可对比差异。
二、常见复制错误与排查技巧
1. 主键或唯一键冲突
报错通常包含Duplicate entry。这类问题多因从库被直接写入造成。排查时可先暂停复制,对比主从数据。
2. 表结构不一致
若主库执行了DDL而从库未同步,会出现Unknown column等错误。应确保DDL通过复制通道下发,避免手动改从库表结构。
3. 二进制日志格式问题
使用STATEMENT格式时,某些函数(如UUID())可能导致数据不一致。可检查binlog_format参数,必要时改为ROW格式。
三、使用跳过事务恢复同步
确认某条事务可安全跳过时,可使用以下方式恢复:
STOP SLAVE; SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;
若是GTID模式,则应在会话中指定跳过的事务编号:
STOP SLAVE; SET GTID_NEXT = 'uuid:transaction_id'; BEGIN; COMMIT; SET GTID_NEXT = 'AUTOMATIC'; START SLAVE;
四、通过错误日志与relay log辅助分析
从库的错误日志会记录复制线程的详细异常。此外,可使用mysqlbinlog工具解析relay log,定位出错事件:
mysqlbinlog --verbose relay-log.000123 > /tmp/relay.txt
| 排查手段 | 适用场景 |
|---|---|
| SHOW SLAVE STATUS | 快速确认线程状态与错误摘要 |
| 错误日志 | 获取线程级详细堆栈信息 |
| relay log解析 | 精确查看执行失败的SQL事件 |
五、预防建议
规范从库权限,禁止业务直连从库写入;统一主从参数与版本;开启GTID便于定位与跳过事务。掌握上述mysql复制错误排查技巧,能显著提升故障恢复效率。