能,必须用mysql shell 8.0.21+(推荐8.0.33+)连接mysql 5.7实例执行util.checkforserverupgrade(),它扫描字符集、认证插件、保留字等30+类兼容性风险并输出结构化报告。

MySQL Shell 的 upgrade checker 能不能直接检查 5.7 到 8.0 升级兼容性?
能,但必须用 MySQL Shell 8.0+ 连接 MySQL 5.7 实例运行 util.checkForServerUpgrade(),低版本 Shell 不支持该函数。它不是“模拟升级”,而是扫描系统库、SQL 模式、废弃语法、字符集等 30+ 类风险项,输出结构化报告。
常见错误现象:TypeError: util has no attribute 'checkForServerUpgrade'——说明你用的是 MySQL Shell 5.7 或 6.0 版本,必须升级到 8.0.21+(推荐 8.0.33+)才内置完整检查逻辑。
- 连接前确认 Shell 版本:
mysqlsh --version - 必须用具备
SELECT和SHOW权限的账号连接,不需root,但需能访问information_schema、mysql、所有业务库 - 不支持远程跳转代理(如 SSH 隧道中套一层代理),直连 IP:PORT 最稳
执行 util.checkForServerUpgrade() 时哪些参数最关键?
默认调用会检查全部库,但实际生产环境往往要排除测试库或归档库,否则误报率高。核心是 config 参数对象里的过滤项:
-
targetVersion: "8.0.32":明确指定目标版本,不同 8.0.x 小版本对utf8mb3、NO_ZERO_DATE等处理有差异,别写成"8.0" -
skipChecks: ["catalogs"]:跳过 catalog 名称检查(MySQL 5.7 无 catalog 概念,此项常误报) -
excludeSchemas: ["test_db", "archive_2022"]:传数组,避免扫描无关库拖慢速度或引入噪声 -
outputFormat: "JSON":比默认的表格输出更易解析,配合jq做自动化判断
示例调用:
mysqlsh --uri user@host:3306 --sql -e "util.checkForServerUpgrade({targetVersion: '8.0.32', excludeSchemas: ['tmp_log'], outputFormat: 'JSON'});"
检查报告里哪些 Warning 必须人工确认,不能靠自动修复?
upgrade checker 不改数据,只报风险。以下几类 Warning 出现即需 DBA 介入评估,脚本无法决策:
-
INVALID_DEFAULT_VALUE_FOR_TABLE:表定义含非法默认值(如DATETIME DEFAULT '0000-00-00 00:00:00'),8.0 严格模式下建表失败,得手工改ALTER TABLE ... ALTER COLUMN ... SET DEFAULT ... -
PLUGIN_IS_NOT_AVAILABLE:如query_cache插件在 8.0 已移除,但配置文件里还开着,启动会失败 -
INFORMATION_SCHEMA_TABLE_DIFFERS:某些第三方监控工具直接查information_schema.PROCESSLIST,而 8.0 把它移到performance_schema,应用代码要改 -
CHARSET_MISMATCH:库/表/列字符集混用utf8和utf8mb4,升级后排序规则行为变化,可能引发 JOIN 结果异常
为什么检查完还得跑 mysql_upgrade?它和 Shell 检查是什么关系?
mysql_upgrade 是升级后(服务已启为 8.0)执行的元数据修复工具;Shell 的 util.checkForServerUpgrade() 是升级前静态扫描。两者完全不重叠,也不可互相替代。
容易踩的坑:
- 有人把 Shell 检查通过当成“可以立刻升级”,结果升级后因未清理
mysql.plugin表残留项,导致服务反复崩溃 -
mysql_upgrade必须用 8.0 的二进制执行,且需重启 mysqld 后再运行,不能在 5.7 进程里跑 - Shell 检查不会告诉你
my.cnf里哪些配置项已废弃(如query_cache_type),得靠人工对照 官方弃用列表
真正卡点往往不在 SQL 兼容性,而在配置项、插件依赖、备份恢复链路是否适配 8.0 的 redo log 格式变更——这些 Shell 检查覆盖不到,得单独验证。











