首页/数据/数据库速查/在线 DDL 与锁选项(ALGORITHM/LOCK)
本包目录(495 条)
MySQL 基础与连接36 条SQL 语法52 条用户与权限21 条备份与恢复56 条主从复制与高可用53 条
性能与调优57 条
Redis 命令96 条Redis 运维与场景124 条

在线 DDL 与锁选项(ALGORITHM/LOCK)

8.0 在线 DDL 用 ALGORITHM=INPLACE/INSTANT 与 LOCK=NONE 声明要求:显式写出让「不锁表」成为可验证的承诺,执行前用 LOCK 子句探测是否可行。

数据库速查数据更新于 2026-10-12

安全写法

安全写法
-- 加列:8.0.12+ 支持 INSTANT
ALTER TABLE appdb.orders ADD COLUMN memo VARCHAR(200), ALGORITHM=INSTANT;
-- 加索引:要求不锁表
ALTER TABLE appdb.orders ADD INDEX idx_status (status), ALGORITHM=INPLACE, LOCK=NONE;
-- 先探测(dry run 思路)
ALTER TABLE appdb.orders ADD COLUMN c1 INT, ALGORITHM=INPLACE, LOCK=NONE;  -- 失败了换方案
INSTANT秒级完成(元数据操作)
INPLACE在线重建,允许并发 DML
LOCK=NONE声明式要求,不满足则直接失败而非硬锁
ALTER 最后阶段仍需短暂 MDL 排他:低峰执行 + 确认无长事务。

易错点

  • 省略 LOCK 子句:按默认策略可能锁表,以为「在线」实际锁全表
  • INSTANT 加列后大量增删列:65535 列/行格式限制导致的隐性问题要先查文档

数据来源与参考

  • MySQL 8.0 Reference Manual: Online DDL Operations

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌