该错误几乎从不因relay log文件本身损坏触发,而是关键文件缺失、路径错位或权限断裂所致;盲目删除relay-bin.*文件反而更糟,易致复制错乱。

relay-log.info 文件损坏直接导致 START SLAVE 失败
relay-log.info 是 MySQL 5.6 及更早版本中存储复制位点的关键文件(MySQL 5.7+ 默认改用表存储,但若 relay_log_info_repository = FILE,它仍生效)。一旦损坏,START SLAVE 会立即报错:ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository。这不是延迟或卡住,而是初始化阶段就失败——SQL 线程甚至没机会启动。
为什么不能靠 RESET SLAVE 清掉它
执行 RESET SLAVE(不带 ALL)只重置内存变量,不删除 relay-log.info 文件;而 RESET SLAVE ALL 会删掉它,但前提是 MySQL 能成功读取该文件来定位当前 relay log 文件名和位置。如果文件已损坏(比如内容截断、乱码、权限为 000),RESET SLAVE ALL 本身可能失败或静默跳过重建逻辑,导致后续 START SLAVE 仍报相同错误。
FILE 模式下它和 relay-log.index 的耦合关系
在 relay_log_info_repository = FILE 模式下,relay-log.info 里记录的 Relay_Log_File 值(如 hostname-relay-bin.000123)必须严格匹配 relay-log.index 中存在的某一行。如果 relay-log.info 指向一个已被删除或重命名的文件,而 relay-log.index 又没同步更新,MySQL 启动时就会报:Could not find target log file mentioned in relay log info in the index file。这两个文件必须一致,缺一不可。
修复前必须确认是否还在用 FILE 模式
- 先查:
SHOW VARIABLES LIKE 'relay_log_info_repository';—— 如果返回TABLE,那relay-log.info已失效,真正位点在mysql.slave_relay_log_info表里,删它无害也无效 - 如果返回
FILE,再检查SELECT @@relay_log_info_file;确认路径,并用ls -l验证文件是否存在、大小是否 > 0、权限是否为 MySQL 用户可读 - 损坏典型表现:文件为空、只有部分字段(如缺
Relay_Log_Pos)、包含非 ASCII 字符、mtime 异常久远
真正麻烦的不是文件损坏本身,而是它和 relay-log.index、磁盘上真实 relay log 文件三者之间状态不一致——手动修复必须同时对齐这三者,漏掉任一环,START SLAVE 就会立刻失败。


















