能禁用,且必须禁用。mysql 8.0 系统表已全量 innodb 化,disabled_storage_engines="myisam" 是唯一可靠方式,启用后显式 myisam 建表立即报错 error 3161,实例正常运行;该配置仅适用于 5.7.28+/8.0.19+ 版本,须置于 my.cnf 的 [mysqld] 段、加英文双引号、重启生效,漏引号或路径错误将静默失效;create table ... as select 会绕过限制,需强制指定 engine=innodb;mysql_upgrade 或系统表残留 myisam 时需临时放开配置或使用 --upgrade=force 强制迁移。

能禁用,且必须禁用。MySQL 8.0 系统表已全量 InnoDB 化,disabled_storage_engines = "MyISAM" 是唯一可靠方式,启用后所有显式 MyISAM 建表操作会立即报错 ERROR 3161,实例照常运行。
disabled_storage_engines 配置必须写对位置和格式
这个参数只在 MySQL 5.7.28+ 和 8.0.19+ 支持,低于这些版本(比如 8.0.16)会启动失败,报错 unknown variable 'disabled_storage_engines'。验证当前版本用:SELECT VERSION();。
它只能写在 my.cnf 的 [mysqld] 段里,不能 SET GLOBAL 动态修改,改完必须重启服务。
值必须是英文双引号包裹的字符串,多个引擎用英文逗号分隔,例如:disabled_storage_engines = "MyISAM,ARCHIVE"。漏引号、用单引号、多空格或写错大小写,都会静默失效——查 SHOW ENGINES 看不到变化,但建表也不报错,等于白配。
常见路径陷阱:/www/server/mysql/my.cnf 很可能不被读取,MySQL 8.0 默认只认 /etc/my.cnf、/etc/mysql/my.cnf 等固定路径,用 mysqld --help --verbose | grep "Default options" 确认实际加载路径。
CREATE TABLE SELECT 会绕过 disabled_storage_engines 限制
这是最常被忽略的漏洞:执行 CREATE TABLE t2 AS SELECT * FROM t1 时,如果 t1 是 MyISAM 表,新表 t2 会默认继承 MyISAM 引擎,且完全不校验 disabled_storage_engines——因为 MySQL 认为这是“复用已有引擎”,不是“新建请求”。
验证是否绕过:SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_NAME = 't2';,结果若为 MyISAM 就说明漏了。
安全写法是强制指定引擎:CREATE TABLE t2 ENGINE=InnoDB AS SELECT * FROM t1;
同理,从 SQL 备份文件恢复时,若语句含 ENGINE=MyISAM,且服务端版本支持该语法(哪怕配置禁用了),也会跳过检查直接建表。备份工具如老版 mysqldump 若没加 --no-create-options,很可能导出带 ENGINE=MyISAM 的语句,还原即中招。
mysql_upgrade 升级时会因禁用 MyISAM 报错
执行 mysql_upgrade 可能触发 [ERROR] 3161: Storage engine MyISAM is disabled,这不是数据损坏,而是旧版升级脚本尝试重建某些历史兼容表导致的流程卡顿。
解决方法明确:
- 临时注释掉
my.cnf中的disabled_storage_engines = "MyISAM" - 重启 MySQL
- 再运行
mysql_upgrade - 升级完成后,重新启用该配置并重启
注意:mysql_upgrade 在 8.0.33+ 已被标记为 deprecated,对 MyISAM 表默认跳过检查;若你用的是较新版本,其实可跳过这步,直接走 mysqld --upgrade=FORCE 触发内核级迁移(尤其当系统库残留 MyISAM 表导致启动失败时)。
禁用后仍需排查隐式依赖和行为差异
SHOW ENGINES 里 MyISAM 仍显示为 YES 是状态展示残留,真正生效以建表报错为准。但有些逻辑不会报错,只会结果异常:
比如存储过程里写 CREATE TEMPORARY TABLE tmp () 未指定 ENGINE,旧环境默认 MyISAM,新环境默认 InnoDB,因事务行为不同(InnoDB 临时表参与回滚),中间状态可能不一致——这种必须结合业务逻辑回归验证。
监控脚本或 DBA 自定义巡检 SQL 若硬编码了 ENGINE='MyISAM' 条件,查 information_schema.TABLES 会漏匹配;myisamchk 工具仍可运行,但对禁用后的实例无实际用途,建议从部署镜像中移除,避免误操作。
真正难定位的,是那些没报错、只是权限变更失败、主从同步卡住、或故障转移时拒绝加载的场景——它们往往都指向一个被忽略的事实:系统库(mysql)里还藏着一张 MyISAM 表。











