relay log 是什么
relay log 是复制链路上的暂存区:从库的 IO 线程把主库 binlog 拉到本地写成 relay log,SQL 线程再逐条重放。默认 relay_log_purge=ON,重放完成即自动清理,正常情况下完全不需要人工干预。它的价值在于观测——Relay_Log_Space 持续暴涨说明 SQL 线程重放跟不上或卡住了,排查方向应该指向卡点,而不是手工删文件。
基本信息
| 适用版本 | MySQL 5.7 / 8.0(8.0 支持 relay log 文件与索引文件独立路径) |
|---|---|
| 关键参数 | relay_log、relay_log_purge(默认 ON)、relay_log_space_limit |
| 观测字段 | SHOW REPLICA STATUS 的 Relay_Log_File、Relay_Log_Space、Relay_Log_Pos |
| 默认行为 | 重放完成即清理,无需干预 |
| 异常信号 | Relay_Log_Space 持续增长,SQL 线程状态不为 applying |
| 清理命令 | RESET REPLICA ALL 会重置并清空 relay 目录 |
典型使用场景
- 从库磁盘告警:确认是 relay log 还是数据文件占用增长
- 复制延迟排查:Relay_Log_Space 大说明重放端积压
- 从库重建后清理旧 relay 文件,避免磁盘被历史日志占满
- 把 relay log 放到独立磁盘:写入高峰时与数据盘互不干扰
- 升级迁移时确认 relay 目录路径与权限,避免启动失败
查看与管理
查看与管理
-- 查看 relay 相关参数当前值
SHOW VARIABLES LIKE 'relay_log%';
-- 关注 Relay_Log_Space 与 SQL 线程状态
SHOW REPLICA STATUS\G
-- 极少需要:重新打开自动清理(默认即为 ON)
SET GLOBAL relay_log_purge = ON;
-- 重建复制关系时会重置 relay 文件,操作前确认不再需要旧位点
-- RESET REPLICA ALL;空间异常时的排查路径
空间异常时的排查路径
# 1) 看 relay 目录占用与增长趋势
du -sh /var/lib/mysql/relaylog/ 2>/dev/null || du -sh /var/lib/mysql/*relay*
# 2) 看 SQL 线程在做什么:是否被大事务或长查询卡住
mysql -e "SHOW REPLICA STATUS\G" | grep -E 'Relay_Log_File|Relay_Log_Space|Seconds_Behind|SQL_Delay'
mysql -e "SELECT id, time, state, LEFT(info,80) FROM information_schema.PROCESSLIST WHERE command <> 'Sleep';"
# 3) relay 盘与数据盘分开部署时,重点看 relay 盘 inode 与容量
关键字段读法
| 字段 | 含义 | 异常判断 |
|---|---|---|
| Relay_Log_File | 当前正在重放的 relay 文件 | 长期停留在同一文件说明重放停滞 |
| Relay_Log_Pos | 当前重放位置 | 位置不前进即 SQL 线程无进度 |
| Relay_Log_Space | relay 目录总占用 | 持续上涨代表拉取速度大于重放速度 |
| Seconds_Behind_Source | 落后主库的秒数 | 大事务与空闲场景下会失真,需结合位点差 |
| SQL_Delay | 人为延迟复制设置 | 非零时延迟是「设计值」而非故障 |
建议把 relay log 与数据目录分盘存放:主库写入高峰时 IO 争抢会同时拖慢重放与业务查询,分盘后互不影响;同时监控要覆盖 relay 目录所在分区的容量。
不要用 rm 手工删除 relay log 文件:索引文件与实际文件不一致会让复制直接崩溃,需要重建复制关系才能恢复。空间不足时应先解决重放卡点,再评估用 RESET REPLICA 类命令清理。