必须经5.6→5.7→8.0两步升级:因MySQL 8.0彻底重构为InnoDB托管的事务性数据字典,跳过5.7会导致字典初始化失败、系统表损坏及mysqld启动失败。

生产环境不建议跨越两个大版本直接升级 MySQL(比如从 5.6 直接到 8.0),因为这不是“跳过中间步骤”,而是跳过了底层数据结构演进的必经阶段——mysql 系统库的数据字典会彻底损坏,导致 mysqld 根本无法启动。
5.6 → 8.0 跳级会触发数据字典初始化失败
MySQL 8.0 彻底废弃了 MyISAM 引擎管理的系统表,改用全 InnoDB、事务化、只读接口访问的数据字典。而 5.6 的 mysql.user、mysql.db 等全是 MyISAM 表。中间没有 5.7 这个过渡层,InnoDB 字典元数据根本无法识别旧格式,启动时直接报错:
Failed to open the data dictionary table mysql.user Unknown table engine 'InnoDB'
这类错误不是配置或权限问题,是引擎层和字典校验逻辑错乱导致的硬性失败,无法通过参数绕过。
5.7 是唯一被官方认证的兼容桥梁
5.7 不只是“另一个中间版本”,它承担了三项不可替代的转换任务:
- 逐步将部分
mysql系统表迁移到 InnoDB(如mysql.plugin) - 引入字典兼容层,允许旧结构在新引擎上安全加载
- 提供
mysql_upgrade工具,能安全修补系统表结构,但不会动用户表引擎
你不能用 5.7.9 或更早的 GA 版本做过渡——官方明确要求必须升到 5.7.33+,否则其字典兼容层对 8.0 支持不完整,照样卡在第二步。
就地升级(in-place)本身风险就高,跳级等于放弃兜底能力
即使路径正确(5.6→5.7→8.0),就地升级仍需满足一堆严苛条件:
-
innodb_fast_shutdown=0必须提前设好,否则缓冲区未刷盘,5.7 启动时可能拒绝加载表空间 - 所有用户表必须手动执行
ALTER TABLE t ENGINE=InnoDB,mysql_upgrade不会帮你干这事 - SQL mode 中的
NO_AUTO_CREATE_USER等已废弃项必须清理,否则 8.0 启动直接拒绝
跳过 5.7 意味着你连这些可控的修复动作都失去了执行机会——没地方运行 mysql_upgrade,也没法逐表检查引擎状态。
逻辑备份还原才是生产环境真正可行的路径
哪怕你严格走完 5.6→5.7→8.0 就地升级流程,生产环境仍应优先选择 mysqldump 或 mydumper 导出再导入。原因很实在:
- 彻底规避数据字典/系统表/页格式等底层兼容问题
- 可同步完成字符集升级(如
ALTER DATABASE CONVERT TO CHARACTER SET utf8mb4) - 导入过程本身就是一次数据一致性校验,比启动后才发现损坏强得多
最常被忽略的一点:8.0 启动后默认启用 STRICT_TRANS_TABLES 和 ONLY_FULL_GROUP_BY,很多老 SQL 在就地升级后看似能跑,实际只是被降级警告掩盖了——逻辑还原时就能在导入阶段暴露并修复。


















