该错误是主库binlog被清理导致从库无法找到指定日志文件。需先确认主库是否真丢失对应binlog,再通过CHANGE MASTER TO指向现存最新binlog重置复制坐标,否则数据将不一致。

MySQL从库报错“Could not find first log file name in binary log index file”
这是典型的主库二进制日志被清理、但从库还试图去拉取已不存在的日志文件导致的错误。错误信息里出现的 Could not find first log file name in binary log index file 或 Relay log read failure: Could not parse relay log event entry,基本可以断定:从库 Relay_Master_Log_File 指向的主库 binlog 文件(比如 mysql-bin.000123)在主库上已被 PURGE BINARY LOGS 删除或自动过期清理了。
确认主库是否真丢失了对应 binlog 文件
别急着重做同步,先验证主库现状:
- 登录主库,执行
SHOW BINARY LOGS;,看输出列表里有没有从库报错中提到的那个文件名(比如mysql-bin.000123) - 查主库配置:运行
SHOW VARIABLES LIKE 'expire_logs_days';或SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';,确认自动清理策略。MySQL 8.0+ 默认是binlog_expire_logs_seconds = 2592000(30天),老版本用expire_logs_days - 检查磁盘空间压力:如果主库
df -h显示/var/lib/mysql所在分区快满了,MySQL 可能会提前强制 purge,哪怕没到过期时间
从库无法跳过,只能重拉:用 CHANGE MASTER TO 指向现存最新 binlog
只要主库丢了那个 binlog 文件,SET GLOBAL sql_slave_skip_counter = 1 或 START SLAVE UNTIL 都无效——因为 IO 线程根本连不到那个文件,还没到 SQL 线程执行阶段就卡死了。必须重置复制坐标:
- 在从库停复制:
STOP SLAVE; - 在主库查当前最新位置:
SHOW MASTER STATUS;,记下File(如mysql-bin.000156)和Position(如198) - 在从库执行:
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000156', MASTER_LOG_POS=198;(注意:不是用原来报错的文件名) - 再
START SLAVE;,然后SHOW SLAVE STATUS\G看Seconds_Behind_Master是否开始下降
⚠️ 这个操作意味着从库会丢掉自原故障点以来、主库新产生的所有变更(即数据不一致)。如果业务不能接受丢数据,就得用物理备份+binlog 增量恢复,而不是简单重指位置。
避免下次再发生:主库 binlog 保留策略要匹配从库延迟峰值
很多团队只按“保留7天”配,但没考虑从库偶尔延迟超过7天(比如大表 DDL、网络抖动、从库负载高)。真正安全的做法是:
- 监控从库延迟:用
Seconds_Behind_Master告警,历史最大值至少乘以 1.5 倍作为 binlog 保留底线 - 主库手动清理前,先确认所有从库
Relay_Master_Log_File都 ≤ 当前SHOW BINARY LOGS最老文件 - MySQL 8.0+ 推荐用
binlog_expire_logs_seconds替代expire_logs_days,精度更高(秒级) - 不要依赖
RESET MASTER—— 它清空所有 binlog 并重置 index,等于主动制造这个故障
最麻烦的不是重同步本身,而是你得确认那几小时/几天的 binlog 究竟还在不在——有时候它被归档到了 NFS 或对象存储,但 MySQL 实例自己已经看不到,这种场景需要额外脚本挂载还原,不属于 CHANGE MASTER TO 能解决的范围。


















