在 mysql 5.7 及更高版本中,default-storage-engine 配置项已弃用且不再生效,官方强制默认引擎为 innodb;实际运行时可通过 default_storage_engine 变量临时设置,但 mysql 8.0 中该变量变为只读,新建表未显式指定 engine 时一律使用 innodb。

MySQL 5.7 中 default-storage-engine 已被弃用
直接说结论:在 MySQL 5.7 及更高版本(包括 8.0),default-storage-engine 这个配置项**不再生效**,强行写进 my.cnf 也不会报错,但启动时会被忽略——你设成 InnoDB 或 MyISAM 都没用。
这是因为 MySQL 官方从 5.7 开始强制要求默认引擎为 InnoDB,且不允许降级覆盖。实际生效的是 default_storage_engine(下划线)这个系统变量,但它只在运行时有效,不能靠配置文件“永久设置”。
- 检查当前生效值:
SELECT @@default_storage_engine; - 临时修改(仅当前会话):
SET SESSION default_storage_engine = 'MyISAM'; - 全局临时修改(重启失效):
SET GLOBAL default_storage_engine = 'MyISAM';
MySQL 8.0 真正的默认引擎控制方式
8.0 彻底移除了 default-storage-engine 的配置支持,连警告都不再提示。此时唯一能影响新建表引擎的,是 CREATE TABLE 语句中是否显式指定 ENGINE=,以及服务器是否启用了 skip-innodb(不建议启用,会导致严重功能缺失)。
- 没写
ENGINE的建表语句,一律用InnoDB,不可更改 -
SHOW VARIABLES LIKE 'default_storage_engine';返回的仍是InnoDB,但它是只读变量,SET GLOBAL会报错Variable 'default_storage_engine' is a read only variable - 如果旧配置里还留着
default-storage-engine=MyISAM,MySQL 启动日志里会出现警告:[Warning] 'default-storage-engine' is deprecated and will be removed in a future release.
为什么不能改回 MyISAM 作默认?
不是配置漏了,是架构层面堵死了。InnoDB 是 MySQL 8.0+ 的核心依赖:数据字典、原子 DDL、事务性表创建、角色权限存储……全都绑定在 InnoDB 表上。一旦把默认引擎切走,CREATE USER、GRANT 甚至部分 INFORMATION_SCHEMA 查询都会出问题。
- MyISAM 不支持事务、行锁、外键,和 MySQL 8.0 的 ACL 实现冲突
- 系统表(如
mysql.user)在 8.0 全部转为 InnoDB,无法用 MyISAM 替代 - 试图用
mysqld --default-storage-engine=MyISAM启动会失败,提示Unknown suffix 'MyISAM' for variable 'default-storage-engine'
真要兼容老项目怎么办?
别碰默认引擎,老老实实改建表逻辑。所有 CREATE TABLE 语句必须显式带上 ENGINE=MyISAM,否则新表就是 InnoDB,行为可能不一致(比如全文索引语法、AUTO_INCREMENT 行为、锁粒度)。
- 用
mysqldump --no-create-info --skip-extended-insert导出数据后,手工补全ENGINE=MyISAM - 应用层建表前加判断:
CREATE TABLE t1 (...) ENGINE=MyISAM;,别依赖默认值 - 注意
ALTER TABLE t1 ENGINE=MyISAM;在 8.0 上仍可用,但转换后无法使用事务相关函数(如XA START)
真正麻烦的不是配置怎么写,而是 MyISAM 表在 8.0 下无法参与原子 DDL——比如 ALTER TABLE ... ADD COLUMN 如果中途失败,MyISAM 表就卡在半成品状态,得人工修复。










