必须用util.checkForServerUpgrade()做前置兼容性扫描,这是Oracle官方唯一推荐的跨大版本检查入口,可识别utf8mb3字符集、保留字冲突、认证插件不兼容等问题;跳过该检查将导致启动失败或半夜告警。

直接升级可行,但必须满足两个硬条件:当前是 5.7.35 或更高小版本(如 5.7.42),且数据目录中不能存在 MyISAM、MEMORY 或 RocksDB 引擎的系统表或用户表。跳过检查或强行覆盖安装,大概率会在启动时卡在 mysqld 初始化阶段报错退出。
升级前必须跑 util.checkForServerUpgrade()
这个检查不是可选项,是 MySQL 官方强制推荐的准入门槛。它会扫描 20+ 项兼容性问题,比如:
-
NO_AUTO_CREATE_USER出现在sql_mode中 → 8.0 已移除,必须删掉 - 表名/列名/存储过程名撞上 MySQL 8.0 新增保留字(如
rank、json)→ 会直接导致升级失败 - 使用了
utf8字符集而非utf8mb4→ 升级后可能触发隐式转换异常 - 存在
MyISAM表 → 必须先用ALTER TABLE t ENGINE=InnoDB转换
执行方式(以 socket 连接为例):
./mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade()" > check.log
报告里标为 ERROR 的条目必须全部修复,WARNING 建议处理。别信“先升再改”的说法——升级失败后回退成本远高于提前清理。
Ubuntu 下用 APT 升级要小心 mysql-server 包冲突
Ubuntu 默认源里的 mysql-server 仍是 5.7,直接 apt install mysql-server 不会升级到 8.0,反而可能因依赖冲突中断服务。正确路径是:
- 先卸载旧包:
sudo apt remove --purge mysql-server mysql-client mysql-common - 手动清理残留:
sudo rm -rf /etc/mysql /var/lib/mysql(注意:这会删配置和数据目录,仅适用于你已用mysqldump备份完) - 添加官方 APT 源:
wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb→sudo dpkg -i→ 配置界面里选mysql-8.0 - 再执行:
sudo apt update && sudo apt install mysql-server
关键点:安装过程会提示设置 root 密码,此时默认认证插件是 caching_sha2_password。如果老应用连接报 Client does not support authentication protocol,得进新实例执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpwd';
my.cnf 里这几个参数不调,mysqld 启动就失败
MySQL 8.0 对配置更严格,原 5.7 的 my.cnf 直接复用大概率报错。必须调整的项有:
-
default_authentication_plugin=mysql_native_password(如需兼容旧客户端) -
character-set-server=utf8mb4和collation-server=utf8mb4_0900_ai_ci(避免字符集降级警告) - 删掉所有含
NO_AUTO_CREATE_USER的sql_mode设置 -
basedir和datadir路径要指向新二进制目录(如/usr/local/mysql8)和原有数据目录(如/var/lib/mysql)
特别注意:innodb_log_file_size 如果比 5.7 时期设得大,首次启动时会卡住并报 InnoDB: The log file size is changed —— 这时只能删掉 ib_logfile* 文件再试,但前提是确认没未刷盘事务。
最易被忽略的是系统表升级时机:8.0.16 及之后版本由 mysqld 自动完成,但如果你用的是 8.0.15 或更早,必须手动跑 mysql_upgrade -u root -p;而这个命令在 8.0.16+ 已被标记为废弃,执行会直接报错。版本边界模糊的地方,宁可查 mysqld --version 确认清楚,别凭印象操作。


















