升级前先冷静:yum update 居然会偷偷把你的 MySQL 主版本换掉
事故现场
2026-04-21,MySQL 9.7.0 LTS 发布。按官方口径,9.7 属于 LTS 序列,比 9.5/9.6 这种短期版本更值得生产环境关注。
但真正让运维人捏把汗的,不是版本号,而是 Peter Zaitsev(Percona 创始人)在发布后立刻点名的一个坑:
常规
yum/dnf update会把服务器所遵循的主版本切到 9.7。
不是你在 yum install mysql-server-9.7,也不是你在 my.cnf 里改了版本配置,而是包管理器静默帮你换了主版本。
这是最反直觉的地方:你只是做了日常安全更新,结果升级完成后 MySQL 主版本可能已经不是 8.4 LTS 了。
根因:mysql-community.repo 包更新踩中了 Bug #120315
MySQL 官方仓库通过 mysql-community.repo 这个 RPM 包来管理各个 Yum 源的定义。正常情况下:
- 8.4 LTS 仓库是默认启用的;
- 9.7 LTS 仓库是默认禁用的。
但在 9.7.0 发布后,mysql-community.repo 包更新里出现了一个错误,编号 MySQL Bug #120315。该错误的影响是:
- 静默禁用 8.4 LTS 仓库;
- 自动启用 9.7 LTS 仓库。
也就是说,当你执行:
yum update
或:
dnf update
如果这个 repo 包本身也被一起更新了,那么 MySQL 的 Yum 仓库指向会事后变成“只有 9.7 LTS 可用、8.4 LTS 不可用”。此时再执行任何安装/升级 MySQL 相关包的操作,依赖解析就会把你拉到 9.7 这条主版本线上。
坑就坑在“静默”两个字上:update 过程不会提示你“主版本已切换”,也不会弹 warning,只有更新完重启 MySQL 后,你才发现跑的是 9.7 全家桶。
认证方式迁移:9.7 已经移除 mysql_native_password
主版本被切到 9.7,另一个连带伤害就是认证插件兼容性。
- 9.7.0 起,
mysql_native_password认证插件已彻底移除。 - 旧的客户端如果只支持
mysql_native_password,且不具备CLIENT_PLUGIN_AUTH能力,将无法连接 9.7 服务器。 - 8.4.9 LTS 中,
mysql_native_password仍然是默认禁用的,但可以通过参数mysql_native_password=ON手动开启。
言外之意:8.4 至少给了你一个过渡期;9.7 则没有退路。
官方路径:8.0 → 8.4 LTS → 9.7 LTS
官方推荐的升级路径是:
8.0.x → 8.4.9 LTS → 9.7.0 LTS
不建议从 8.0 直接跳 9.7。原因在于:
- 主版本跨越过大,认证方式、默认参数、数据字典行为都可能出现兼容问题;
- 8.4 作为过渡版本,可以提前验证认证插件迁移是否完成;
- 如果直接跳 9.7,
mysql_native_password用户连登录的机会都没有,必须先处理账号的认证插件。
换句话说,9.7 不是不能上,而是要先过 8.4 这一关做“兼容性验证 + 认证方式迁移”,而不是让 repo 包 Bug 帮你做决定。
运维建议:升级前先核对 repo 状态
以下所有命令均在升级执行前做,且建议单独执行
yum update mysql-community.repo后再次核验。
1. 查看当前 repo 指向
cat /etc/yum.repos.d/mysql-community.repo
重点关注:
mysql-8.4-lts-community的enabled是否为1;mysql-9.7-lts-community的enabled是否为0。
如果发现 8.4 LTS 被禁用、9.7 LTS 被启用,这就是 Bug #120315 的典型表现。
2. 用 dnf repolist / yum repolist 核对
dnf repolist --all | grep mysql
或:
yum repolist --all | grep mysql
正常情况下,8.4 LTS 仓库标记为 enabled,9.7 LTS 仓库标记为 disabled。
3. 临时固定版本
如果暂时不想上 9.7,可以用包管理器锁定 MySQL 服务包版本:
dnf versionlock add mysql-server* mysql-community-server*
或直接在 repo 文件中强制固定 8.4 LTS:
[mysql-8.4-lts-community]
enabled=1
[mysql-9.7-lts-community]
enabled=0
固定后再次 dnf update mysql-server 时应停留在 8.4.9 LTS 版本。
建议:每次做通用
yum update前后,都把上面三步重跑一遍。这不是例行公事——在 Bug #120315 存在的阶段,仓库状态可能随时被 repo 包更新篡改。
小结
| 事项 | 结论 |
|---|---|
| 触发场景 | 常规 yum/dnf update 更新 mysql-community.repo 包 |
| 错误编号 | MySQL Bug #120315 |
| 影响行为 | 静默禁用 8.4 LTS 仓库、自动启用 9.7 LTS 仓库 |
| 直接后果 | MySQL 主版本被切到 9.7(LTS) |
| 最大风险 | 9.7 已移除 mysql_native_password,旧客户端无法连接 |
| 8.4.9 | 默认禁用,可手动 mysql_native_password=ON |
| 官方路径 | 8.0.x → 8.4.9 LTS → 9.7.0 LTS |
| 升级前检查 | dnf repolist / yum repolist 核对 enabled 状态 |
| 临时固定 | versionlock 或修改 repo 的 enabled 标志 |
包的 Bug 可以修,但被 repo 静默拉高主版本这件事,不是靠自觉就能避免的——每次跑 update 前多看一眼 repolist 输出,成本比回滚低得多。