应运行SELECT table_name, engine FROM information_schema.tables WHERE table_schema = 'your_db' AND engine = 'MyISAM';查清当前库中仍在使用MyISAM引擎的表,结果非空则必须在导出前全部转为InnoDB,否则MySQL 8.0导入时会因Unknown storage engine 'MyISAM'报错中断。

查清当前库中哪些表还在用 MyISAM
MySQL 8.0 已彻底移除 MyISAM 引擎支持,但很多老库(尤其是从 5.6 或更早升级上来的)仍混有 MyISAM 表。直接导入会报错 Unknown storage engine 'MyISAM'。不能靠猜,得实查:
- 运行
SELECT table_name, engine FROM information_schema.tables WHERE table_schema = 'your_db' AND engine = 'MyISAM'; - 如果结果非空,这些表必须在导出前转成
InnoDB,否则迁移必断 -
SHOW ENGINES;确认目标 MySQL 8.0 是否真的禁用了 MyISAM(默认是SUPPORT = NO)
导出前批量转换 MyISAM 表为 InnoDB
别等导入失败再补救——mysqldump 不会自动帮你改引擎,它只照原样 dump。必须提前执行转换:
- 逐表执行:
ALTER TABLE your_table ENGINE = InnoDB; - 批量生成语句(避免手敲):
SELECT CONCAT('ALTER TABLE `', table_name, '` ENGINE = InnoDB;') FROM information_schema.tables WHERE table_schema = 'your_db' AND engine = 'MyISAM'; - 转换后务必检查:某些 MyISAM 表含全文索引或
TEXT字段的前缀长度限制,在 InnoDB 下可能需调整FULLTEXT语法或字段定义 - 转换过程会锁表,建议在低峰期操作;若不能停写,可用
pt-online-schema-change在线变更
导出时仍要加 --single-transaction,但注意它的局限性
--single-transaction 对 InnoDB 表有效,靠 MVCC 快照保障一致性;但它对 MyISAM 表完全无效——哪怕你已经全转成 InnoDB,也得确认没漏掉临时表或系统表。
- 只要库中还有任何一张 MyISAM 表(哪怕只是
mysql.general_log这类日志表),--single-transaction就无法保证全局一致性 - 所以转换引擎后,再跑一次
SELECT ... WHERE engine = 'MyISAM'确认清零 - 如果仍有残留且无法删改(如某些监控插件建的表),就得退回到
--lock-all-tables,并接受写入阻塞
导入后验证引擎是否真生效
导入完成不代表万事大吉。MySQL 8.0 默认创建表用 InnoDB,但如果你的 dump 文件里还带着 TYPE=MyISAM(旧版 mysqldump 语法),会被忽略或报错;更隐蔽的是 ENGINE=MyISAM 被静默降级为 InnoDB,但不会提示。
- 导入后立刻查:
SELECT table_name, engine FROM information_schema.tables WHERE table_schema = 'your_db'; - 重点核对
engine列是否全为InnoDB,而非空或NULL - 若发现某张表仍是
MyISAM,说明 dump 里保留了旧定义,且目标 MySQL 没报错(可能因配置了skip-grant-tables或权限不足导致跳过校验) - 此时必须重导:先清理目标库,再用修正后的 dump 重入
mysqldump 自动保留、却在新版本里已失效的引擎声明——它们藏在建表语句末尾,不显眼,但足以让整张表行为异常。


















