Relay log read failure是relay log文件损坏的明确信号,需先STOP SLAVE,再用mysqlbinlog验证损坏(如unknown binlog event type),区分relay-bin.*损坏或relay-log.index错乱后,非GTID模式用CHANGE MASTER TO指定下一合法relay log起始位置,GTID模式须用SET GTID_NEXT+空事务跳过,并启用relay_log_recovery=ON和sync_relay_log=1预防。

Relay log read failure 是 relay log 文件损坏的明确信号,不是网络或权限问题,必须按日志损坏处理。
看到 Relay log read failure 就先停复制,别删文件
这个错误出现时,Slave_SQL_Running 一定为 No,Seconds_Behind_Master 变成 NULL,且 Relay_Log_Pos 停滞不动。此时:
– 不要手动 rm 任何 relay-bin.* 或 relay-log.index 文件
– 不要直接 START SLAVE,MySQL 不会自动重建 relay log,反而报 Failed to open the relay log
– 不要只查 Master_Log_File 和 Exec_Master_Log_Pos,它们反映主库位点,和本地 relay log 是否损坏无关
怎么确认真是 relay log 损坏了
从 SHOW SLAVE STATUS\G 中提取 Relay_Log_File(比如 mysqld-relay-bin.000121),然后执行:mysqlbinlog /var/lib/mysql/mysqld-relay-bin.000121 | head -n 20
如果输出中出现以下任一情况,就是实锤损坏:
– unknown binlog event type
– Invalid replication event
– Event too small
– 直接 segfault 或空白输出
注意:不要加 --base64-output=DECODE-ROWS,它可能掩盖原始结构问题
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
区分 relay-bin.* 损坏和 relay-log.index 错乱
这两类问题现象接近,但根源和处理方式完全不同:
– 如果 Relay_Log_File 非空、有明确 Could not parse relay log event entry、ls -1v hostname-relay-bin.[0-9]* 能列出文件但 mysqlbinlog 解析失败 → 是 relay-bin.* 二进制内容损坏
– 如果 Relay_Log_File 为空、SHOW SLAVE STATUS 里没 Last_SQL_Error、但 ls 能看到一堆 relay-bin.* 文件 → 很可能是 relay-log.index 被清空或写入错乱
关键验证动作:对比 ls -1v hostname-relay-bin.[0-9]* 输出和 relay-log.index 文件内容是否一致,末尾不能有多余空行
跳过损坏 relay log 的安全操作路径
必须先 STOP SLAVE,再根据模式选择方式:
– 非 GTID 模式:查出下一个 relay log 文件名(如当前坏的是 mysqld-relay-bin.000121,下一个是 mysqld-relay-bin.000122),运行:CHANGE MASTER TO RELAY_LOG_FILE='mysqld-relay-bin.000122', RELAY_LOG_POS=4
– GTID 模式:sql_slave_skip_counter 完全无效,必须用:SET GTID_NEXT='xxx-xxx-xxx:yyy'; BEGIN; COMMIT;(其中 yyy 是 Exec_Master_Log_Pos 对应事务的 GTID 序号)
注意:CHANGE MASTER TO 在 GTID 模式下不能混用 MASTER_LOG_FILE 和 RELAY_LOG_FILE 参数;手动指定前务必确认下一个 relay log 文件真实存在且 mysqlbinlog 可解析,否则 START SLAVE 会立刻失败
跳过只是让复制跑起来,不代表数据一致。损坏意味着至少有一段主库变更丢失,必须结合主库 binlog 校验并人工补漏。最容易被忽略的是:relay_log_recovery=ON 和 sync_relay_log=1 这两个配置没开 —— 它们才是防止下次再出事的关键。

















