必须用mysqlsh的util.checkforserverupgrade()做5.7→8.0升级前检查,它能全面扫描字符集、认证插件、保留关键字等兼容性问题;mysqlcheck仅校验表结构,无法识别跨版本语义变更。

不能靠 mysqldump 导出再导入实现平滑升级——这会导致字符集错乱、认证失败、系统表损坏;mysql_upgrade 在 8.0.16+ 已废弃,手动运行无效甚至报错;真正的升级动作发生在首次用 8.0 的 mysqld 启动时,且必须显式触发。
如何用 mysqlsh 做真实有效的升级前兼容性扫描
这是唯一被 Oracle 官方推荐、能识别跨大版本语义变更的前置检查方式。mysqlcheck --check-upgrade 只校验表结构是否损坏,对 utf8mb3、caching_sha2_password、保留字(如 rank)等完全无感。
- 必须使用与目标版本一致的
mysql-shell(例如升到 8.0.42,就得用mysql-shell-8.0.42),混用 5.7 的 shell 会漏检 - 连接优先走 socket:
./mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade()",比 TCP 更稳定,避免 DNS 或防火墙干扰 - 报告中出现
ERROR级条目必须处理完才能继续,比如:Usage of utf8mb3 charset→ 批量执行ALTER DATABASE ... CONVERT TO CHARACTER SET utf8mb4;Column name 'rank' is a reserved keyword→ 改列名;caching_sha2_password plugin not supported by client→ 检查应用驱动(如mysql-connector-java ≥ 8.0.13)
in-place 升级启动失败的三个高频原因及应对
替换二进制、停旧服务、启新 mysqld 后卡在 “Starting MySQL” 或秒退,通常不是配置写错,而是底层不兼容。
- 残留已废弃参数:删掉或注释掉
query_cache_type、innodb_file_format、explicit_defaults_for_timestamp,否则日志只报unknown variable - 没设认证插件:
default_authentication_plugin=mysql_native_password必须显式写进[mysqld]段,否则老 PHP/Java 客户端连不上,报错Client does not support authentication protocol - 存在
MyISAM表:8.0 默认禁用该引擎,启动直接失败;先查SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'MyISAM',再逐个ALTER TABLE ... ENGINE=InnoDB
升级后第一分钟必须验证的四件事
进程起来了 ≠ 数据库就绪。以下命令缺一不可,漏掉任一都可能埋下半夜告警。
-
SELECT VERSION(), @@sql_mode;—— 确认是 8.0.x 且ONLY_FULL_GROUP_BY在列表中 -
SHOW VARIABLES LIKE 'default_authentication_plugin';—— 若返回caching_sha2_password但应用驱动太老(如PyMySQL ),得立刻建兼容用户:<code>CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; -
SELECT * FROM performance_schema.replication_applier_status_by_coordinator;—— 如果开了复制,这里必须显示APPLYING状态,否则 GTID 或 relay log 没自动续上 -
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME IN ('roles', 'role_edges');—— 若有自定义同名表,必须重命名或删掉,否则下次重启可能初始化失败
真正容易被忽略的是数据目录权限和 SELinux 上下文:CentOS 7 下常见 /var/lib/mysql 属主正确但上下文被破坏,需用 chcon -R --reference=/var/lib/mysql /usr/local/mysql 修复;Windows 下则要确认服务名是否用 sc delete MySQL 彻底清理干净,否则 mysqld --install 仍指向旧路径和 my.ini。











