1. 复制中断日志的识别要点
1.1 观察复制线程状态与错误信息
在 MySQL 从服务器上,第一步是确认两条复制线程的状态。Slave_IO_Running 与 Slave_SQL_Running 二者不可同时为 No,否则复制已中断。通过 SHOW SLAVE STATUS\G 可以看到两条线程的当前状态、最近的错误信息,以及事件位置。
关键字段包括 Last_IO_Errno、Last_IO_Error、Last_SQL_Errno、Last_SQL_Error。这些字段直接指向导致中断的错误源。
SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 120
Relay_Log_File: relay-log.000001
Relay_Log_Pos: 230
Relay_Master_Log_File: mysql-bin.000001
定位要点:若 Slave_IO_Running 为 Yes,但 Slave_SQL_Running 为 No,通常表示 SQL 应用阶段遇到错误,需要查看 Last_SQL_Error 和相关事件日志。
1.2 查看错误日志入口与时间线
除了从服务器的状态输出,错误日志 是定位中断根因的关键入口。Mysqld 错误日志通常位于 /var/log/mysql/error.log 或 /var/lib/mysql/hostname.err,具体路径取决于部署方式。
日志入口记录了事件发生的时间、涉及的帐号、以及重试策略等信息。结合日志时间线可以更快推断出是网络、认证还是数据异常导致中断。
# 查看错误日志最近条目
tail -n 200 /var/log/mysql/error.log
2. 复制日志的核心类型与作用
2.1 二进制日志与中继日志的关系
在主从复制中,二进制日志(binlog)承载了所有写操作的原始事件;
从服务器维护的 中继日志(relay log)记录从主服务器读取的事件及其应用到从服务器的过程。理解这两者的关系,是诊断复制中断的核心。
SHOW MASTER STATUS; -- 主库当前 binlog 文件及位置
SHOW SLAVE STATUS\G; -- 从库当前 relay 日志与应用进度
通常在 Read_Master_Log_Pos 或 Exec_Master_Log_Pos 等字段暴露从主端读取到的日志位置,帮助对照 binlog 进度。
2.2 日志在故障排查中的定位作用
通过对 mysqlbinlog 的查看,可以从 binlog 中提取具体的事件,判断是否有跳过、回滚、DDL 变更等操作导致的冲突。
mysqlbinlog --start-datetime="2025-01-01 00:00:00" /var/log/mysql/mysql-bin.000001 | head
从服务器的 relay-log 和 relay-master-log-file 字段也能帮助定位事件源头。若中断发生在应用阶段,Slave_SQL_Running 的状态往往是 No,并伴随 Last_SQL_Error 的具体信息。
3. 常见问题的日志解读要点与命令
3.1 常见错误码与日志字段解读
常见情况包括网络中断、认证失效、主从日志位置错位等。Net/IO 相关错误通常体现在 Last_IO_Error;

若错误来自 SQL 阶段,Last_SQL_Error 将给出具体 sql 错误信息,配合 SHOW WARNINGS 可看到执行队列的最后警告。
-- 查看从库状态
SHOW SLAVE STATUS\G
-- 查看主库状态
SHOW MASTER STATUS\G
通过对比 Master_Log_File、Read_Master_Log_Pos 与 Master 的 Binary Log File 及 Position,可以快速确认是否位点错位导致中断。
3.2 常用诊断命令与示例
诊断通常从快速判断线程是否在跑开始,随后定位具体错误来源。SHOW SLAVE STATUS\G 提供最直接的线索。
-- 从库状态示例输出(简化)
Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_SQL_Error: Error executing query: '....'
在诊断中,mysqlbinlog 是强有力的工具,用于审阅 binlog 的具体事件;同时,error.log 帮助确认是否存在权限、网络或系统层面的异常。
4. 故障排查的思路与流程
4.1 快速初筛:线程状态与网络/认证
首要目标是确定两条复制线程的运行状态。Slave_IO_Running 与 Slave_SQL_Running 的值决定了后续方向;若有异常,先查看 Last_IO_Error 与 Last_SQL_Error。
同时,网络连通性与认证配置也是常见的中断原因。Master_user、Master_password 的正确性以及防火墙策略需要在此阶段确认。
-- 修改主从配置(示例)
CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl', MASTER_PASSWORD='s3cret', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=120;
4.2 逐步定位与恢复步骤
若发现点位错位,可以通过 SHOW MASTER STATUS 得到主库当前日志文件及位置,然后在从库执行 CHANGE MASTER TO 修正后重启复制。
STOP SLAVE;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=150;
START SLAVE;
在处理大量数据时,有时需要对特定时间点进行点对点对比,使用 mysqlbinlog 以时间范围过滤事件也是常用手段。
5. 典型排错案例演练
5.1 案例:从库遇到 SQL 错误导致中断
当从库的 Slave_SQL_Running 为 No,且 Last_SQL_Error 有具体报错时,通常是 SQL 应用阶段的冲突。此时应先查看 SHOW SLAVE STATUS,定位错误行,并在主从数据上进行对照。
SHOW SLAVE STATUS\G
-- 看到 Last_SQL_Error: Error executing statement...
解决思路示例:如果错误因为重复的唯一键或冲突的外键约束,则需要调整应用逻辑或对数据进行修复后再重新执行恢复流程。
5.2 案例:日志位点错位导致重放失败
若 Master_Log_File 与 Read_Master_Log_Pos 落后于主库当前进度,需修正至正确的点位。通过 SHOW MASTER STATUS 获取主库状态并在从库执行 CHANGE MASTER TO 与 START SLAVE。
SHOW MASTER STATUS;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=405;
START SLAVE;


