util.checkforserverupgrade()是oracle官方唯一推荐的mysql 5.7→8.0升级前检查工具,可系统扫描字符集、认证插件、保留关键字、sql模式等兼容性问题,并生成修复建议。

mysqlsh 的 util.checkForServerUpgrade() 是唯一靠谱的前置检查方式
别用 mysqlcheck——它不支持跨大版本兼容性扫描,只做表结构校验和修复,对 5.7→8.0 的字符集、认证插件、保留字、SQL 模式等关键变更完全无感知。真正该用的是 MySQL Shell 自带的 util.checkForServerUpgrade(),它是 Oracle 官方唯一推荐的升级前检查工具。
执行前确保:
- 已下载匹配目标版本(如 8.0.27)的 mysql-shell 二进制包
- MySQL 5.7 实例处于运行状态,且能通过 socket 或 TCP 连接(推荐用 -S /tmp/mysql.sock 避免网络干扰)
- root 用户有足够权限(至少 SUPER 和 SELECT 全库权限)
典型命令:./mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade()" > upgrade_report.log
报告里出现 ERROR 级别条目必须修复,比如:
- Usage of utf8mb3 charset:需批量转为 utf8mb4
- caching_sha2_password plugin not supported by client:得提前确认应用驱动版本(如 mysql-connector-java ≥8.0.13)
- Column name 'rank' is a reserved keyword in MySQL 8.0:列名要重命名
in-place 升级时 mysqld 启动失败的常见原因
替换二进制、停旧服务、启新 mysqld 后卡在 “Starting MySQL” 或报错退出,大概率是配置或数据字典不兼容。不是所有参数都能直接沿用。
关键动作:
- 删除或注释掉 5.7 中已废弃的配置项,例如:query_cache_type、innodb_file_format、explicit_defaults_for_timestamp
- 必须显式设置 default_authentication_plugin=mysql_native_password,否则老客户端连不上(除非你已统一升级驱动)
- 若原库含 MyISAM 表,8.0 默认禁用 MyISAM 引擎,启动会失败;要么删掉这些表,要么临时加 skip-grant-tables 启动后导出再重建
- 数据目录权限必须为 mysql:mysql,且 SELinux 上下文不能被破坏(CentOS 7 常见问题)
升级后 mysql_upgrade 已被弃用,改用 mysqld --upgrade=FORCE
MySQL 8.0 不再提供 mysql_upgrade 工具,强行运行会提示 “Command not found” 或 “This command is deprecated”。真正的升级动作发生在首次用 8.0 的 mysqld 启动时,但必须明确触发。
正确做法:
- 先以安全模式启动:mysqld --skip-grant-tables --skip-networking --datadir=/var/lib/mysql
- 再另起终端执行:mysqld --upgrade=FORCE --datadir=/var/lib/mysql
- 观察错误日志中是否出现 Upgrading system tables 和 Checking and upgrading tables 日志段
- 成功后正常重启服务,勿遗漏 --skip-grant-tables 的清理
注意:--upgrade=FORCE 会强制重刷数据字典表(mysql.*),如果中途断电或 kill,可能导致实例无法启动,务必在维护窗口操作并备份 mysql 库。
字符集与排序规则不一致引发的隐式转换性能暴跌
5.7 默认 latin1 + latin1_swedish_ci,8.0 默认 utf8mb4 + utf8mb4_0900_ai_ci。升级后若表/列仍保持旧字符集,而连接层用新默认值,就会触发隐式转换,索引失效,查询变慢几倍甚至几十倍。
验证方法:SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'your_db';SHOW CREATE TABLE your_table; 对比字段定义里的 CHARACTER SET 和 COLLATE
批量修正建议:
- 修改库级默认:ALTER DATABASE your_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
- 逐表转换(避免锁表太久):ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
- 客户端连接字符串必须显式指定:?characterEncoding=utf8mb4&serverTimezone=UTC
最易忽略的是 information_schema 和 performance_schema 本身不支持修改字符集,它们的行为由 server 层决定,所以必须从 my.cnf 统一控制:character-set-server=utf8mb4 和 collation-server=utf8mb4_0900_ai_ci。











