必须先运行util.checkforserverupgrade(),它是oracle官方唯一推荐的升级检查工具,能识别utf8mb3、保留字、password字段等语义级问题;mysqlcheck和mysqldump --all-databases均不可靠,易导致启动崩溃或权限丢失。

必须先跑 util.checkForServerUpgrade(),别信 mysqlcheck
直接用 mysqldump 导出再导入,90% 会失败——不是数据丢了,而是 utf8mb3 字符集、rank 这类保留字、password 字段名这些语义级问题,mysqlcheck 完全看不见。util.checkForServerUpgrade() 才是 Oracle 官方唯一推荐的检查入口,它跑在 MySQL Shell 8.0+ 里,能真实扫描到升级阻塞点。
执行前确认三件事:
- 用目标 8.0 版本对应的 mysqlsh(比如升到 8.0.42,就得用 mysql-shell-8.0.42)
- 连的是正在运行的 5.7 实例,优先走 socket:./mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade()"
- 报告里 overallStatus 必须是 "OK";出现 ERROR(如 Usage of utf8mb3 charset)必须修复,WARNING(如 caching_sha2_password plugin not supported by client)也得处理,否则驱动连不上
导出时只碰业务库,死守 --databases + 手动排除
mysqldump --all-databases 是高危操作——它会把 5.7 的 mysql 库一并导出,而 8.0 的 user 表字段已从 password 改成 authentication_string,引擎强制为 InnoDB,权限模型重构。一旦导入,轻则 mysqld 启动崩溃,重则连 root 都登不进去。
正确做法:
- 只导出明确的业务库:mysqldump --default-character-set=utf8mb4 -u root -p --databases myapp_db shop_db > business.sql
- 如果误导了含 mysql 的文件,必须手动删掉所有以 CREATE DATABASE mysql 或 USE mysql 开头的段落,再删光所有 INSERT INTO mysql. 行
- 导入前确认目标 8.0 实例的 mysql 库是全新初始化的,不是从 5.7 恢复来的
启动 8.0 前必须清理 my.cnf 和系统表残留
替换二进制后 mysqld 卡在 “Starting MySQL” 或秒退,大概率是配置或数据字典不兼容,不是服务没起来,是校验阶段就被拒载了。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
要动手删/改这几处:
- 删除或注释掉 5.7 已废弃参数:query_cache_type、innodb_file_format、explicit_defaults_for_timestamp
- 显式设置认证插件:default_authentication_plugin=mysql_native_password(除非你已统一升级 JDBC/PyMySQL 驱动)
- 查 MyISAM 表:SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'MyISAM',结果非空就得先 ALTER TABLE ... ENGINE=InnoDB
- 清理 mysql 库下的自定义表(比如叫 roles 或 role_edges),它们会和 8.0 新系统表撞名,导致启动失败
导入后第一分钟必须验证这四条命令
进程起来了 ≠ 数据库就绪。漏掉任意一条,都可能埋下半夜告警的坑:
SELECT VERSION(), @@sql_mode; —— 确认是 8.0.x,且 ONLY_FULL_GROUP_BY 在 sql_mode 里SHOW VARIABLES LIKE 'default_authentication_plugin'; —— 如果返回 caching_sha2_password,但应用还在用旧驱动,立刻建兼容用户:CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';SELECT * FROM performance_schema.replication_applier_status_by_coordinator; —— 如果开了复制,这里必须显示 APPLYING 状态SELECT COUNT(*) FROM mysql.user; —— 确保系统表已升级完成,不是空的或字段缺失
最容易被跳过的其实是最后一项:没人真去查 mysql.user 有没有数据,但一旦它为空或字段错位,权限就全丢了,连 SHOW GRANTS 都返回空。










