必须先运行util.checkforserverupgrade()再执行mysqlcheck --check-upgrade,前者专查utf8mb3、保留字、caching_sha2_password等语义级风险,后者专查myisam表、year(2)、表损坏等物理结构问题,二者互补缺一不可;同时需手动排查系统库冲突表、孤立.frm文件及my.cnf废弃参数,并在测试环境验证sql_mode变更对业务sql的实际影响。

必须先跑 util.checkForServerUpgrade(),再跑 mysqlcheck --check-upgrade,两者缺一不可——前者查语义级风险(如保留字、字符集、认证插件),后者查物理结构问题(如引擎不支持、表损坏)。只做其中一个,大概率漏掉关键故障点。
用 mysqlsh 运行 util.checkForServerUpgrade() 扫描语义兼容性
这是 Oracle 官方唯一推荐的跨大版本前置检查入口,mysqlcheck 完全覆盖不了它检测的项。
- 必须用目标版本对应的
mysqlsh(比如升到 8.0.42,就得用mysql-shell-8.0.42)连接 5.7 实例,否则报告不准 - 命令示例:
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—— 这些不改完就不能升级 - 报告里出现
Authentication plugin 'caching_sha2_password' cannot be loaded?说明客户端驱动太老,得确认mysql-connector-java ≥ 8.0.13或PyMySQL ≥ 0.10.0
用 mysqlcheck --check-upgrade 检查表结构与存储引擎
mysqlcheck 是 5.7 自带工具,能发现 util.checkForServerUpgrade() 不会报的底层问题,比如 YEAR(2)、OLD_PASSWORD() 视图、MyISAM 系统表残留。
- 命令必须带参数:
mysqlcheck -u root -p --all-databases --check-upgrade - 重点看输出里含
requires upgrade或uses old password format的行,逐条修复 - 它不检测
sql_mode或字符集隐式转换,所以不能替代util.checkForServerUpgrade() - 若输出
error : The storage engine for the table is not supported in this version of MySQL,说明存在 MyISAM 表,需提前执行ALTER TABLE ... ENGINE=InnoDB
手动排查三类“隐形表”和配置残留
这两类问题不会被任何自动工具完整捕获,但极易卡住 mysqld --upgrade 启动流程。
- 查 MyISAM 表:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'MyISAM',结果非空必须改引擎 - 查系统库冲突表:
SELECT table_name FROM information_schema.tables WHERE table_schema='mysql' AND table_name IN ('roles','role_edges','components'),同名自定义表必须重命名或删掉 - 查孤立
.frm文件:停服务后进datadir,运行find . -name "*.frm" | grep -v "\.ibd$",有匹配项说明表已损坏,要么修复要么删 - 检查
my.cnf是否含废弃参数:mysqld --defaults-file=/etc/my.cnf --verbose --help | grep "Deprecated",重点清理query_cache_type、expire_logs_days、innodb_file_format
最易被忽略的是:util.checkForServerUpgrade() 和 mysqlcheck 都不检查 sql_mode 默认值变化对业务 SQL 的实际影响。哪怕报告全绿,上线后 ONLY_FULL_GROUP_BY 或 STRICT_TRANS_TABLES 也可能让旧 SQL 直接报错。必须在测试环境用真实流量验证关键查询路径。











