ALTER TABLE ENGINE=InnoDB全程锁表,不可写,耗时取决于表大小与磁盘性能,10GB表在SATA盘上可能超30分钟;仅≤500MB表可直接执行,否则须用pt-online-schema-change并满足主键、innodb_file_per_table开启等前提。

ALTER TABLE ENGINE=InnoDB 会锁表多久?
不是“几秒”,而是“全程不可写”——从开始到结束,ALTER TABLE对 MyISAM 表切 InnoDB 会持有 MDL 写锁,所有 INSERT/UPDATE/DELETE 阻塞,部分隔离级别下 SELECT 也可能卡住。5.6+ 版本虽标称支持 ALGORITHM=INPLACE,但 MyISAM → InnoDB 实际仍走 COPY 算法,状态长期显示 copy to tmp table。10GB 表在普通 SATA 盘上可能卡住 30 分钟以上。
哪些表能直接用 ALTER TABLE 改?
必须同时满足以下全部条件,缺一不可:
- 表大小 ≤ 500MB(实测 SSD 上耗时通常
-
SHOW INDEX FROM t WHERE Key_name = 'FULLTEXT'返回空(有全文索引会直接报错退出) -
SHOW KEYS FROM t WHERE Non_unique = 0 AND Seq_in_index = 1有结果(必须有显式主键或唯一非空索引) - 磁盘剩余空间 ≥ 原表
.MYD文件大小 × 2.2(含 redo log、临时文件与碎片) - 业务可接受该表完全停写(如配置表、低频日志表)
大表或生产环境必须绕开 ALTER TABLE
700 万行或 >1GB 的表,ALTER TABLE ENGINE=InnoDB 极大概率触发超时、OOM 或主从延迟飙升至数千秒。此时唯一可靠方案是 pt-online-schema-change,但它不是“无脑替换”:
- 必须有主键或唯一非空索引,否则报错
This table has no primary key or unique index - 必须确认
innodb_file_per_table = ON(MySQL 5.6+ 默认开,但需验证) - 必须先
DROP INDEX ft_idx ON t(MyISAM 的 FULLTEXT 不兼容,不能自动迁移) - 命令中要加
--max-lag=1和--chunk-size=1000,否则从库延迟失控 - 执行后旧的
.MYD/.MYI文件不会删,得人工核对COUNT(*)一致后再清理
转换后最容易被忽略的三件事
引擎改完 ≠ 完事。InnoDB 和 MyISAM 行为差异太大,不处理这三点,性能可能反降、SQL 报错、甚至丢数据:
-
AUTO_INCREMENT列若没索引,ALTER TABLE会报ERROR 1075;已有值的表转完后,重启可能重置自增起点,需手动SELECT MAX(id) FROM t后ALTER TABLE t AUTO_INCREMENT = N - 外键约束开始生效:若原 MyISAM 表存在脏数据(子表外键值在父表不存在),
ALTER TABLE直接失败,报ERROR 1005 (HY000): Can't create table - 全文查询行为变化:MyISAM 的
MATCH AGAINST('+(a b) -c')在 InnoDB 中嵌套括号可能失效,必须重建FULLTEXT索引并重测布尔语法


















