不能靠mysqldump导出再导入实现平滑升级,必须用util.checkForServerUpgrade()做前置兼容性扫描——这是Oracle官方唯一推荐的跨大版本检查入口,可识别utf8mb3字符集、保留字冲突、认证插件不兼容等问题。

不能靠 mysqldump --all-databases 直接导出再导入——这会把 5.7 的 mysql 系统库、utf8mb3 字符集定义、MyISAM 引擎表、PASSWORD() 函数等一并塞进 8.0,轻则中文索引失效、权限丢失,重则启动失败、半夜告警。
必须用 util.checkForServerUpgrade() 做前置兼容性扫描
这是 Oracle 官方唯一推荐的跨大版本检查入口,mysqlcheck --check-upgrade 只校验表结构损坏,对语义级变更(如字段名 rank 是保留字、NO_AUTO_CREATE_USER 已移除)完全无感。
- 必须用与目标版本一致的
mysqlsh(比如升到8.0.42,就得用mysql-shell-8.0.42) - 连接优先走 socket:
./mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade({'configPath': '/etc/my.cnf'})" - 输出重定向后,只信
ERROR级条目:比如Usage of utf8mb3 charset或Column name 'rank' is a reserved keyword,这些不改完就不能继续 - 报告里出现
caching_sha2_password plugin not supported by client?说明你的应用驱动太老,得确认mysql-connector-java ≥ 8.0.13或PyMySQL ≥ 0.10.0
原地升级前必须清理三类“隐形表”
不是所有表都能被 mysqld --upgrade=FORCE 自动处理,卡住启动的往往是那些名字撞了系统表、引擎不兼容、或残留结构异常的表。
- 查
MyISAM表:SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'MyISAM',结果非空就得先ALTER TABLE ... ENGINE=InnoDB - 查系统库冲突:
SELECT table_name FROM information_schema.tables WHERE table_schema='mysql' AND table_name IN ('roles','role_edges','components'),这些是 8.0 新增系统表,自定义同名表必须重命名或删掉 - 查孤立
.frm文件:停服务后进datadir目录,find . -name "*.frm" | grep -v "\.ibd$" | head -10,若有匹配项,对应表已损坏,要么修复要么删掉
my.cnf 里必须删掉的废弃参数
8.0 启动时遇到 unknown variable 错误,90% 是因为配置文件里还留着 5.7 的过期参数,日志里不会告诉你具体哪一行,只会卡在 “Starting MySQL”。
-
query_cache_type、explicit_defaults_for_timestamp、log_warnings—— 全部删掉 - 必须显式加:
default_authentication_plugin=mysql_native_password(否则老客户端连不上) - 字符集相关必须补全:
collation-server=utf8mb4_unicode_ci和character-set-server=utf8mb4 - 如果用了 SELinux(尤其 CentOS 7),升级后要重置上下文:
chcon -R --reference=/var/lib/mysql /usr/local/mysql
升级后第一分钟该验证什么
进程起来了 ≠ 数据库就绪。以下四条命令缺一不可,漏一条都可能埋下第二天凌晨的故障。
-
SELECT VERSION(), @@sql_mode;—— 确认版本是8.0.x,且ONLY_FULL_GROUP_BY在sql_mode里 -
SELECT * FROM performance_schema.replication_applier_status_by_coordinator;—— 如果开了复制,这里必须显示APPLYING状态 -
SHOW VARIABLES LIKE 'default_authentication_plugin';—— 返回mysql_native_password才算安全 -
SELECT COUNT(*) FROM mysql.user WHERE authentication_string = '' OR plugin = '';—— 结果必须为 0,否则存在空密码或插件未初始化用户
最容易被忽略的是系统库一致性:8.0 重构了 mysql 库结构,user 表字段从 password 改成 authentication_string,plugin 字段类型也变了。跳过 util.checkForServerUpgrade() 或硬覆盖二进制包,大概率导致权限系统静默损坏,表面能连,实际 SHOW GRANTS 为空、CREATE USER 报错、甚至备份脚本悄悄失败。


















