error 1845报错是因instant硬性条件未满足,非版本问题;需逐一排查引擎非innodb、row_format=compressed、存在fulltext索引、混用ddl、隐式主键及行版本超64等五类原因。

能秒加,但必须全部条件同时满足——缺一就锁表几分钟,不是警告,是事实。
ALGORITHM=INSTANT 报错 ERROR 1845 怎么快速定位原因
这不是版本不够,而是 MySQL 明确拒绝了 INSTANT 算法。常见硬性拦截点有:
- 表引擎不是
InnoDB(MyISAM、MEMORY、临时表全不支持) -
ROW_FORMAT=COMPRESSED或KEY_BLOCK_SIZE > 0(哪怕只设了KEY_BLOCK_SIZE=1也不行) - 表上存在
FULLTEXT索引(历史建过、后来删了也残留元数据,SHOW CREATE TABLE里还能看到) - 语句混用其他 DDL,比如
ADD COLUMN和ADD INDEX写在同一句,逗号分隔也不行 - MySQL 8.0.12–8.0.27 版本中,表有隐式主键(建表没写
PRIMARY KEY,且无NOT NULL UNIQUE列)
验证方式:先执行 SHOW CREATE TABLE t1 看引擎、行格式、索引;再查真实行格式:SELECT ROW_FORMAT FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = 'db_name/t1'(注意库名小写 + 斜杠)。
为什么显式写 ALGORITHM=INSTANT 是刚需
MySQL 默认会“悄悄降级”——不满足 INSTANT 条件时,自动 fallback 到 INPLACE 或 COPY,你看到执行成功,实际已锁表数分钟。显式指定后,它宁可失败也不妥协:
- 报错信息更精准:
ERROR 3104直接告诉你“因为有 FULLTEXT 索引”,ERROR 3105明确说“不能用 FIRST” - 避免业务窗口期误操作:你立刻知道要删全文索引、改默认值、或拆成单独语句
- 强制你检查元数据:执行完必须看
SHOW CREATE TABLE输出里是否真出现ALGORITHM=INSTANT字样——没出现就是没走
加列位置控制:AFTER 和 FIRST 在不同小版本的行为差异
别信“8.0 就支持任意位置”,版本间行为割裂严重:
- 8.0.28 及以下:
AFTER col_name或FIRST会直接报错ERROR 3106,INSTANT 只允许末尾追加 - 8.0.29–8.0.33(含主流云 RDS 20230630+ 小版本):支持
AFTER和FIRST,但仅限空表,或表中所有行已包含 instant 元信息(即之前已用 INSTANT 加/删过列) - 无论哪个版本,
DEFAULT NOW()、DEFAULT UUID()、DEFAULT (id + 1)都不被接受,只认字面量或NULL
稳妥做法:对非空表,统一用 AFTER last_col_name 定位到末尾,避免版本兼容风险。
行版本数 TOTAL_ROW_VERSIONS 超限怎么办
每次 ADD COLUMN 或 DROP COLUMN 都消耗一个行版本,上限是 64(MySQL 9.1 才升到 255)。超限后 INSTANT 永久失效,无法恢复——只能重建表重置计数器。
查当前用量:SELECT TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = 'db_name/t1'。如果接近 64,后续所有 INSTANT 操作都会失败,且错误提示不直观(常表现为静默 fallback 到 INPLACE),容易被忽略。











