disabled_storage_engines仅在MySQL 5.7.28+和8.0.19+有效,需写于[mysqld]段、加双引号、重启生效;低版本会启动失败,CREATE TABLE SELECT等语句可能绕过限制,mysql_upgrade时亦会因禁用MyISAM报错。

disabled_storage_engines 配置项只在 MySQL 5.7.28+ 和 8.0.19+ 有效
低于这些版本写入 disabled_storage_engines 会导致 mysqld 启动失败,报错类似 unknown variable 'disabled_storage_engines'。检查当前版本用 SELECT VERSION();,再确认是否支持该配置——不是所有 8.0.x 都默认带,比如 8.0.16 就不认。
这个配置只能写在 my.cnf 的 [mysqld] 段里,不能用 SET GLOBAL 动态设置,改完必须重启服务。
值必须是带英文双引号的字符串,多个引擎用英文逗号分隔,例如:disabled_storage_engines = "MyISAM,ARCHIVE"。漏掉引号或用单引号会静默失效。
禁用 MyISAM 后 CREATE TABLE SELECT 仍可能绕过限制
这是最常被忽略的“漏网之鱼”。CREATE TABLE t2 AS SELECT * FROM t1 如果 t1 是 MyISAM 表,新表 t2 默认继承 MyISAM 引擎,且不校验 disabled_storage_engines——因为语句没显式写 ENGINE=,MySQL 认为这是“已有引擎复用”,而非“新建引擎请求”。
- 验证方式:执行后立刻查
SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_NAME = 't2'; - 规避方法:强制指定引擎,如
CREATE TABLE t2 ENGINE=InnoDB AS SELECT * FROM t1; - 备份恢复时同理:SQL 文件里含
ENGINE=MyISAM且服务端版本不支持该配置项,也会跳过检查直接建表
禁用 InnoDB 引擎在 MySQL 8.0 中基本不可行
MySQL 8.0 系统表(mysql.*、performance_schema.*、information_schema.*)全部基于 InnoDB 实现,强行禁用会导致服务无法启动,报错如 Table 'mysql.user' doesn't exist 或更早的初始化失败。
旧文档里提到的 skip-innodb 在 8.0 中已被移除,写入配置会直接启动报错;disabled_storage_engines = "InnoDB" 虽语法合法,但实际加载时会因系统表依赖而中断。
如果你看到 SHOW ENGINES 中 InnoDB 显示为 DISABLED,大概率是配置写错、版本不匹配,或者 mysqld 是以 --skip-grant-tables 等特殊模式启动的(此时 disabled_storage_engines 自动失效)。
mysql_upgrade 升级时会因 disabled_storage_engines 报错
执行 mysql_upgrade 时,它内部会尝试创建临时 MyISAM 表(尤其在老版本升级到 8.0 过程中),一旦 disabled_storage_engines 含 "MyISAM",就会卡在 ERROR 3161: Storage engine MyISAM is disabled (Table creation is disallowed)。
这不是 bug,而是设计行为。解决方法只有临时注释掉该配置,重启 mysqld,跑完 mysql_upgrade,再改回配置并重启——没有免重启的绕过方式。
注意:升级完成后,若库中仍有 MyISAM 表,mysql_upgrade 不会自动帮你转成 InnoDB,得手动 ALTER TABLE t ENGINE=InnoDB;,否则下次升级还可能触发同样问题。











