必须使用目标版本的MySQL Shell运行util.checkForServerUpgrade(),例如升级到8.0.45就需用MySQL Shell 8.0.45,否则可能漏报caching_sha2_password等新增校验项,导致升级后连接失败。

必须用目标版本的 mysqlsh 运行 util.checkForServerUpgrade()
用错 mysqlsh 版本会导致检查漏报或误报。比如升到 8.0.45,就得用 MySQL Shell 8.0.45 自带的二进制,不能混用 8.0.27 或 8.4 的包。官方不保证跨 minor 版本的检查逻辑一致性。
常见错误现象:报告里没提 caching_sha2_password 兼容性问题,但升级后应用连不上——大概率是用了低版本 mysqlsh,它压根不识别 8.0.40+ 新增的认证插件校验项。
- 下载地址必须匹配目标 MySQL 版本,例如升到
8.0.45就去 dev.mysql.com 下载mysql-shell-8.0.45 - 连接方式优先走 socket:
./mysqlsh -uroot -p -S /tmp/mysql.sock,避免网络层干扰或防火墙误判 - 执行用户需具备
SELECT(遍历information_schema)和LOCK TABLES(临时加锁校验)权限
报告里的 ERROR 必须修复,WARNING 得结合场景判断
util.checkForServerUpgrade() 输出分三级:ERROR 阻断升级、WARNING 可能引发运行时异常、NOTICE 是提示项。别只扫一眼 summary 就跳过。
典型 ERROR 条目:
-
Usage of utf8mb3 charset:所有表/库/列的CHARACTER SET utf8必须批量转成utf8mb4,否则 8.0 启动失败 -
Column name 'rank' is a reserved keyword:列名含rank、window、system等,得用反引号包裹或重命名 -
caching_sha2_password plugin not supported by client:确认应用驱动版本,如mysql-connector-java必须 ≥8.0.13
WARNING 里最易被忽略的是 Column uses old temporal type —— 比如 DATETIME 没写精度(DATETIME(3)),升级后时区行为可能不一致,但工具不标 ERROR。
检查前必须导出 schema 并人工 grep 字符集与排序规则
util.checkForServerUpgrade() 不解析建表语句里的字符集继承链,它只看实际存储值。你 SHOW CREATE TABLE 看起来没问题,但实际可能隐式继承了 latin1 或 utf8_general_ci。
执行命令:mysqldump -u root -p --no-data --skip-triggers --skip-routines --databases db1 db2 > schema.sql
重点筛查:
-
grep -i "charset\|collate" schema.sql | grep -v "utf8mb4_0900_as_cs":找出非推荐排序规则 -
grep -i "type=text" schema.sql | grep -i "json":确认 JSON 字段没被误定义为TEXT -
grep -i "engine=myisam" schema.sql:MyISAM 表在 8.0 默认禁用,启动直接失败
升级后别碰 mysql_upgrade,改用 mysqld --upgrade=FORCE
mysql_upgrade 在 8.0 中已彻底移除,运行就报 Command not found。真正触发数据字典升级的是 mysqld 启动时的内部动作,但必须显式要求。
安全模式启动命令:mysqld --skip-grant-tables --skip-networking --datadir=/var/lib/mysql --upgrade=FORCE
注意点:
-
--upgrade=FORCE必须带上,否则 8.0 会跳过升级步骤,导致系统表结构不匹配 - 启动前确保
default_authentication_plugin=mysql_native_password已写入配置,否则老客户端连不上 - 若原实例启用了 SELinux,启动失败时先检查上下文:
ls -Z /var/lib/mysql,必要时用restorecon -Rv /var/lib/mysql
真正麻烦的不是检查本身,而是那些报告里没写、但 dump 出来才暴露的字符集继承问题——比如某张表建在 utf8 库下,自己没声明 charset,结果字段全按 utf8mb3 存,检查工具扫不到,升级后索引失效。这类问题只能靠 mysqldump --no-data + grep 扫出来。


















