升级前必须验证备份是否可用
很多团队以为执行过
mysqldump或启用了物理备份就万事大吉,结果升级失败后发现备份文件损坏、权限不可读、或缺少
mysql系统库导出。真实场景中,约 30% 的升级回滚失败源于备份未实测恢复。 用
mysql -u root -p 在测试库中完整重放一次(不只是检查语法)若使用
xtrabackup,必须运行
xtrabackup --prepare+
xtrabackup --copy-back全流程验证 确认备份包含
mysql、
sys、
information_schema(后者虽是视图,但升级可能依赖其结构)
跳过主版本升级(如 5.7 → 8.0)的隐式陷阱
MySQL 官方不支持跨主版本直接升级(例如跳过 5.7 → 8.0),但更危险的是“看似平滑”的小版本升级——比如从
5.7.32升到
5.7.40,仍可能因
sql_mode默认值变更、
innodb_strict_mode启用、或 JSON 字段解析逻辑调整导致应用报错。 升级前务必在测试环境运行
mysql_upgrade --dry-run,它会列出所有需修复的表和系统对象 检查
error log中是否有
[Warning] InnoDB: Table xxx contains virtual generated column类提示,这类结构在旧版本无校验,8.0+ 可能拒绝启动
my.cnf中显式声明已知兼容项,例如:
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION",避免继承新版本默认值
升级后必须立刻执行的三件事
二进制包或 RPM 安装完成后,服务能启动 ≠ 数据库就绪。MySQL 升级不是替换可执行文件那么简单,系统表结构、数据字典、甚至查询优化器统计信息都可能滞后。
手动运行mysql_upgrade -u root -p(注意:8.0.16+ 已弃用该命令,改用
mysqld --upgrade=FORCE) 重启后立即执行
SELECT VERSION(), @@version_comment;确认实际运行版本,曾有案例因
PATH混淆导致仍调用旧版
mysqld对所有业务库逐个执行
ANALYZE TABLE,否则优化器可能沿用旧统计信息,引发慢查询突增
滚动升级不适用于大多数生产 MySQL 架构
有人试图在主从架构中先升从库、再切主,以为能实现“零停机”。但 MySQL 主从复制协议本身不具备跨版本兼容性保障:5.7 的 binlog event 格式在 8.0 的从库上可能解析异常;反之,8.0 主库生成的
binlog_transaction_compression特性在 5.7 从库上直接报错
Unknown binlog event type。 主从版本差必须控制在 同一主版本内(如 8.0.28 ↔ 8.0.33),且建议 patch 版本差 ≤ 3 GTID 模式下升级更敏感,
gtid_executed和
gtid_purged的序列化格式在 8.0.23 有变更,跨此版本需额外
RESET MASTER清理 真正安全的做法仍是停写窗口 + 备份验证 + 单点升级,把“不停机”期望让给应用层灰度或数据库代理层 升级最常被忽略的其实是字符集继承行为:比如 5.7 默认
utf8mb4但排序规则是
utf8mb4_general_ci,而 8.0.29+ 新建库默认用
utf8mb4_0900_as_cs。如果没在
CREATE DATABASE时显式指定
COLLATE,老应用连上来查中文可能返回空结果——这不是 bug,是排序规则语义变了。
