必须用MySQL Shell的util.checkForServerUpgrade()做兼容性扫描,导出仅限业务库且显式指定utf8mb4,严格清理MyISAM表、废弃配置项及mysql系统库,升级后验证版本、认证插件、默认排序规则和性能字典表。

不能直接替换二进制文件启动,也不能用 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或改认证插件 - 检查报告里会列出 20+ 项,包括
NO_AUTO_CREATE_USER是否还在sql_mode里、有没有MyISAM表、是否存在 8.0 关键字命名的库/表/存储过程
导出时严格排除系统库,且字符集必须显式指定
5.7 的 mysql 库结构和 8.0 完全不兼容——字段名变了(password→authentication_string),引擎强制为 InnoDB,权限模型也重构了。一旦导入旧 mysql 库,轻则连不上,重则 mysqld 启动直接崩溃。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 绝对不要用
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,避免锁表和漏定时事件
my.cnf 配置必须手动调整几处关键参数
MySQL 8.0 启动时会校验配置项,很多 5.7 兼容但 8.0 已废弃的参数会导致服务起不来。最常踩坑的是 sql_mode、认证插件、字符集三类。
-
sql_mode中若含NO_AUTO_CREATE_USER,启动直接报错退出;8.0 默认值已移除它,但如果你的配置文件里还显式写了,就必须删掉 -
default_authentication_plugin=mysql_native_password建议显式加上——否则新用户默认用caching_sha2_password,老应用连接会报Client does not support authentication protocol -
character_set_server和collation_server若仍设为latin1,虽能启动,但新建库表默认仍是latin1,后续迁移成本更高 - 删掉或注释掉 5.7 中已废弃的配置项:
query_cache_type、innodb_file_format、explicit_defaults_for_timestamp
替换二进制后启动失败,90% 是配置或数据字典没清理干净
不是数据坏了,而是启动卡在 Starting MySQL 或秒退——常见于残留参数、MyISAM 表、权限错位或 SELinux 上下文损坏。
- 确认没有
MyISAM表:SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'MyISAM',结果非空就得先ALTER TABLE ENGINE=InnoDB - 检查
/var/lib/mysql目录属主是否为mysql:mysql,权限是否为750;SELinux 上下文若损坏,需用restorecon -Rv /var/lib/mysql - 升级后必须用四条 SQL 验证状态:
SELECT VERSION();、SELECT @@default_authentication_plugin;、SELECT DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='information_schema';、SELECT COUNT(*) FROM performance_schema.events_statements_summary_by_digest;
最容易被忽略的是:8.0 取消了 GROUP BY 的隐式排序,历史 SQL 的分页结果可能突变;还有 utf8mb4 成为默认字符集后,应用层若未适配 emoji 存储,会静默截断。










