MySQL

MySQL 主从同步故障排查

·6 分钟阅读·2190 字
📋 目录

一、先看判断主从是否正常(万能命令)

show slave status\G

只看 3 个字段:

  1. Slave_IO_Running: Yes/No
  2. Slave_SQL_Running: Yes/No
  3. Seconds_Behind_Master: 0/数字

只要有一个 No,就是同步失败!


二、主从故障两大分类(必背)

1. IO 线程挂掉(Slave_IO_Running = No)

原因:网络、权限、位置、binlog 不存在从库拿不到主库的 binlog

2. SQL 线程挂掉(Slave_SQL_Running = No)

原因:主从数据不一致、主键冲突、表不存在、DDL 冲突从库拿到了 binlog,但执行失败

口诀:IO 是连接问题,SQL 是数据/执行问题。


三、高频故障 1:IO 线程挂掉(最常见)

1. 主库 IP 变更/网络不通

  • 报错:error connecting to master
  • 排查:pingtelnet 端口、防火墙、安全组

2. 主从同步账号密码错/权限不足

  • 报错:access denied
  • 排查:主库授权账号是否存在
grant replication slave on *.* to 'user'@'%' identified by 'xxx';

3. 主库 binlog 被 purge 删除(从库要读的文件不存在)

  • 报错:could not find first log file name in binary log index
  • 解决:重新 change master 指向最新 binlog,或重做全量同步

4. 主库开启 GTID,从库没有开启

  • 报错:GTID mode is off
  • 解决:主从都要开启/关闭 gtid_mode=ON

5. 主库重启、重置 binlog

  • 从库位点丢失 → IO 线程挂

四、高频故障 2:SQL 线程挂掉(90% 开发/运维踩坑)

1. 主键冲突(Duplicate entry)

  • 原因:从库被手动写入数据,主库又插入相同 ID
  • 报错:Error 1062
  • 最常见!

2. 表不存在(Table doesn’t exist)

  • 原因:主库建表,从库没同步;或从库误删表

3. 从库执行了 DDL,主库又执行一遍

  • 报错:Table already exists

4. 大事务回滚/长事务导致同步卡住

  • 现象:Seconds_Behind_Master 一直涨
  • 原因:主库大事务,从库单线程回放慢

5. 主库执行了 drop database,从库库不存在

  • SQL 线程直接挂

五、高频故障 3:主从延迟(Seconds_Behind_Master > 0)

1. 从库配置太低(CPU/IO 差)

2. 大事务、慢 SQL 在从库执行

3. 从库是单线程 SQL 回放(MySQL 5.6 以前)

4. 从库被业务查询,压力大

5. 主库写入 TPS 太高,从库跟不上


六、高频故障 4:主从复制中断,误操作跳过错误

跳过 1 个错误(临时修复,不根治)

stop slave;
set global sql_slave_skip_counter = 1;
start slave;

GTID 模式跳过错误

stop slave;
set gtid_next = 'xxxxxx';
begin;commit;
set gtid_next = automatic;
start slave;

七、万能排查流程(面试必背,直接说这套)

1. 看状态

show slave status\G

2. 看错误

Last_IO_ErrorLast_SQL_Error

  • 有 connect/network/access → IO 故障
  • 有 1062/1146 等错误码 → SQL 故障

3. 定位原因

  • IO 挂:网络、权限、binlog 丢失
  • SQL 挂:数据不一致、从库写入、DDL 冲突

4. 修复

  • 临时:skip 跳错误
  • 根治:重新做主从全量同步

八、面试标准答案(直接存入 Obsidian)

tags: #MySQL #主从 #故障排查 #面试
题型:简答/实操
难度:中高级
题目:MySQL主从同步常见故障及排查思路?

精简答案:
1. 先通过 show slave status\G 判断 IO 和 SQL 线程状态。
2. IO 线程挂掉:网络不通、同步账号权限错、主库 binlog 被删除、位点不对。
3. SQL 线程挂掉:从库手动写入导致主键冲突、表不存在、DDL 执行冲突、数据不一致。
4. 主从延迟:大事务、从库性能低、从库压力大。
5. 排查顺序:看状态→看错误信息→区分IO/SQL故障→定位原因→修复。

易错点:从库写入数据是导致 SQL 线程挂掉的最主要原因。

你要我继续讲哪个?

  1. MySQL 主从一致性校验(pt-table-checksum)
  2. MySQL 主从切换实战步骤
  3. GTID 主从原理与故障
  4. MyCat 分库分表面试题

直接说 数字 我继续!

关联文档 -../MySQL 复制原理与配置 — 复制原理 -../MySQL 主从复制备份方式对比 — 备份方式

  • ../面试题/MySQL 日志与复制 — 面试题