0

0

mysql数据库版本迁移中的日志文件处理与同步

P粉602998670

P粉602998670

发布时间:2026-01-10 04:53:19

|

288人浏览过

|

来源于php中文网

原创

主从切换后需执行RESET SLAVE ALL清除残留relay-log文件,否则磁盘空间增长且启动复制时报Failed to open relay log index;GTID模式下若主库purge了所需GTID,必须重建从库;跨版本迁移应统一binlog_format为ROW并校验非确定性语句;mysqldump时需按目标环境选择--set-gtid-purged参数。

mysql数据库版本迁移中的日志文件处理与同步

MySQL 主从切换后 relay log 文件残留问题

主从角色切换后,旧主库可能残留未清理的 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_FileRelay_Log_Index 值,再检查对应目录下文件实际存在性
  • RESET SLAVE ALLRESET SLAVE 更彻底:它不仅重置 SQL 线程状态,还会删除所有 relay-log 文件并清空 relay_log_index
  • 若需保留部分 relay log(如用于审计回溯),应手动备份后再执行 RESET SLAVE ALL,否则不可逆

GTID 模式下 binlog 日志同步中断的恢复逻辑

启用 gtid_mode=ON 后,复制不再依赖 binlog filename + position,而是靠 Executed_Gtid_SetRetrieved_Gtid_Set 对齐。一旦网络抖动或从库宕机时间过长,主库的 binlog 可能已被 purge(由 binlog_expire_logs_secondsexpire_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

实操建议:

  • 检查主库已 purge 的 GTID 范围: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_MasterRetrieved_Gtid_SetExecuted_Gtid_Set 的差值,差值持续增大说明日志消费滞后

跨版本迁移时 binlog 格式兼容性陷阱

MySQL 5.7 升级到 8.0 是常见路径,但默认 binlog_format 行为有变化:5.7 默认为 STATEMENTMIXED,而 8.0 推荐且部分特性(如某些 JSON 函数、窗口函数)强制要求 ROW。若迁移后仍用旧格式,可能触发复制中断,错误类似 Error 'Cannot execute statement: binlogging of stored functions and triggers is not allowed' on query

外卖吧1.0
外卖吧1.0

一、本站采用PHP+mysql,核心程序使用了kingcms PHP版,重新设计了模板界面,增加了一些操作功能,方便外卖同行可以很好的展示宣传自己的外卖产品。本套源码的模板可以随意共享传播,程序版权仍归Kingcms所有。 二、网站部署操作: 第一步:将“upload”文件夹的所有文件上传到网站的根目录下。 第二步:在数据库管理后台创建好数据库并将源码中的“mysql”文件夹里的文件导入到数据库中

下载

实操建议:

  • 迁移前在 5.7 主库执行 SET GLOBAL binlog_format = 'ROW'; 并写入配置文件 my.cnf,确保重启后持久生效
  • 检查所有存储过程、函数、触发器是否含非确定性语句(如 NOW(), UUID(), 用户变量赋值),这些在 ROW 模式下可能被拒绝写入 binlog
  • 8.0 中 binlog_row_image = FULL 是默认值,但若从库是 5.6 或更早版本,需设为 MINIMAL 以兼容;不过跨大版本主从已不被官方支持,应避免
SET GLOBAL binlog_format = 'ROW';
SET GLOBAL binlog_row_image = 'FULL';
FLUSH LOGS;

mysqldump 导出时如何保证日志位置与 GTID 一致

使用 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 冲突)。

实操建议:

  • 对 GTID 已启用的实例,dump 时显式指定 --set-gtid-purged=AUTO:当导出包含 binlog 位置时自动关闭注入,否则保留
  • 若目标库是全新实例,用 --set-gtid-purged=ON 是安全的;但如果是追加数据到已有从库,必须用 --set-gtid-purged=OFF 并手动记录 SHOW MASTER STATUS 中的 Executed_Gtid_Set
  • 务必验证 dump 文件开头是否含 SET @@GLOBAL.GTID_PURGED 行,并与目标环境 GTID 状态比对

日志文件不是“备份完就没事”的静态产物,它的生命周期横跨备份、传输、恢复、复制多个环节。最容易被跳过的一步,是迁移后对 relay-log 目录的手动巡检——哪怕只多一行 ls -lt | head -5,也能避开后续三天排查磁盘告警的时间。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1094

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

571

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

414

2024.04.29

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

15

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 785人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号