MySQL 5.7 到 9.7.0 LTS 升级核心指南
MySQL5.7 → 9.7.0 LTS 核心须知(官方不能直接跨级原地升级,必须三段分步:5.7→8.0→8.4→9.7)
一、官方强制升级路径(重中之重)
禁止 5.7 直接 in-place 原地升级 9.7,仅两种稳妥方案:
- 分步原地升级(物理文件)
5.7.44(最终版) → 8.0.46(8.0最终GA) → 8.4.9 LTS → 9.7.0 LTS
- 逻辑全量导出导入(最稳妥,生产推荐)
5.7 全库 mysqldump → 新装 9.7 空实例导入,规避所有底层数据字典兼容坑
|-----------------------------|
| 生产优先逻辑迁移;单机小库、测试环境可选分步原地升级。 |
二、升级前必做前置检查(5.7 环境整改,不整改升级必报错)
1、账号密码插件(9.7 彻底删除 mysql_native_password,致命坑)
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql -- 查出老密码插件用户 SELECT user,host,plugin FROM mysql.user WHERE plugin='mysql_native_password'; -- 全部改成caching_sha2_password(9.7唯一支持) ALTER USER '账号'@'host' IDENTIFIED WITH caching_sha2_password BY '新密码'; |
|-----------------------------------------------------|
| 老旧 JDBC5.x、PHP5、老 Navicat 连不上都是这个原因,要么改账号要么升级客户端驱动。 |
2、存储引擎整改(8.0 + 废弃 MyISAM 分区)
- 所有分区表不能是 MyISAM,MyISAM 分区必须删分区或转 InnoDB
|----------------------------------------------------------------------------------------------------------------------------------------|
| sql SELECT TABLE_SCHEMA,TABLE_NAME,ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%partition%' AND ENGINE!='InnoDB'; |
- 废弃 ARCHIVE、CSV 分区,全量改成 InnoDB;系统表、业务表杜绝 MyISAM。
3、SQL_MODE 兼容(5.7→8.0→9.x mode 持续删减旧模式)
- 5.7 默认 mode 宽松,8.0 默认开启ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES等严格模式
- 9.7 移除老旧 sql_mode(NO_AUTO_CREATE_USER 等),my.cnf 删掉废弃 mode
- 提前在 5.7 改成新版 mode,全量跑一遍业务 SQL 排查报错。
4、视图、字段限制(9.7 硬性约束)
- 视图别名不能超过 64 字符(5.7 允许 255),超长视图提前改名重建
- ENUM/SET 单元素不能超 255 字符,超长字段整改
|------------------------------------------------------------------|
| sql SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS; -- 逐个检查视图定义 |
5、字符集变化
- 5.7utf8=utf8mb3;8.0/9.7 utf8=utf8mb4,全库统一 utf8mb4、utf8mb4_unicode_ci,避免中文 /emoji 乱码。
- 废弃utf8_general_ci默认排序,配置统一更换。
6、用 MySQL Shell 预检(官方升级检查工具)
|------------------------------------------------------------------------------------------------------|
| js # shell连接5.7,校验能否升级到9.7 util.checkForServerUpgrade('root@localhost:3306',{targetVersion:"9.7.0"}) |
出现 ERROR 项必须全部修复再升级,WARNING 按需整改。
三、配置文件 my.cnf/my.ini 大改动(5.7 参数大量废弃)
1、彻底删除废弃参数(9.7 启动报错根源)
|----------------------------------------------------------------------------------------------------------------------------------|
| ini # 5.7废弃、8.4/9.7移除,全部删掉 query_cache_size、query_cache_type、innodb_file_format、innodb_large_prefix、skip-name-resolve、sql_mode旧值 |
2、9.7 默认参数变化
- default_authentication_plugin=caching_sha2_password(固定,不可改回 native)
- innodb 默认页面、缓冲池规则微调,不要照搬 5.7 全套配置,只保留必要参数。
四、两种升级实操方案
方案 A:逻辑迁移(生产首选,零底层兼容故障)
- 5.7 全量冷备导出(业务停机 / 只读)
|----------------------------------------------------------------------------------------------------------------------------|
| bash mysqldump -uroot -p --all-databases --routines --triggers --events --single-transaction --master-data=2 > all_57.sql |
- 全新安装 MySQL9.7,初始化空实例
- 导入 sql:mysql -uroot -p < all_57.sql
- 导入完成后执行:ALTER USER ...改密码插件,应用切新库。
方案 B:分步原地升级(节省空间,多轮停机)
- 5.7 升级至 5.7.44 最终版 → 备份全库
- 替换二进制升级 8.0.46,启动自动升级数据字典
- 8.0→8.4.9,再次校验启动
- 8.4→9.7.0(官方支持 8.4 原地升 9.7)
|-----------------------------|
| 每一步升级后观察业务 2~3 天无异常再升下一版本。 |
五、应用侧提前改造(上线必测)
- 驱动升级:JDBC 升级 8.0 + 驱动、PHP pdo_mysql 新版、Navicat15+,老驱动不支持 caching_sha2_password。
- SQL 语法:
- GROUP BY 非标准写法(5.7 允许,8/9 报错 ONLY_FULL_GROUP_BY)
- 废弃ORDER BY NULL、老旧存储过程语法
- 定时事件、触发器、自定义函数:升级后重新编译,9.x 校验规则更严格。
六、上线回滚预案
- 升级前全量物理备份(data 目录打包 + 逻辑 dump 双备份)
- 原地升级出错:退回旧版本二进制 + 恢复原 data 目录
- 逻辑导入异常:切回原 5.7 实例,回滚应用连接。
七、可选:先 8.4 过渡再上 9.7
业务老旧、改造量大:5.7→8.4 长期运行,后续择机 9.7;8.4 生命周期到 2032 年,兼容性远优于 9.7。