升级 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 级别项,必须修复后方可继续。
第三步:修复兼容性问题
根据检查报告修改表结构、更新保留字冲突的列名,或调整客户端驱动版本以支持新认证插件。
第四步:执行升级
停止服务,替换二进制文件,启动 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