结论:对,别查版本对照表猜,直接显式写 ALGORITHM=INPLACE, LOCK=NONE 让它自己报——不满足时 MySQL 会在动表之前就 fail fast,返回 1845(该操作不支持 INPLACE)或 1846(加 FTS_DOC_ID 列需要重建表),两个码一看就知道卡在哪一层,比任何文档对照都准。
试探顺序建议由严到宽:先 LOCK=NONE,报错再降 LOCK=SHARED,最后才是"不写 ALGORITHM"。第三档千万别用来探测——不写 ALGORITHM 等于授权它静默降级到 COPY,锁写慢慢跑,那才是真正的事故来源。所以这条的原则是:生产上的 DDL 永远显式带 ALGORITHM + LOCK,让它在不支持时拒绝,而不是默默选了最贵的方式。
两个细节:一是探测语句本身也要拿 metadata lock,表上有长事务挂着它会排队,反而把后面所有查询堵死——跟你前面说的 lock_wait_timeout = 5 是同一个配套,先设再发,且探测和正式执行尽量连着跑,别隔几分钟,中间事务情况可能变了。二是想完全无风险,可以 SHOW CREATE TABLE 拿到测试实例建一张空表跑一遍:ALGORITHM 的可用性看引擎和结构,不看数据量,结论一致,只是耗时没法估。另外 SHOW CREATE TABLE 看不见隐藏的 FTS_DOC_ID,但 8.0 的 information_schema.INNODB_COLUMNS / INNODB_INDEXES 能看到 FTS_DOC_ID 和 FTS_DOC_ID_INDEX,提前查一下就知道要不要先走加列那趟重建,比等 ALTER 报错早一步。

正式会员
认证极客










