不能靠mysqldump导出再导入实现平滑升级,因会导致字符集错乱、认证失败、系统表损坏;必须走原地升级路径并配合主从滚动或代理灰度,mysql 8.0.16起mysqld启动时自动执行元数据升级,mysql_upgrade已被废弃,手动运行会报错或静默失效。

不能靠 mysqldump 导出再导入实现平滑升级,这会导致字符集错乱、认证失败、系统表损坏;真正的平滑升级必须走原地升级路径,并配合主从滚动或代理灰度,否则“业务无感”只是假象。
为什么 mysql_upgrade 在 8.0.16+ 启动后就失效了
MySQL 8.0.16 起,mysqld 启动时会自动检测数据目录版本并执行元数据升级(如重建 mysql.component、mysql.role_edges),不再依赖外部调用 mysql_upgrade。此时手动运行它,大概率报错:ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded——因为它试图用旧客户端协议连接已升级的实例,或直接静默退出。你看到的“升级成功”只是假象;真正触发升级的是首次用 8.0 的 mysqld 启动并带上 --upgrade=FORCE 参数。
升级前必须用 mysqlsh 扫描兼容性断裂点
mysqlcheck 只检查表结构完整性,不识别语义变更;唯一靠谱的前置检查是 mysqlsh 的 util.checkForServerUpgrade():
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 下载匹配目标版本的
mysql-shell(例如 8.0.42),不要混用 5.7 的 shell - 确保 5.7 实例正在运行,且
root有SUPER和全库SELECT权限 - 执行:
mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade()" - 报告里出现
ERROR级别条目必须处理完才能继续,比如:
—Usage of utf8mb3 charset→ 批量转utf8mb4
—Column name 'rank' is a reserved keyword→ 改列名
—caching_sha2_password plugin not supported by client→ 检查应用驱动版本(如mysql-connector-java ≥ 8.0.13)
Windows 下原地升级最容易卡在服务注册和权限继承
Windows 环境下升级失败,90% 不是配置写错,而是底层不兼容:
- 确认当前 5.7 实例关闭干净:
net stop MySQL后检查任务管理器无残留mysqld.exe进程 - 备份并重命名原
my.ini(如改为my.ini.57.bak),新配置中必须显式设置:default_authentication_plugin=mysql_native_password,否则老 PHP/Java 客户端连不上 - 服务名默认仍是
MySQL,替换bin后若未执行sc delete MySQL && mysqld --install,旧服务配置仍指向 5.7 的my.ini和路径,导致启动失败 - 确保
datadir目录权限继承正确——Windows 服务以 LocalSystem 或自定义账户运行,权限缺失会导致mysqld无法读写系统表文件
生产环境推荐主从滚动升级而非单点原地升级
单点原地升级风险高、回滚成本大;主从滚动才是真实业务场景下的平滑解法:
- 先升级所有从库:停一个从库 → 替换二进制 + 修改
my.ini→ 启动mysqld(自动触发元数据升级)→ 启动复制并验证Seconds_Behind_Master = 0 - 逐台轮换,确保至少一台从库始终可用作故障切换源
- 最后通过高可用工具(如
orchestrator或 MHA)执行主从切换,将流量切到已升级的从库,原主库降为从库后再升级 - 全程监控
Aborted_clients、慢查询突增、连接数抖动——这些比“服务起来”更能反映是否真平滑
最常被忽略的其实是升级后的权限校验和字符集行为回归:比如 SELECT a FROM t GROUP BY a 在 5.7 能跑,在 8.0 默认开启 ONLY_FULL_GROUP_BY 就会直接拒绝;又比如应用没显式指定 collation_server,升级后 utf8mb4_0900_ai_ci 的排序行为可能让前端搜索结果顺序异常。这些不会在启动日志里报错,但会在业务请求中悄悄爆发。










