MySQL 5.7 升级到 8.0 前如何检查兼容性事项?

文章导读
升级 MySQL 5.7 到 8.0 前,必须使用 MySQL Shell 的 util.checkForServerUpgrade 工具扫描实例,识别 schema 和配置冲突。此操作适用于原地升级场景,主要风险在于认证插件变更导致旧客户端无法连接。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

升级 MySQL 5.7 到 8.0 前,必须使用 MySQL Shell 的 util.checkForServerUpgrade 工具扫描实例,识别 schema 和配置冲突。此操作适用于原地升级场景,主要风险在于认证插件变更导致旧客户端无法连接。

先说结论:升级前必须运行兼容性检查工具,确认无阻断性错误后再执行二进制替换或逻辑导出。

  • 适合:计划进行原地升级(In-place Upgrade)或逻辑迁移的生产环境。
  • 先准备:完整备份数据并准备回滚方案,确保 MySQL Shell 版本与目标 8.0 版本一致。
  • 验收:检查工具报告无 ERROR 级别问题,且应用连接测试通过。

命令速用版

在安装了 MySQL Shell 的机器上,连接至 5.7 实例执行以下命令生成兼容性报告:

util.checkForServerUpgrade('root@localhost:3306', {'outputPath': '/tmp/upgrade_check.txt'})

若未安装 MySQL Shell,可下载与目标 8.0 版本一致的 Shell 包,无需升级服务器即可运行检查。

为什么会这样

MySQL 8.0 移除了部分旧特性并改变了默认配置,直接升级可能导致服务启动失败或应用连接报错。

主要变更包括默认认证插件从 mysql_native_password 改为 caching_sha2_password,字符集默认排序规则变为 utf8mb4_0900_ai_ci,以及查询缓存(Query Cache)被彻底移除。此外,8.0 增加了保留字列表,原有表结构若包含冲突字段名会导致建表或查询失败。

分步处理

第一步:全量备份

使用 mysqldump 或物理备份工具保存当前 5.7 数据,确保可回滚至升级前状态。

mysqldump -u root -p `--all-databases` `--single-transaction` > backup_57.sql

第二步:运行检查工具

通过 MySQL Shell 连接 5.7 实例,执行 util.checkForServerUpgrade。关注输出中的 ERROR 级别项,必须修复后方可继续。

第三步:修复兼容性问题

根据检查报告修改表结构、更新保留字冲突的列名,或调整客户端驱动版本以支持新认证插件。

MySQL 5.7 升级到 8.0 前如何检查兼容性事项?

第四步:执行升级

停止服务,替换二进制文件,启动 8.0 服务并运行 mysql_upgrade(8.0.16 之后通常自动处理,但需确认)。

怎么验证是否生效

登录数据库执行 SELECT VERSION(); 确认版本号显示为 8.0.x。检查错误日志文件,通常位于 /var/log/mysql/error.log,确认无启动报错。使用应用账号尝试连接,验证认证插件兼容性。

常见坑

1. 旧版客户端驱动不支持 caching_sha2_password,连接会报 Authentication plugin 错误,需在用户配置中改回 mysql_native_password 或升级驱动。

2. 原有 SQL 语句使用了 8.0 新增保留字(如 RANK, OVER 等),未加反引号包裹会导致语法错误。

3. 依赖查询缓存的应用性能可能下降,因为 8.0 已移除该功能,需优化 SQL 而非依赖缓存机制。

常见问题

升级失败能否回滚到 5.7?

可以,但前提是升级前做了完整数据备份且未修改数据文件格式。若已启动 8.0 并写入数据,直接降级二进制通常不可行,需恢复备份。

必须修改所有用户密码吗?

不需要强制修改,但新用户默认使用 caching_sha2_password。旧用户可保留原插件,但建议逐步迁移至新插件以获得安全性提升。

检查工具报告 WARNING 需要处理吗?

WARNING 级别通常不阻断升级,但建议评估影响。ERROR 级别必须处理,否则升级过程会中断或导致实例不可用。

参考来源

MySQL Official Documentation, Upgrading MySQL, https://dev.mysql.com/doc/refman/8.0/en/upgrading.html

MySQL Official Documentation, MySQL Shell Utility Functions, https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-upgrade.html