MySQL 5.6 升级到 5.7 主从复制不能无缝完成,必须先升级从库再升级主库。核心风险在于 sql_mode 默认严格模式变更、系统表结构调整以及复制协议兼容性,操作不当会导致复制中断或数据不一致。
先说结论:支持跨版本升级,但必须采用滚动升级方式,严禁直接跨大版本跳跃或同时重启主从。
- 适合场景:生产环境主从架构,需保留数据平滑过渡到 5.7 特性。
- 先看配置:检查 sql_mode、binlog 格式、字符集及废弃参数(如 query_cache)。
- 建议操作:先升级所有从库验证复制正常,再切换主从角色升级原主库。
命令速用版
升级前后用于检查状态和执行升级的关键命令,直接在终端执行。
检查主从状态\nSHOW SLAVE STATUS\G\n\n升级数据字典\nmysql_upgrade -u root -p\n\n备份全量数据\nmysqldump `--all-databases` `--single-transaction` > full_backup.sql\n\n查看当前版本\nSELECT VERSION();
为什么会这样
MySQL 5.7 引入了系统表结构变更和更严格的 SQL 标准,导致旧版本配置无法直接兼容。
5.7 版本默认启用严格模式(ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES),5.6 中允许的非法日期或非聚合列 GROUP BY 查询在 5.7 会直接报错。系统表 mysql.user 列数从 42 列增加到 45 列,增加了账户锁定和密码过期字段,旧版客户端可能无法连接。此外,5.7 移除了查询缓存(query_cache)和相关参数,配置文件未调整会导致启动失败。
分步处理
按照从库优先、主库在后的顺序执行,确保复制链路不断。
1. 升级前准备
备份所有数据库数据。检查 5.6 实例是否有空密码账户,5.7 默认不允许空密码。停用查询缓存,在 my.cnf 中设置 query_cache_type = 0。
2. 升级从库
停止从库复制(STOP SLAVE)。关闭 5.6 服务,安装 5.7 二进制包。启动 5.7 实例时添加 `--skip-slaves-start` 参数防止自动连接主库。运行 mysql_upgrade 修复系统表。启动服务后检查错误日志。
3. 验证从库复制
在从库执行 START SLAVE。观察 SHOW SLAVE STATUS 输出,确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes。确认主库 5.6 与从库 5.7 之间复制无延迟。
4. 升级主库
业务低峰期进行主从切换,将原从库(已升 5.7)提升为主库。原主库降为从库后,按从库升级步骤执行 5.7 升级。升级完成后恢复主从关系。
怎么验证是否生效
通过状态变量和日志确认升级后的兼容性和稳定性。
执行 SHOW VARIABLES LIKE 'sql_mode'; 确认是否包含 ONLY_FULL_GROUP_BY 和 STRICT_TRANS_TABLES。检查 error.log 文件,确认没有关于未知参数或系统表错误的报错。在应用层运行核心业务 SQL,对比 5.6 和 5.7 的执行结果 Hash 值,确保逻辑一致。监控主从延迟 Seconds_Behind_Master 是否为 0。
常见坑
以下场景容易导致升级失败或业务中断,需提前规避。
sql_mode 兼容性问题:旧代码包含非标准 GROUP BY 写法,升级后查询报错。解决方法是修改 SQL 或调整 sql_mode(不推荐长期关闭严格模式)。
账户无法登录:升级后远程账号无法连接。原因是权限表结构变化,需执行 mysql_upgrade 并重建用户账户。
复制协议 Bug:MySQL 5.7 到小于 5.6.22 版本的复制存在已知 Bug(Bug 74683)。确保 5.6 小版本不低于 5.6.22 或直接升级所有节点。
字符集限制:5.7 虽保留 utf8 但推荐 utf8mb4。若业务需要存储表情符号,需在升级前转换字符集,否则会出现数据截断。
常见问题
MySQL 5.6 可以直接升级到 8.0 吗?
不支持直接跨版本升级。官方只保证相邻大版本间的平滑升级,必须先升至 5.7,再升至 8.0。
升级后远程登录失败怎么办?
执行 mysql_upgrade 更新系统表,若仍失败则删除旧用户重新创建并授权。
主从版本不一致会影响复制吗?
允许从库版本高于主库版本,但生产环境建议主从版本完全一致以避免潜在兼容性问题。
参考来源
- MySQL Official Documentation, Upgrading from Previous Series, http://dev.mysql.com/doc/refman/5.7/en/upgrading-from-previous-series.html
- MySQL Official Documentation, Glossary (Fast Shutdown), http://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_fast_shutdown