SQL在线DDL的核心是通过拆分长锁为短锁、结合日志与版本控制实现无感结构变更;主流算法包括COPY(全量拷贝+原子替换)、INPLACE(原表重建或字典修改)和INSTANT(仅改元数据,8.0+专属)。

SQL在线DDL的核心,是让结构变更不中断业务读写。它不是“完全不锁”,而是把长时锁拆成多个短时锁,配合日志、临时结构和版本控制,在用户几乎无感的情况下完成表定义更新。
三种主流执行算法及其适用场景
MySQL从5.6起支持Online DDL,本质是根据操作类型自动或手动选择以下一种算法:
- COPY算法:创建临时表 → 拷贝全量数据 → 应用增量DML日志 → 原子替换表名。全程仅在最后切换瞬间加MDL写锁(毫秒级),但需额外1.2倍磁盘空间。适用于修改列类型、删主键、改字符集等行格式变更操作。
-
INPLACE算法:直接在原表上操作。又分两类:
– rebuild型(如建索引、增删列):需重建聚簇索引,期间缓存DML变更,完成后批量合并;
– no-rebuild型(如改默认值、重命名索引):只改数据字典,几乎不锁表,但MySQL 5.7之前不支持部分操作。 -
INSTANT算法(MySQL 8.0+专属):仅修改数据字典元数据,不触碰表空间文件,不生成row log,不加MDL排他锁。例如
ADD COLUMN末尾新增一列、MODIFY COLUMN DEFAULT等,真正实现“秒级”且完全不阻塞DML。
关键支撑机制:如何保障一致性与并发
在线DDL不是靠“不锁”,而是靠精细化协同:
扩展自原生的Bootstrap对话框并提供一些额外的功能。 它引入一个ModalManager类,能够在屏幕后处理多个模态对话框,通过监听他们的事件实现。
- MDL锁分级退化:ALTER启动时获取MDL写锁,确认权限和语法后立即降级为读锁,允许DML继续,但禁止其他DDL并发执行。
- Row Log(行日志):在COPY或rebuild型INPLACE过程中,所有DML变更被实时捕获并写入内存buffer,再刷到磁盘row log文件;待新表就绪后,回放这些日志保证逻辑一致。
- 两阶段提交式替换:最终原子切换使用文件系统rename(Linux下是原子操作),避免中间态暴露;同时更新数据字典、刷新表缓存、通知InnoDB存储引擎重新加载元信息。
不同版本的能力边界
不是所有ALTER都“在线”,能否执行取决于MySQL版本和具体操作:
- red">MySQL 5.5:引入INPLACE概念,但实际仍阻塞DML,基本不可用作线上变更。
- MySQL 5.6:首个真正可用的Online DDL版本,支持添加/删除二级索引、扩展VARCHAR长度等,但不支持修改列类型或加主键。
- MySQL 5.7:扩展支持重命名索引、调整数值类型精度、增大VARCHAR,但缩小长度或改NOT NULL仍需COPY。
-
MySQL 8.0:引入INSTANT、原子DDL、重做日志持久化DDL元操作;
ALGORITHM=INSTANT成为最轻量选项,但仅限特定元数据类变更。
实践中的关键控制参数
通过显式指定可提升可控性与可预测性:









