mysql主从复制中slave不同步怎么办_mysql异常排查

来源:这里教程网 时间:2026-02-28 20:46:29 作者:

检查
SHOW SLAVE STATUS
中关键字段是否异常

主从不同步的第一反应不是重启,而是看状态。执行

SHOW SLAVE STATUS\G
后重点关注这几个字段:

Slave_IO_Running
Slave_SQL_Running
必须都是
Yes
,任一为
No
表示复制线程已停
Seconds_Behind_Master
NULL
通常意味着 SQL 线程没在运行(不是延迟大)
SQL_Delay
非零说明人为设置了延迟复制,不是故障
Last_IO_Error
Last_SQL_Error
会直接告诉你卡在哪条语句、什么错误(比如主键冲突、表不存在)

常见
Last_SQL_Error
类型及修复方式

SQL 线程报错是最常见的同步中断原因,不同错误要区别对待:

主键/唯一键冲突(
Duplicate entry 'xxx' for key 'PRIMARY'
):可能是从库被误写,或主库 binlog 格式为
STATEMENT
时函数不安全。临时跳过可用
SET GLOBAL sql_slave_skip_counter = 1
(仅限
ROW
格式下谨慎使用),但更推荐先查清从库多出了什么数据,再人工清理或补主库缺失变更
表不存在(
Table 'db.t' doesn't exist
):主库执行了
DROP TABLE
,但从库该表已被手动删过或未同步建表语句。检查主库 binlog 确认操作历史,必要时重放建表语句或重建从库
列数不匹配(
Column count doesn't match value count
):大概率是主从表结构不一致,用
DESCRIBE db.t
逐字段比对,注意默认值、是否允许 NULL、字符集差异

确认主从 binlog 位置是否真的脱节

有时

Seconds_Behind_Master
显示很大,但实际只是 IO 线程拉取慢,SQL 线程仍在追。需交叉验证:

在主库查
SHOW MASTER STATUS
,记下
File
Position
在从库查
SHOW SLAVE STATUS
,对比
Master_Log_File
Read_Master_Log_Pos
(IO 线程读到哪)以及
Relay_Master_Log_File
Exec_Master_Log_Pos
(SQL 线程执行到哪)
Read_Master_Log_Pos
远落后于主库
Position
,说明网络或主库写压力大导致 IO 拉取慢;若
Exec_Master_Log_Pos
落后但
Read_Master_Log_Pos
接近,则是 SQL 线程执行慢(如大事务、磁盘 I/O 差、从库负载高)

跳过错误或重置复制前必须确认的三件事

不要一看到

SQL_THREAD
停就急着
START SLAVE
或跳过错误:

确认主库 binlog 没被
PURGE
过——如果从库还没读的 binlog 已被主库清理,强行跳过只会让数据永久不一致
确认从库没有被业务直连写入——任何在从库执行的
INSERT/UPDATE/DELETE
都可能破坏复制逻辑
确认 GTID 模式是否开启(
gtid_mode = ON
)——开启后不能用
sql_slave_skip_counter
,必须用
SET GTID_NEXT='xxx'; BEGIN; COMMIT;
注入空事务来跳过

真正难处理的是主从数据逻辑不一致但复制线程又没报错的情况,这时候光看状态没用,得靠工具如

pt-table-checksum
对比行级数据。

相关推荐