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%,即可定位问题。

解决

  1. 紧急释放空间:清理过期 binlog、旧备份文件
    -- 登录 MySQL,清理 7 天前的旧 binlog
    PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
    
     
  2. 长期自动清理配置(写入 my.cnf
    [mysqld]
    expire_logs_days = 7    # binlog 自动保留 7 天
    relay_log_purge = ON    # 自动清理已应用完成的 relay log
    
     
  3. 扩容数据盘,从根源解决容量不足。

二、第二高发:主从 max_allowed_packet 不匹配

主库存在大事务、大字段(BLOB / 大 TEXT)生成的 binlog 事件,体积超过从库 max_allowed_packet 上限,导致事件无法写入中继日志。
你之前遇到的 mysqldump 同参数报错,本质都是单包超限,原理一致。

排查

主库、从库分别执行:
SHOW VARIABLES LIKE 'max_allowed_packet';
 
规范要求从库参数值 ≥ 主库,如果从库更小必然触发报错。

解决

  1. 临时生效(无需重启)
    SET GLOBAL max_allowed_packet = 1073741824; -- 设置为 1G,可按需调整
    
     
  2. 永久生效(写入 my.cnf)
    [mysqld]
    max_allowed_packet = 1G
    
     
  3. 重启复制验证
    STOP SLAVE;
    START SLAVE;
    SHOW SLAVE STATUS\G
    
     

三、中继日志文件损坏 / 目录权限异常

异常断电、进程强制杀死、目录权限错误,都会导致 relay log 文件损坏或无法写入。

排查

  1. 查看 MySQL 错误日志(默认路径/var/log/mysqld.log或数据目录下error.log),确认是否有文件损坏、Permission denied类报错。
  2. 检查目录权限
    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),很容易触发写入上限。

解决

  1. 临时关闭限制
    SET GLOBAL relay_log_space_limit = 0; -- 0 表示不限制总大小
    
     
  2. 永久写入配置
    [mysqld]
    relay_log_space_limit = 0
    
     

五、网络抖动导致事件包截断

主从之间网络闪断、丢包,导致 I/O 线程接收到的 binlog 事件不完整,写入 relay log 时校验失败。

排查

# 测试主库端口连通性、丢包率
telnet 主库IP 3306
ping 主库IP
 

解决

  1. 网络恢复后重启复制即可自愈:
    STOP SLAVE; START SLAVE;
    
     
  2. 高延迟 / 不稳定网络可优化超时参数:
    [mysqld]
    slave_net_timeout = 60    # 网络超时时间,单位秒
posted @ 2026-08-07 08:33  网络大法师  阅读(2)  评论(0)    收藏  举报