广告

MySQL 主从复制中断日志怎么看?复制日志解读与故障排查思路

1. 复制中断日志的识别要点

1.1 观察复制线程状态与错误信息

在 MySQL 从服务器上,第一步是确认两条复制线程的状态。Slave_IO_RunningSlave_SQL_Running 二者不可同时为 No,否则复制已中断。通过 SHOW SLAVE STATUS\G 可以看到两条线程的当前状态、最近的错误信息,以及事件位置。

关键字段包括 Last_IO_ErrnoLast_IO_ErrorLast_SQL_ErrnoLast_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_PosExec_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-logrelay-master-log-file 字段也能帮助定位事件源头。若中断发生在应用阶段,Slave_SQL_Running 的状态往往是 No,并伴随 Last_SQL_Error 的具体信息。

3. 常见问题的日志解读要点与命令

3.1 常见错误码与日志字段解读

常见情况包括网络中断、认证失效、主从日志位置错位等。Net/IO 相关错误通常体现在 Last_IO_Error

MySQL 主从复制中断日志怎么看?复制日志解读与故障排查思路

若错误来自 SQL 阶段,Last_SQL_Error 将给出具体 sql 错误信息,配合 SHOW WARNINGS 可看到执行队列的最后警告。

-- 查看从库状态
SHOW SLAVE STATUS\G
-- 查看主库状态
SHOW MASTER STATUS\G

通过对比 Master_Log_FileRead_Master_Log_Pos 与 Master 的 Binary Log FilePosition,可以快速确认是否位点错位导致中断。

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_RunningSlave_SQL_Running 的值决定了后续方向;若有异常,先查看 Last_IO_ErrorLast_SQL_Error

同时,网络连通性与认证配置也是常见的中断原因。Master_userMaster_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 TOSTART SLAVE

SHOW MASTER STATUS;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=405;
START SLAVE;

广告

数据库标签