必须用mysqlsh的util.checkforserverupgrade(),它是oracle官方唯一推荐的5.7→8.0升级前检查工具,可全面扫描字符集、认证插件、保留关键字、sql模式等关键兼容性问题,而mysqlcheck仅校验表结构,无法识别跨大版本语义变更。

直接上结论:别用 mysqlcheck 做 5.7→8.0 升级前检查,它根本看不到字符集、认证插件、保留字这些关键兼容性问题;必须用 mysqlsh 里的 util.checkForServerUpgrade(),这是 Oracle 官方唯一推荐且实际有效的预检方式。
为什么非得用 mysqlsh 的 util.checkForServerUpgrade()
因为 MySQL 5.7 和 8.0 在底层行为上存在实质性断裂:默认认证插件从 mysql_native_password 变成 caching_sha2_password,utf8mb3 被标记为废弃,RANK、JSON 等变成保留关键字,SQL mode 默认值也变了。这些都不是表结构损坏,mysqlcheck --check-upgrade 根本不扫描——它只查 .frm 文件是否匹配、触发器 definer 是否为空这类低层一致性,对升级失败的真正高发原因完全无感。
而 util.checkForServerUpgrade() 是专为跨大版本设计的,它会:
- 逐库扫描所有列名、索引名、存储过程名是否撞上 8.0 保留字
- 检查
CHARSET和COLLATION是否含utf8mb3 - 验证用户账户是否使用了
caching_sha2_password插件,并提示客户端驱动要求(如mysql-connector-java ≥ 8.0.13) - 识别
explicit_defaults_for_timestamp、query_cache_type这类 8.0 已移除的配置项是否仍在my.cnf中
执行 checkForServerUpgrade 的硬性前提
工具不是扔条命令就能跑通的,缺一不可:
-
mysql-shell二进制版本必须 ≥ 目标 MySQL 8.0 版本(例如要升到 8.0.42,就得用 mysql-shell-8.0.42) - MySQL 5.7 实例必须正在运行,且能被本地 socket 连通(强烈建议用
-S /tmp/mysql.sock,避免网络或权限干扰) - 连接用户需具备
SUPER权限和全库SELECT权限(root 最稳) - 若数据库启用了 SELinux(CentOS/RHEL),确保
mysqld进程上下文没被重置,否则 shell 连接可能被拒绝
典型命令示例:./mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade()" > upgrade_report.log
报告里哪些条目必须处理,哪些可以暂缓
输出分 ERROR、WARNING、NOTE 三级,只有 ERROR 是阻断性问题,不修完就别启动 8.0:
-
ERROR: Usage of utf8mb3 charset→ 必须批量执行ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci -
ERROR: Column name 'rank' is a reserved keyword in MySQL 8.0→ 列名得改,比如加前缀col_rank或用反引号包住(但后者治标不治本) -
ERROR: caching_sha2_password plugin not supported by client→ 不是让你立刻升级所有应用驱动,而是先在 8.0 启动时显式设default_authentication_plugin=mysql_native_password,留出缓冲期 -
WARNING: Partitioned table uses MyISAM engine→ 8.0 默认禁用 MyISAM,启动会失败,要么删表,要么提前转成 InnoDB -
NOTE: Found tables with pre-5.6.4 temporal columns→ 必须先在 5.7 上对这些表执行REPAIR TABLE,否则 8.0 启动直接卡死
容易被忽略的三个实操细节
很多人报告“检查通过了,一启 8.0 就失败”,往往栽在这三处:
- 检查完别忘了删掉或注释掉 5.7 配置里已废弃的参数,比如
innodb_file_format、query_cache_size,8.0 启动时遇到不认识的配置项会静默退出 -
mysqld --upgrade=FORCE是 8.0 启动后真正执行元数据升级的动作,不是mysql_upgrade(该命令在 8.0 中已被删除);如果跳过这步,系统表仍是 5.7 结构,后续任何 DDL 都可能报错 - 若原库有 MyISAM 表,8.0 默认不加载 MyISAM 引擎,启动日志里只会显示 “Plugin 'MyISAM' is disabled.”,但不会报错退出——直到你第一次访问 MyISAM 表才崩,所以务必提前确认或清理











