必须用MySQL Shell 8.0+执行util.checkForServerUpgrade()做兼容性扫描,严格排除系统库导出,清理MyISAM表、废弃配置及SELinux上下文,并通过四条SQL验证升级后状态。

不能靠 mysqldump --all-databases 导出再导入,也不能直接覆盖二进制文件启动——这两条路在生产环境几乎必然导致服务中断、权限丢失或半夜告警。
必须用 util.checkForServerUpgrade() 做真实兼容性扫描
这个检查器是 Oracle 官方唯一推荐的前置工具,mysqlcheck --check-upgrade 或 mysqld --validate-config 都不识别跨版本语义变更。
- 要用 MySQL Shell 8.0+(比如 8.0.42)连接正在运行的 5.7 实例,命令形如:
./mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade()" - 加
configPath参数才能覆盖配置项检查:util.checkForServerUpgrade({'configPath': '/etc/my.cnf'}) - 报告里
overallStatus必须是OK;出现ERROR级条目(如Usage of utf8mb3 charset、Column name 'rank' is a reserved keyword)必须逐条修复 -
WARNING级别也不能跳过:比如caching_sha2_password plugin not supported by client,说明 JDBC 驱动太老,得提前升级mysql-connector-java ≥ 8.0.13或改认证插件
导出时严格排除系统库,且字符集必须显式指定
5.7 的 mysql 库结构和 8.0 完全不兼容——字段名变了(password → authentication_string),引擎强制为 InnoDB,权限模型也重构了。一旦导入旧 mysql 库,轻则连不上,重则 mysqld 启动直接崩溃。
- 绝对不要用
mysqldump --all-databases;只导出业务库:mysqldump --default-character-set=utf8mb4 -u root -p --databases myapp_db - 如果已误导出含
mysql库的文件,必须手动删掉所有以CREATE DATABASE mysql或USE mysql开头的段落,再删掉所有INSERT INTO mysql.行 - 导出时加
--single-transaction --routines --triggers --events,避免锁表和漏定时事件
替换二进制后启动失败,90% 是配置或数据字典没清理干净
不是数据坏了,而是启动卡在 Starting MySQL 或秒退——常见于残留参数、MyISAM 表、权限错位或 SELinux 上下文损坏。
- 删掉或注释掉 5.7 中已废弃的配置项:
query_cache_type、innodb_file_format、explicit_defaults_for_timestamp - 确认没有 MyISAM 表:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'MyISAM',结果非空就得先ALTER TABLE ... ENGINE=InnoDB - 检查
/var/lib/mysql目录属主是否为mysql:mysql;CentOS 7 上若用 rpm 升级,SELinux 上下文可能被破坏,需chcon -R --reference=/var/lib/mysql /usr/local/mysql - 显式设置
default_authentication_plugin=mysql_native_password,否则老客户端连不上;若坚持用caching_sha2_password,JDBC 连接串必须加?serverTimezone=UTC&allowPublicKeyRe
启动成功 ≠ 数据库就绪,四条验证命令缺一不可
服务进程起来只是第一步,系统表结构、复制状态、认证插件、SQL 模式都可能没同步到位,漏验会引发隐性故障(比如 SHOW GRANTS 返回空、performance_schema 为空、GTID 断裂)。
-
SELECT VERSION(), @@sql_mode;—— 确认版本是 8.0.x 且ONLY_FULL_GROUP_BY在列表中 -
SELECT * FROM performance_schema.replication_applier_status_by_coordinator;—— 如果开了复制,这里必须显示APPLYING状态 -
SHOW VARIABLES LIKE 'default_authentication_plugin';—— 若返回caching_sha2_password但应用驱动太旧,立刻建兼容用户:CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; -
SELECT COUNT(*) FROM mysql.user;—— 确保用户表已升级,字段含authentication_string而非password
最常被忽略的是系统表校验和 MyISAM 清理——它们不报错,但会让权限、角色、性能监控等功能静默失效,问题往往在上线后几小时才暴露。


















