my-010929错误表明mysql 8.0启动时系统表仍为myisam引擎,因不满足ddl原子性与数据字典一致性要求而阻断初始化;mysql_upgrade已失效,必须用mysqld --upgrade=force强制触发innodb转换。

MY-010929 错误不是配置问题,而是 MySQL 8.0 启动时强制校验失败的信号:系统表(如 mysql.user、mysql.db)仍为 MyISAM 引擎,服务直接卡住,无法完成初始化。
MyISAM 不满足 DDL 原子性与数据字典一致性要求
MySQL 8.0 将所有元数据统一存入 InnoDB 系统表,彻底废弃 .frm 文件。这个新数据字典架构要求:
- 所有 DDL 操作必须原子执行(成功则全生效,失败则全回滚)
- 表结构变更需与数据变更在同一个事务中提交
- 崩溃后能通过 redo log 精确恢复元数据状态
MyISAM 完全不支持事务、无 undo log、崩溃后状态不可预测,根本无法参与这套机制。哪怕只有一张系统表是 MyISAM,mysqld 就会在启动阶段报 MY-010929 并终止加载。
mysql_upgrade 在 8.0 中已失效,别再依赖它
从 MySQL 8.0.16 起,mysql_upgrade 工具被标记为 deprecated,它不再触发任何系统表转换逻辑。你看到的 “mysql_upgrade is deprecated” 提示不是警告,是明确告知:该命令对系统表引擎迁移零作用。
真正起效的是服务器启动时的内建升级流程,且仅在首次用 8.0+ 二进制启动旧数据目录时自动尝试——但这个自动流程极易静默失败,不报错、只跳过。
强制转换必须用 mysqld --upgrade=FORCE
这不是可选步骤,是唯一可靠路径:
- 先停止服务:
sudo systemctl stop mysql - 用绝对路径调用新版本
mysqld,显式传参:mysqld --user=mysql --datadir=/var/lib/mysql --upgrade=FORCE - 进程必须自然退出(不能加
&),成功标志是日志中出现mysql.user table upgraded to InnoDB和Upgrading system tables for new version - 失败几乎总是这三件事之一:SELinux 权限未重置(需
restorecon -R /var/lib/mysql)、残留/var/lib/mysql/mysql/*.frm干扰解析、tmpdir或datadir分区空间不足
真正难排查的,是那些没报错但后续行为异常的情况:比如转换中途被中断,mysql 库下部分表变成 InnoDB、部分仍是 MyISAM,此时服务可能“看似启动成功”,但执行 CREATE USER 或权限相关操作时随机失败。











