主库binlog文件确实丢失,需先用SHOW BINARY LOGS确认缺失,再通过SHOW MASTER STATUS获取当前有效binlog文件名和位置,执行STOP SLAVE、CHANGE MASTER TO重定位至该位置并START SLAVE恢复复制。

这不是配置写错了,也不是网络不通,是主库上那个 binlog 文件确实没了——从库还在找 mysql-bin.001529,而主库的 SHOW BINARY LOGS 里早就没它了。
怎么确认主库真丢了 binlog 文件
别猜,直接查:
- 在从库执行
SHOW SLAVE STATUS\G,记下Relay_Master_Log_File(比如mysql-bin.001529)和Exec_Master_Log_Pos - 立刻登录主库,运行
SHOW BINARY LOGS;,看输出列表里有没有这个文件名 - 再查清理策略:
SHOW VARIABLES LIKE 'expire_logs_days';或SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';,MySQL 8.0+ 默认 30 天(2592000 秒) - 顺手
df -h看下主库磁盘,空间不足时 MySQL 可能提前 purge,连过期时间都等不及
为什么不能用 SET GLOBAL sql_slave_skip_counter = 1
这个命令根本轮不到它生效:
-
sql_slave_skip_counter是跳 relay log 里的下一条事件,前提是 IO 线程正在跑、relay log 已存在 - 而
Could not find first log file name是 IO 线程启动阶段就失败:它连主库的mysql-bin.001529都找不到,压根没机会拉取新内容、更不会生成 relay log - 执行后
SHOW SLAVE STATUS\G里仍是Slave_IO_Running: No,Last_IO_Error还是那句原话
CHANGE MASTER TO 指向哪?不是随便选个新文件
必须用主库当前真实可用的起点,且要验证存在:
- 在主库执行
SHOW MASTER STATUS;,拿到File(如mysql-bin.001530)和Position(如154) - 立刻检查该文件是否真实存在:
ls -l /var/lib/mysql/mysql-bin.001530,避免因磁盘异常导致文件名在索引里但物理丢失 - 在从库执行:
STOP SLAVE;→CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.001530', MASTER_LOG_POS=154;→START SLAVE; - 注意:这会丢弃从原卡点到新起点之间的所有变更,如果业务要求强一致,这个操作只是临时止血,不是最终方案
最容易被忽略的一点:重设后务必盯住 Seconds_Behind_Master 是否开始下降,以及 Slave_SQL_Running 是否真正进入 Running 状态——有时 IO 起来了,SQL 线程却因数据不一致卡在下一条事件上。


















