mysql如何转换MyISAM表到InnoDB_使用ALTER TABLE语句方法

张开发
2026/4/12 19:03:58 15 分钟阅读

分享文章

mysql如何转换MyISAM表到InnoDB_使用ALTER TABLE语句方法
会ALTER TABLE ... ENGINEInnoDB 在 MySQL 5.7/8.0 下默认触发全表拷贝期间加 DML 写锁INSERT/UPDATE/DELETE 被阻塞SELECT 通常可读MyISAM→InnoDB 不支持 ALGORITHMINPLACE必须 COPY耗时长且需双倍磁盘空间。ALTER TABLE ... ENGINEInnoDB 会锁表吗会而且是**全表 DML 锁**写锁在转换过程中INSERT、UPDATE、DELETE 都会被阻塞SELECT 通常还能读取决于隔离级别和 MySQL 版本。5.6 支持 ALGORITHMINPLACE 的部分场景但 MyISAM → InnoDB **不支持 INPLACE**必须走 COPY 算法。MySQL 5.7/8.0 下ALTER TABLE t ENGINEInnoDB 默认触发表拷贝期间原表只读DML 不可用如果表有 10GB转换可能持续数分钟到几十分钟业务高峰期务必避开磁盘空间需额外预留 ≥ 原表大小临时文件 新表建议先在从库或低峰期测试用 SHOW PROCESSLIST 观察状态是否卡在 copy to tmp table执行前必须检查的三个兼容性点MyISAM 和 InnoDB 行为差异大直接改引擎可能让应用出错不是语法通过就万事大吉。FULLTEXT 索引MyISAM 支持InnoDB 5.6 才支持且分词行为不同若存在ALTER 会失败需先 DROP INDEX 或升级 MySQL表名大小写MyISAM 在 Windows 上不区分大小写InnoDB 受 lower_case_table_names 影响更严格若应用里混用 user 和 User可能查不到表自增列要求InnoDB 要求 AUTO_INCREMENT 列必须是索引的一部分通常是主键或含主键的联合索引而 MyISAM 没这限制若原表只有 id INT AUTO_INCREMENT 但没建索引ALTER 会报错 ERROR 1075怎么安全地批量转换多个 MyISAM 表别手敲十几条 ALTER TABLE容易漏、难回滚、无法监控进度。用脚本生成 分批执行更可控。 微软爱写作 微软出品的免费英文写作/辅助/批改/评分工具

更多文章