

新闻资讯
技术学院主从切换后需执行RESET SLAVE ALL清除残留relay-log文件,否则磁盘空间增长且启动复制时报Failed to open relay log index;GTID模式下若主库purge了所需GTID,必须重建从库;跨版本迁移应统一binlog_format为ROW并校验非确定性语句;mysqldump时需按目标环境选择--set-gtid-purged参数。
主从角色切换后,旧主库可能残留未清理的 relay-log 文件(如 mysql-relay-bin.000001),但 relay_log_index 文件已清空或指向错误位置。此时执行 RESET SLAVE 通常能清除元数据,但物理文件不会自动删除——这会导致磁盘空间缓慢增长,且下次启动复制时可能因索引缺失而报错 Failed to open the relay log index file。
实操建议:
SHOW SLAVE STATUS\G 确认 Relay_Log_File 和 Relay_Log_Index 值,再检查对应目录下文件实际存在性RESET SLAVE ALL 比 RESET SLAVE 更彻底:它不仅重置 SQL 线程状态,还会删除所有 relay-log 文件并清空 relay_log_index
RESET SLAVE ALL,否则不可逆启用 gtid_mode=ON 后,复制不再依赖 binlog filename + position,而是靠 Executed_Gtid_Set 和 Retrieved_Gtid_Set 对齐。一旦网络抖动或从库宕机时间过长,主库的 binlog 可能已被 purge(由 binlog_expire_logs_seconds 或 expire_logs_days 控制),导致从库无法追上:错误信息通常是 The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires。
实操建议:
SELECT * FROM performance_schema.replication_applier_status_by_coordinator; 结合 SHOW MASTER LOGS; 和 SELECT @@global.gtid_purged;
库缺失的 GTID 已被 purge,必须重新搭建从库——不能仅靠 SET GLOBAL gtid_purged = '...' 注入,除非你确认该 GTID 集合确实未在任何节点执行过Seconds_Behind_Master 和 Retrieved_Gtid_Set 与 Executed_Gtid_Set 的差值,差值持续增大说明日志消费滞后MySQL 5.7 升级到 8.0 是常见路径,但默认 binlog_format 行为有变化:5.7 默认为 STATEMENT 或 MIXED,而 8.0 推荐且部分特性(如某些 JSON 函数、窗口函数)强制要求 ROW。若迁移后仍用旧格式,可能触发复制中断,错误类似 Error 'Cannot execute statement: binlogging of stored functions and triggers is not allowed' on query。
实操建议:
SET GLOBAL binlog_format = 'ROW'; 并写入配置文件 my.cnf,确保重启后持久生效NOW(), UUID(), 用户变量赋值),这些在 ROW 模式下可能被拒绝写入 binlogbinlog_row_image = FULL 是默认值,但若从库是 5.6 或更早版本,需设为 MINIMAL 以兼容;不过跨大版本主从已不被官方支持,应避免SET GLOBAL binlog_format = 'ROW'; SET GLOBAL binlog_row_image = 'FULL'; FLUSH LOGS;
使用 mysqldump --single-transaction 备份时,若同时开启 GTID,容易忽略 --set-gtid-purged=ON(默认值)带来的副作用:它会在 dump 文件头部写入 SET @@GLOBAL.GTID_PURGED='...';。若目标实例已有其他 GTID 记录,这条语句会直接失败,报错 Cannot add or update a child row: a foreign key constraint fails(实际是 GTID 冲突)。
实操建议:
--set-gtid-purged=AUTO:当导出包含 binlog 位置时自动关闭注入,否则保留--set-gtid-purged=ON 是安全的;但如果是追加数据到已有从库,必须用 --set-gtid-purged=OFF 并手动记录 SHOW MASTER STATUS 中的 Executed_Gtid_Set
SET @@GLOBAL.GTID_PURGED 行,并与目标环境 GTID 状态比对日志文件不是“备份完就没事”的静态产物,它的生命周期横跨备份、传输、恢复、复制多个环节。最容易被跳过的一步,是迁移后对 relay-log 目录的手动巡检——哪怕只多一行 ls -lt | head -5,也能避开后续三天排查磁盘告警的时间。