不能用mysqlcheck做升级前检查,因为它只校验表结构完整性、修复崩溃表,完全不感知mysql 8.0引入的utf8mb3弃用、caching_sha2_password认证插件、保留字rank、no_auto_create_user移除等语义级兼容性问题。

必须用 mysqlsh 的 util.checkForServerUpgrade(),其他工具(包括 mysqlcheck)对 5.7→8.0 的兼容性问题基本无效。
为什么不能用 mysqlcheck 做升级前检查
mysqlcheck 只校验表结构完整性、修复崩溃表,完全不感知 MySQL 8.0 引入的语义级变更。它不会报出:utf8 字符集已弃用、caching_sha2_password 认证插件不被老驱动支持、列名 rank 成为保留字、SQL 模式中 NO_AUTO_CREATE_USER 被移除等问题——而这些恰恰是升级后连接失败、查询报错、权限丢失的根源。
常见误操作:
- 运行 mysqlcheck -u root -p --all-databases --check-upgrade 后看到 “OK”,就以为万事大吉
- 把 mysqlcheck --repair 当成万能兜底,结果修完表照样启动失败
正确执行 util.checkForServerUpgrade() 的前提条件
这个函数是 Oracle 官方唯一推荐的跨大版本检查入口,但依赖环境必须干净:
- MySQL 5.7 实例必须正在运行,且
root用户可通过 socket(推荐)或 TCP 连接,权限至少含SUPER和全库SELECT - 必须使用与目标 8.0 版本匹配的
mysqlsh(例如升到 8.0.42,就得用 mysql-shell-8.0.42) - 避免网络干扰:优先用
-S /tmp/mysql.sock而非-h 127.0.0.1,防止因 host 解析或防火墙导致连接超时中断检查 - 命令示例(保存为 JSON 报告便于解析):
mysqlsh --uri root@localhost:3306 --sql -e "util.checkForServerUpgrade({targetVersion: '8.0.42', outputFormat: 'JSON'})" > upgrade_report.json
报告里哪些字段必须人工处理
输出 JSON 中的 summary 段落末尾的 overallStatus 是关键开关:只有 "OK" 才能继续。若为 "WARNING" 或 "ERROR",需逐条处理 description 字段指出的问题:
-
Usage of utf8mb3 charset→ 批量转字符集:ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;,再逐表ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4; -
caching_sha2_password plugin not supported by client→ 检查应用驱动版本;若无法升级(如 PyMySQL CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; -
Column name 'rank' is a reserved keyword→ 重命名列:ALTER TABLE t CHANGE rank rank_old VARCHAR(32); -
InnoDB Cluster detected (isInnoDBCluster: true)→ 必须停集群、逐节点升级,不能单点操作
检查通过后,仍可能卡在启动阶段的三个硬坑
即使 util.checkForServerUpgrade() 返回 OK,替换二进制包后 mysqld 启动失败仍是高频问题,核心原因不在数据,而在配置和引擎:
-
my.cnf中残留已废弃参数:query_cache_type、explicit_defaults_for_timestamp、log_warnings—— 启动直接报unknown variable并退出,必须删除或注释 - 存在 MyISAM 表(尤其是系统库里的
mysql.plugin)→ 8.0 默认禁用 MyISAM,启动失败;需在 5.7 下先执行:ALTER TABLE mysql.plugin ENGINE=InnoDB; - 数据目录权限或 SELinux 上下文错误(CentOS 7 常见)→ 确保
/var/lib/mysql所有者为mysql:mysql,且ls -Z显示 context 为mysqld_db_t
最容易被忽略的是:检查通过 ≠ 系统表已适配。首次用 8.0 的 mysqld 启动时,必须显式加 --upgrade=FORCE 参数触发数据字典升级,否则 performance_schema、权限视图等将为空或异常。











