MySQL 主从同步故障排查
1. 先看判断主从是否正常(万能命令)
show slave status\G
只看 3 个字段:
- Slave_IO_Running: Yes/No
- Slave_SQL_Running: Yes/No
- Seconds_Behind_Master: 0/数字 只要有一个 No,就是同步失败!
2. 主从故障两大分类(必背)
3. IO 线程挂掉(Slave_IO_Running = No)
原因:网络、权限、位置、binlog 不存在→ 从库拿不到主库的 binlog
4. SQL 线程挂掉(Slave_SQL_Running = No)
原因:主从数据不一致、主键冲突、表不存在、DDL 冲突→ 从库拿到了 binlog,但执行失败
口诀:IO 是连接问题,SQL 是数据/执行问题。
5. 高频故障 1:IO 线程挂掉(最常见)
6. 主库 IP 变更/网络不通
- 报错:
error connecting to master - 排查:
ping、telnet 端口、防火墙、安全组
7. 主从同步账号密码错/权限不足
- 报错:
access denied - 排查:主库授权账号是否存在
grant replication slave on *.* to 'user'@'%' identified by 'xxx';
8. 主库 binlog 被 purge 删除(从库要读的文件不存在)
- 报错:
could not find first log file name in binary log index - 解决:重新 change master 指向最新 binlog,或重做全量同步
9. 主库开启 GTID,从库没有开启
- 报错:
GTID mode is off - 解决:主从都要开启/关闭 gtid_mode=ON
10. 主库重启、重置 binlog
- 从库位点丢失 → IO 线程挂
11. 高频故障 2:SQL 线程挂掉(90% 开发/运维踩坑)
12. 主键冲突(Duplicate entry)
- 原因:从库被手动写入数据,主库又插入相同 ID
- 报错:
Error 1062 - 最常见!
13. 表不存在(Table doesn’t exist)
- 原因:主库建表,从库没同步;或从库误删表
14. 从库执行了 DDL,主库又执行一遍
- 报错:
Table already exists
15. 大事务回滚/长事务导致同步卡住
- 现象:Seconds_Behind_Master 一直涨
- 原因:主库大事务,从库单线程回放慢
16. 主库执行了 drop database,从库库不存在
- SQL 线程直接挂
17. 高频故障 3:主从延迟(Seconds_Behind_Master > 0)
18. 从库配置太低(CPU/IO 差)
19. 大事务、慢 SQL 在从库执行
20. 从库是单线程 SQL 回放(MySQL 5.6 以前)
21. 从库被业务查询,压力大
22. 主库写入 TPS 太高,从库跟不上
23. 高频故障 4:主从复制中断,误操作跳过错误
24. 跳过 1 个错误(临时修复,不根治)
stop slave;
set global sql_slave_skip_counter = 1;
start slave;
25. GTID 模式跳过错误
stop slave;
set gtid_next = 'xxxxxx';
begin;commit;
set gtid_next = automatic;
start slave;
26. 万能排查流程(面试必背,直接说这套)
27. 看状态
show slave status\G
28. 看错误
看 Last_IO_Error、Last_SQL_Error
- 有 connect/network/access → IO 故障
- 有 1062/1146 等错误码 → SQL 故障
29. 定位原因
- IO 挂:网络、权限、binlog 丢失
- SQL 挂:数据不一致、从库写入、DDL 冲突
30. 修复
- 临时:skip 跳错误
- 根治:重新做主从全量同步
31. 面试标准答案(直接存入 Obsidian)
tags: #MySQL #主从 #故障排查 #面试
题型:简答/实操
难度:中高级
题目:MySQL主从同步常见故障及排查思路?
精简答案:
1. 先通过 show slave status\G 判断 IO 和 SQL 线程状态。
2. IO 线程挂掉:网络不通、同步账号权限错、主库 binlog 被删除、位点不对。
3. SQL 线程挂掉:从库手动写入导致主键冲突、表不存在、DDL 执行冲突、数据不一致。
4. 主从延迟:大事务、从库性能低、从库压力大。
5. 排查顺序:看状态→看错误信息→区分IO/SQL故障→定位原因→修复。
易错点:从库写入数据是导致 SQL 线程挂掉的最主要原因。
32. 你要我继续讲哪个?
- MySQL 主从一致性校验(pt-table-checksum)
- MySQL 主从切换实战步骤
- GTID 主从原理与故障
- MyCat 分库分表面试题 直接说 数字 我继续!
关联文档 -MySQL 复制原理与配置:复制原理 -MySQL 主从复制备份方式对比:备份方式
- MySQL 日志与复制:面试题
