relay log write failure could not queue event from master
这个报错是 MySQL 主从复制中从库 I/O 线程的经典故障:从库成功接收到主库传来的 binlog 事件,但无法写入本地的 relay log(中继日志),最终导致 I/O 线程停止、复制中断。
以下按高发到低发排序,给出完整排查与解决方案:
一、最高发原因:从库数据磁盘空间耗尽
中继日志写入数据目录,磁盘满后直接无法写入,是该报错最常见诱因。
排查
# 替换为你的 MySQL 数据目录路径,默认 /var/lib/mysql
df -h /var/lib/mysql
若分区使用率达到 100%,即可定位问题。
解决
- 紧急释放空间:清理过期 binlog、旧备份文件
-- 登录 MySQL,清理 7 天前的旧 binlog PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY); - 长期自动清理配置(写入
my.cnf)[mysqld] expire_logs_days = 7 # binlog 自动保留 7 天 relay_log_purge = ON # 自动清理已应用完成的 relay log - 扩容数据盘,从根源解决容量不足。
二、第二高发:主从 max_allowed_packet 不匹配
主库存在大事务、大字段(BLOB / 大 TEXT)生成的 binlog 事件,体积超过从库
max_allowed_packet 上限,导致事件无法写入中继日志。你之前遇到的 mysqldump 同参数报错,本质都是单包超限,原理一致。
排查
主库、从库分别执行:
SHOW VARIABLES LIKE 'max_allowed_packet';
规范要求从库参数值 ≥ 主库,如果从库更小必然触发报错。
解决
- 临时生效(无需重启)
SET GLOBAL max_allowed_packet = 1073741824; -- 设置为 1G,可按需调整 - 永久生效(写入 my.cnf)
[mysqld] max_allowed_packet = 1G - 重启复制验证
STOP SLAVE; START SLAVE; SHOW SLAVE STATUS\G
三、中继日志文件损坏 / 目录权限异常
异常断电、进程强制杀死、目录权限错误,都会导致 relay log 文件损坏或无法写入。
排查
- 查看 MySQL 错误日志(默认路径
/var/log/mysqld.log或数据目录下error.log),确认是否有文件损坏、Permission denied类报错。 - 检查目录权限
ls -l /var/lib/mysql/ | grep relay # 文件所有者必须是 mysql:mysql
解决:重置中继日志,重新拉取
-- 1. 停止从库复制
STOP SLAVE;
-- 2. 清空所有损坏的中继日志,重置 I/O 线程同步位点
RESET SLAVE;
-- 3. 重新启动复制,从主库重新拉取 binlog
START SLAVE;
-- 4. 验证状态
SHOW SLAVE STATUS\G
正常恢复后,
Slave_IO_Running 会变回 Yes,报错消失。四、relay_log_space_limit 总大小限制过小
该参数限制了从库所有 relay log 的总大小上限,触顶后会拒绝写入新的中继日志。
排查
SHOW VARIABLES LIKE 'relay_log_space_limit';
返回值非 0 且数值很小(如几百 MB),很容易触发写入上限。
解决
- 临时关闭限制
SET GLOBAL relay_log_space_limit = 0; -- 0 表示不限制总大小 - 永久写入配置
[mysqld] relay_log_space_limit = 0
五、网络抖动导致事件包截断
主从之间网络闪断、丢包,导致 I/O 线程接收到的 binlog 事件不完整,写入 relay log 时校验失败。
排查
# 测试主库端口连通性、丢包率
telnet 主库IP 3306
ping 主库IP
解决
- 网络恢复后重启复制即可自愈:
STOP SLAVE; START SLAVE; - 高延迟 / 不稳定网络可优化超时参数:
[mysqld] slave_net_timeout = 60 # 网络超时时间,单位秒
浙公网安备 33010602011771号