6.4.6 中继日志与复制链路诊断

中继日志(relay log)是从库接收主库 binlog 后的本地缓存,用于 SQL 线程重放变更,解耦 IO 线程与 SQL 线程,提高复制吞吐;同时是诊断复制链路的关键观测点。

文章图片

关键文件与线程
- 主库:binlog(变更来源),dump 线程向从库发送事件。
- 从库:IO 线程写入 relay log,SQL 线程读取并执行;master.info/relay-log.info 记录位点与进度。
- 常见命名relay-log.000xxx,索引文件 relay-log.index

核心指标与状态(含命令解释)

-- 查看复制状态:重点关注线程状态、延迟、位点与错误
SHOW SLAVE STATUS\G

-- 关键字段含义速记
-- Slave_IO_Running / Slave_SQL_Running: 线程是否健康
-- Seconds_Behind_Master: 延迟秒数(受大事务与并行复制影响)
-- Relay_Log_File / Relay_Log_Pos: relay log 执行位置
-- Master_Log_File / Read_Master_Log_Pos / Exec_Master_Log_Pos: 读取与执行进度
-- Last_IO_Error / Last_SQL_Error: 具体失败原因

中继日志解析示例

# 1) 确认 relay log 文件路径(从库)
mysql -uroot -p -e "SHOW VARIABLES LIKE 'relay_log%';"

# 2) 解析指定位置的 relay log,定位出错事件
# --start-position 以 Relay_Log_Pos 为依据
mysqlbinlog --start-position=125460 /data/mysql/relay-log.000123 | head -n 50

# 3) 如果需定位某个 GTID 或时间段
mysqlbinlog --include-gtids='3E11FA47-71CA-11E1-9E33-C80AA9429562:23' \
  /data/mysql/relay-log.000123 | less

常见故障与排错流程(带命令)
1. IO 线程停止(连接或权限问题)

SHOW SLAVE STATUS\G
-- 关注:Slave_IO_Running=No, Last_IO_Error
# 网络连通性(从库执行)
ping -c 3 10.0.0.10
telnet 10.0.0.10 3306
-- 主库确认复制账号权限(主库执行)
SHOW GRANTS FOR 'repl'@'10.%';
-- 需具备 REPLICATION SLAVE 权限
  1. SQL 线程停止(数据冲突/DDL 冲突)
SHOW SLAVE STATUS\G
-- 关注:Slave_SQL_Running=No, Last_SQL_Error
# 定位错误事件
mysqlbinlog --start-position=289000 /data/mysql/relay-log.000123 | tail -n 80
-- 临时跳过一条(谨慎)
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
  1. 复制延迟
SHOW SLAVE STATUS\G
-- Seconds_Behind_Master 持续增长,且 Relay_Log_Space 过大
-- 查看并行复制是否开启
SHOW VARIABLES LIKE 'slave_parallel_workers';
-- 示例:设置并行复制(8 线程)
SET GLOBAL slave_parallel_workers=8;
  1. 中继日志损坏
SHOW SLAVE STATUS\G
-- Last_SQL_Error: relay log read failure
-- 重新拉取中继日志(风险:需确认数据一致)
STOP SLAVE;
RESET SLAVE;   -- 会删除 relay log 并重置位置
START SLAVE;

安装/配置示例(开启中继日志与定位文件)

# /etc/my.cnf (从库)
[mysqld]
server_id=2
relay_log=/data/mysql/relay-log
relay_log_index=/data/mysql/relay-log.index
log_slave_updates=ON
read_only=ON
# 重启 MySQL(以 systemd 为例)
systemctl restart mysqld

修复与恢复操作示例

-- 快速重试复制
STOP SLAVE;
START SLAVE;

-- 若需重建从库(示意流程)
-- 1) 从主库备份
-- 2) 从库恢复
-- 3) 重新配置主从
CHANGE MASTER TO
  MASTER_HOST='10.0.0.10',
  MASTER_USER='repl',
  MASTER_PASSWORD='Repl@123',
  MASTER_LOG_FILE='mysql-bin.000456',
  MASTER_LOG_POS=123456;
START SLAVE;

练习题(含预期)
1. 练习:制造延迟并观察 relay log

-- 主库执行:创建大事务
CREATE DATABASE IF NOT EXISTS repltest;
USE repltest;
CREATE TABLE t1(id INT PRIMARY KEY, v VARCHAR(100));

-- 插入大批量数据
INSERT INTO t1
SELECT seq, REPEAT('x',100)
FROM (
  SELECT @row:=@row+1 AS seq
  FROM information_schema.COLUMNS, (SELECT @row:=0) r
  LIMIT 50000
) s;

预期:从库 Seconds_Behind_Master 增长,Relay_Log_Space 增大。

  1. 练习:定位并跳过冲突事件
    - 人为在从库对同一主键插入冲突记录,触发 SQL 线程停止。
    预期:Slave_SQL_Running=No,可用 mysqlbinlog 定位事件,再使用 SQL_SLAVE_SKIP_COUNTER=1 跳过恢复。

最佳实践
- 设置合理的 binlog/relay log 保留策略,防止磁盘暴涨。
- 延迟告警结合 Seconds_Behind_MasterRelay_Log_Space 双指标。
- 对关键表使用 pt-table-checksum 定期校验数据一致性。