概述
错误的算法会让一次 ALTER 长时间锁表,阻塞所有写入并堆积连接。明确指定算法与锁策略,可使服务器在不支持在线执行时快速失败,而不是悄悄锁表。
关键步骤
- 先确认当前版本下该变更是否支持 INSTANT 或 INPLACE。
- 显式指定 ALGORITHM 与 LOCK,使不能在线执行的计划被拒绝。
- 设置 lock_wait_timeout,避免 DDL 长时间排在长事务之后。
- 对无法在线的变更,改用复制并切换的影子表工具。
验证
- DDL 明确声明算法与锁策略。
- 不支持在线时操作快速失败而非静默锁表。
- 长事务不会让 DDL 无限排队。
- 影子表方案下原表写入不中断。
注意事项
- 即便不锁写入,在线 DDL 仍消耗 CPU 与 IO,并可能影响复制延迟。
- 变更主键类型等操作永非完全在线,必须借助工具。
适用范围
本条目围绕「保护 MySQL 在线 DDL 变更」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
ALTER TABLE orders
ADD COLUMN channel varchar(32) NULL,
ALGORITHM=INSTANT, LOCK=NONE;
-- if this errors, use an online schema-change tool