能禁止,但必须修改my.cnf中[mysqld]段的disabled_storage_engines="myisam"并重启mysql;该配置仅启动时生效,set global无效,且只拦截新建表操作,不影响已有myisam表读写。

能禁止,但不是靠 SQL 语句或运行时 SET,必须改配置并重启。MySQL 本身没有「禁用引擎」的动态开关,disabled_storage_engines 是唯一官方支持的硬性拦截方式,且只对新建表生效。
disabled_storage_engines 配置必须写对位置和格式
这个参数只在 MySQL 启动时读取,SET GLOBAL 完全无效。它必须出现在 my.cnf(Linux)或 my.ini(Windows)的 [mysqld] 段落里:
[mysqld] disabled_storage_engines = "MyISAM"
- 引号必需,否则 MySQL 5.7.28+ 和 8.0.19+ 会启动失败
- 多个引擎用英文逗号分隔,如
"MyISAM,ARCHIVE" - 值区分大小写,
"myisam"或"MYISAM"都不生效 - 配置后必须重启 MySQL,否则无任何效果
哪些操作会被直接拦截并报错
配置生效后,以下语句执行时立刻失败,错误码统一为 ERROR 3161 (HY000) 或 ERROR 1286 (42000):
CREATE TABLE t (...) ENGINE=MyISAMALTER TABLE t ENGINE=MyISAMCREATE TEMPORARY TABLE tmp (...) ENGINE=MyISAM-
CREATE TABLE t AS SELECT ...—— 但注意:如果源表是 MyISAM,新表仍可能默认继承 MyISAM 引擎,绕过限制
真正判断是否生效,不要看 SHOW ENGINES(它可能还显示 MyISAM 为 YES),而应直接执行一条建表语句看是否报错。
升级时 mysql_upgrade 可能卡住,得临时放开
旧版本升级到 5.7.28+ 或 8.0 时,mysql_upgrade 脚本可能尝试重建兼容性表,触发 MyISAM 创建请求,导致报错:
mysql_upgrade: [ERROR] 3161: Storage engine MyISAM is disabled
这不是数据问题,只是升级流程卡在非必要步骤。处理方法很明确:
- 临时注释掉
my.cnf中的disabled_storage_engines行 - 重启 MySQL
- 运行
mysql_upgrade - 还原配置、再次重启
整个过程无需停业务太久,但必须在升级窗口期内完成。
禁用后仍有隐式风险,得人工排查
配置生效后,已有 MyISAM 表照常读写,也不会被自动转换——这既是优点也是隐患:
- 备份还原时若 SQL 文件里硬写了
ENGINE=MyISAM,而目标实例版本不支持该配置项,就会直接建表成功(绕过限制) - 某些存储过程或脚本里用了
CREATE TEMPORARY TABLE但没指定ENGINE,旧环境默认 MyISAM,新环境默认 InnoDB,事务行为差异可能导致中间状态不一致 - 监控脚本或巡检 SQL 若依赖
information_schema.TABLES.ENGINE = 'MyISAM'过滤,禁用后会漏匹配,但不会报错,容易误判
最麻烦的不是报错,而是那些静默变更:比如某条报表查询从 MyISAM 切到 InnoDB 后,因 MVCC 快照机制不同,结果集时间点偏移了——这种必须结合业务逻辑回归验证,没法靠配置自动发现。











