必须分两步验证:先查show create table确认engine=innodb、无fulltext索引;再查information_schema.innodb_tables中row_format是否为dynamic(compressed不支持)且key_block_size=0。

如何确认当前表是否支持 ALGORITHM=INSTANT
直接查 SHOW CREATE TABLE 和系统表是最可靠的方式,不能只看 MySQL 版本号。很多用户在 8.0.33 上执行 ALTER TABLE ... ALGORITHM=INSTANT 仍报错 ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported,就是因为表结构或配置不满足硬性条件。
分两步验证:
- 执行
SHOW CREATE TABLE t1,检查:ENGINE=InnoDB、ROW_FORMAT是否为DYNAMIC或COMPRESSED(注意:COMPRESSED不支持 INSTANT)、有无FULLTEXT索引、是否显式定义了PRIMARY KEY - 查真实行格式(
SHOW CREATE TABLE可能不准):SELECT ROW_FORMAT FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = 'database/t1'(库名小写 + 斜杠)
ALGORITHM=INSTANT 支持哪些 DDL 操作
不是所有加列/删列都支持 INSTANT,必须是单条语句、仅含允许操作。MySQL 8.0.12 起明确支持以下 6 类(需显式指定或依赖默认行为):
-
ADD COLUMN(8.0.12+ 支持末尾添加;8.0.29+ 支持任意位置,含FIRST/AFTER) -
DROP COLUMN(仅 8.0.29+) -
ALTER COLUMN ... SET DEFAULT(仅设默认值,不改类型或 NULL 属性) ALTER COLUMN ... DROP DEFAULT-
CHANGE COLUMN ... COMMENT/MODIFY COLUMN ... COMMENT -
RENAME COLUMN(8.0.29+)
以下操作**不支持** INSTANT:MODIFY COLUMN 改类型、改 NOT NULL、加/删索引、同时 ADD COLUMN 和 ADD INDEX、修改分区定义。
如何查看某条 ALTER 语句实际用了哪个 ALGORITHM
MySQL 不会主动告诉你用了什么算法,但可以通过执行后观察返回信息和日志间接判断:
- 成功执行 INSTANT 时,耗时通常 ≤ 0.1 秒,且返回中
Records: 0、Warnings: 0(极少数情况有 warning 提示 row version 接近上限) - 执行后立刻查
INFORMATION_SCHEMA.INNODB_TABLESTATS中的TOTAL_ROW_VERSIONS字段(需开启innodb_stats_persistent),值增加说明确实走了 INSTANT(每次 INSTANT ADD/DROP 列都会 +1) - 开启 DDL 日志(
SET GLOBAL log_error_verbosity = 3+innodb_print_ddl_logs = ON),错误日志里会出现DDL log insert或instant add column字样
为什么 SHOW CREATE TABLE 显示 ROW_FORMAT=DYNAMIC 却仍不支持 INSTANT
因为 ROW_FORMAT 在 SHOW CREATE TABLE 里可能是“声明值”,不是磁盘上真实格式。InnoDB 表的实际行格式由建表时参数、后续 ALTER TABLE ... ROW_FORMAT、甚至 OPTIMIZE TABLE 决定,且受 innodb_file_format(已废弃但旧表可能残留)影响。
真正要信的是 INFORMATION_SCHEMA.INNODB_TABLES.ROW_FORMAT,它读取的是 ibd 文件头解析出的格式。如果这里显示 COMPRESSED,哪怕建表语句写了 DYNAMIC,INSTANT 也一定失败——这是底层存储限制,绕不过。
另外注意:云厂商 RDS 常默认开启 loose_innodb_instant_ddl_enabled,主从若不一致,从库可能拒绝 INSTANT 操作,必须两边统一配置。











