必须用util.checkforserverupgrade(),因mysqlcheck仅校验表物理完整性,不检测utf8mb3弃用、caching_sha2_password认证、rank等保留字冲突及only_full_group_by等sql模式变更。

必须用 util.checkForServerUpgrade(),别碰 mysqlcheck --check-upgrade ——它根本不会报字符集弃用、caching_sha2_password 认证失败、rank 列名冲突或 ONLY_FULL_GROUP_BY 导致的 SQL 报错。
为什么 mysqlcheck 不能代替升级兼容性检查
mysqlcheck 只校验表文件是否损坏、索引页是否断裂,属于存储引擎层的“身体体检”。它完全不解析 SQL 语义,也不比对版本间行为差异。
- 遇到
GROUP BY查询在 8.0 下因sql_mode变严而报错?mysqlcheck一声不吭 - 列名叫
window或system,升级后所有SELECT window FROM t全挂?mysqlcheck视而不见 - 客户端用老驱动连不上,卡在
Authentication plugin 'caching_sha2_password' cannot be loaded?mysqlcheck不查认证链 - 表默认字符集还是
utf8(即utf8mb3),8.0 虽兼容但已警告废弃?mysqlcheck不扫描字符集定义
运行 util.checkForServerUpgrade() 的硬性前提
这个函数是 MySQL Shell 8.0+ 自带的专用检查器,必须用 8.0 版本的 mysqlsh 连接 5.7 实例执行,不能反向操作。
- 下载并确保已安装
mysql-shell≥ 目标 MySQL 8.0 小版本(例如升到8.0.42,就得用mysql-shell-8.0.42) - 连接方式要带完整 URI:
mysqlsh --uri root@localhost:3306,不能只用 socket 或跳过端口 - 目标版本必须显式指定:
util.checkForServerUpgrade({targetVersion: '8.0.41'}),写成'8.0'会用默认值,可能漏检 - 若实例使用非标准配置文件,需通过
--config-path=/etc/my_57.cnf显式传入,否则可能读错sql_mode等设置 - 连接用户需具备
SUPER权限和全库SELECT权限(root最稳)
报告里哪些输出必须处理才能升级
检查结果里真正拦路的是 ERROR 和 WARNING 级别条目,summary 段末的 overallStatus 必须为 OK。
-
ERROR: Usage of utf8mb3 charset→ 所有 schema、table、column 的CHARACTER SET utf8都得改成utf8mb4,包括mysql系统库里的表(如mysql.plugin) -
ERROR: Column name 'rank' is a reserved keyword in MySQL 8.0→ 列名得改(比如加前缀col_rank),或应用中所有引用加反引号:SELECT `rank` FROM t -
ERROR: Usage of old temporal type→ 说明存在 5.5 之前创建的旧时间类型表,需在 5.7 上先执行ALTER TABLE t FORCE触发重建 -
WARNING: caching_sha2_password is used for user accounts→ 提示客户端驱动要求(如mysql-connector-java ≥ 8.0.13),不是阻断项但必须提前验证
最容易被忽略的是系统库表的字符集和触发器 definer ——它们不在业务代码里,却会在升级时直接中断数据字典迁移。别只扫自己建的库,mysql、sys、information_schema 也得一起过一遍。











