手上几台 5.7 的库要升 8.0,第一反应是 yum update mysql-server 然后重启?别。我见过这么干的,重启完应用连不上,查半天发现是认证插件变了,账号全废了。升级这种事,慢就是快。
先跑官方预检,别凭感觉
MySQL Shell 自带的 util.checkForServerUpgrade 能扫一遍,告诉你哪些地方 8.0 不兼容:
mysqlsh root@127.0.0.1:3306 -e "util.checkForServerUpgrade()"
它会输出一份清单,比如:用了保留字当列名、表用了过时数据类型、sql_mode 里开了已移除的选项、有 mysql 系统库的表结构改动等等。先在测试库跑一遍,把报的红项清掉再动生产。
8.0 到底改了什么会坑你
我踩过和见过的几个重灾区:
1. 默认认证插件变了
5.7 是 mysql_native_password,8.0 默认 caching_sha2_password。老版本的驱动(尤其某些 Python 2 的库、老 JDBC)不认,连接直接报错。要么升级驱动,要么建账号时显式指定:
CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';
-- 或者全局改回老的(不推荐长期,但能先救急)
-- default_authentication_plugin=mysql_native_password
2. 查询缓存没了
5.7 的 query_cache_type / query cache 整个删了。如果你的应用或中间件靠它加速,升级后这部分直接失效,性能可能反而掉。得想清楚是不是要上 ProxySQL 之类的外部缓存来补。
3. 默认 sql_mode 更严
8.0 默认带 ONLY_FULL_GROUP_BY。那种 SELECT a, b, COUNT(*) FROM t GROUP BY a 在 5.7 能糊弄过去的,8.0 直接报错。还有 NO_ZERO_DATE、STRICT_TRANS_TABLES 默认开,插 '0000-00-00' 这类脏数据会失败。
4. 一些语法和函数被弃用/移除
GROUP BY 隐式排序没了(得自己写 ORDER BY),某些旧函数报错,utf8 别名指向 utf8mb4(这其实是好事,但老代码里写死 utf8 长度的地方要留意)。
5. 系统表结构动了
mysql 库的表改了不少,所以升级后必须跑一次升级流程(见下)。直接拷数据目录是不行的。
升级路线怎么选
原地升级(in-place):停库 → 换二进制 → 启动 → 让 server 自己升级数据字典。8.0 里 mysql_upgrade 已经基本被废弃,直接启动 mysqld,它检测到版本低会自动完成升级(日志里能看到 Upgrading ...)。适合单实例、停机窗口够、盘上数据不大动的场景。
systemctl stop mysqld
# 换好 8.0 的二进制后
systemctl start mysqld # 启动即触发数据字典升级
# 盯日志确认升级完成,再对外放流量
journalctl -u mysqld -f | grep -i "upgrade"
逻辑升级(dump/restore):mysqldump 全量导出 → 在干净的 8.0 实例里导入。慢,但对大版本跨度最稳,顺带能把历史碎碎片整理掉。生产大库基本都走这条,配合主从:先在从库升,验证没问题再切主。
我推荐的稳妥流程
- 全量备份,且能真的恢复(别只备份不演练,升级前 restore 一次验证)。
- 用
checkForServerUpgrade清红项。 - 先在从库 / 测试环境升一遍,跑业务回归。
- 应用侧确认驱动支持
caching_sha2(不支持就按上面建 native 账号)。 - 生产选低峰,原地还是逻辑看库大小和停机窗口。
- 升完先不放全量流量,冒烟跑一会儿再切。
翻车了怎么回
原地升级前务必留一份二进制 + 数据目录的完整冷备。8.0 的数据字典格式回不去 5.7,只能是"把 5.7 的数据目录整体恢复"。所以那个冷备是关键——不是逻辑 dump,是整目录拷贝。逻辑 dump 也留一份双保险。
别信"升级失败再降回去",MySQL 大版本升上去就没有官方降级通道。回滚 = 恢复备份,就这么朴素。
一个常被忽略的点
升级前看一眼 /etc/my.cnf 里有没有 8.0 已经不认的参数。比如 query_cache_size、query_cache_type、innodb_log_files_in_group 某些组合、老的 tx_isolation(改名叫 transaction_isolation)。这些在 8.0 启动时会直接报 unknown variable 起不来,比功能不兼容还尴尬——参数文件得跟着改。
最后说句实在的:5.7 官方支持早就到期了,晚升不如早升,但升之前花的那半天预检,比升之后半夜救火值钱得多。

