MySQL

COPY、INPLACE、INSTANT:ALTER 期间别人还能干什么

算法怎么做期间别人能
COPY拷一张新表,再换过来只能读
INPLACE在引擎内部重建,或只建索引读写
INSTANT(8.0.12 起)只改数据字典,老数据不动读写,秒级完成

可以在语句里指定算法,做不到时 MySQL 会直接报错,而不是悄悄降级:

sql
ALTER TABLE d ADD INDEX iv(v), ALGORITHM=INSTANT;
-- ERROR: ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.

ALTER TABLE d MODIFY v BIGINT, ALGORITHM=INPLACE;
-- ERROR: Cannot change column type INPLACE. Try ALGORITHM=COPY.

所以在线上改表时,养成显式写上 ALGORITHM 的习惯:不支持就当场报错,不会意外变成锁表的 COPY。

大致规律:只改定义的(加列、改默认值)能 INSTANT;要动数据的(建索引、改主键、改可空、重建表)走 INPLACE;改列类型、改字符集至今只能 COPY。

esc