MySQL 8.0 彻底移除了 MyISAM 引擎加载能力,启动时即剥离其初始化逻辑,SHOW ENGINES 不显示、建表报 ERROR 1286,系统表残留 MyISAM 会导致启动失败 MY-010929,唯一修复方式是 mysqld --upgrade=FORCE。

MySQL 8.0 不是“不再提供崩溃安全保证”,而是彻底移除了 MyISAM 引擎的加载能力——它连启动都做不到,自然谈不上崩溃恢复。
MyISAM 在 MySQL 8.0 启动阶段就被直接跳过
执行 mysqld --version 确认是 8.0+ 后,再运行 SHOW ENGINES,你会发现输出里根本没有 MyISAM 这一行;即使配置文件写了 plugin-load-add = myisam,启动日志里也搜不到 MyISAM 字样。这不是插件没启对,是官方已从 server 启动路径中剥离全部初始化逻辑。你建表时写 ENGINE=MyISAM,会立刻报错:ERROR 1286 (42000): Unknown storage engine 'MyISAM'。
崩溃安全不是“没做好”,而是“没机会做”
MyISAM 的崩溃恢复依赖 myisamchk -r 和 .MYI/.MYD 文件状态校验,但 MySQL 8.0 已不加载该引擎,也就不存在“MyISAM 表崩溃后能否恢复”这个问题。真正危险的是遗留场景:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 升级前是 MySQL 5.7,
mysql.user等系统表仍是 MyISAM,升级后未触发转换,启动直接卡在MY-010929或ER_UNKNOWN_STORAGE_ENGINE - 用旧版
mysqldump导出再导入,语句含ENGINE=MyISAM,导入失败或静默创建失败表(取决于版本) - 误以为
mysql_upgrade还能修系统表——它自 8.0.16 起已 deprecated,8.0.33+ 默认跳过 MyISAM 检查
唯一能触发系统表转换的路径只有 mysqld --upgrade=FORCE
这个命令不是可选项,是唯一入口:
- 必须用新版本
mysqld二进制显式调用,不能靠 service 脚本间接触发 - 参数必须带完整路径:
--datadir=/var/lib/mysql,且进程要自然退出(别加&) - 成功标志是日志中出现
mysql.user table upgraded to InnoDB和Upgrading system tables for new version - 失败常见原因:SELinux 上下文未重置(需
restorecon -R /var/lib/mysql)、/tmp或datadir空间不足、残留.frm文件干扰解析
最麻烦的永远不是报错那一刻,而是转换中途被中断——mysql 库下部分表变成 InnoDB、部分仍是 MyISAM。服务看似启动成功,但一执行 CREATE USER 或 GRANT 就随机失败,错误日志还不一定体现根源。

















