文章目录
🧩 MySQL Online DDL 操作机制与版本支持
MySQL 从 5.6 开始引入 Online DDL(在线DDL),允许在 DDL 操作过程中减少锁表时间、降低对业务的影响。
根据不同的实现方式,主要分为三类:

1. Copy (Offline) 模式
操作方式:需要重建整张表(阻塞写操作)
特点
- MySQL 会创建一个临时表,把原表数据复制过去。
- 期间表会被锁定(写锁),操作期间无法写入。
- 适用于结构变化较大的 DDL 操作。
典型操作
| 操作类型 | 说明 |
|---|---|
| 删除主键 | 需要重建表 |
| 修改列类型 | 例如 INT → BIGINT |
| 转换字符集 | utf8 → utf8mb4 |
| 表空间加密 | 加密需要重新创建表 |
| 分区操作(部分情况) | 如从非分区表转换为分区表 |
支持版本
- MySQL 5.5 及以前: 所有 DDL 均为 copy 模式(完全阻塞)
- MySQL 5.6 起: 保留 copy 模式,但多数操作支持 online/inplace
2. Inplace (Online) 模式
操作方式:不复制整表,通过修改表结构元数据实现在线变更
类型
分为两种情况:
🔹 (1) rebuild — 需要重建数据页但不复制整表
| 操作 | 说明 |
|---|---|
| 添加主键 | 需重建聚簇索引 |
| 删除并重新添加主键 | 重建聚簇索引 |
| 添加列 / 删除列 | 重建数据页 |
修改 ROW_FORMAT | 需要重建页 |
修改 KEY_BLOCK_SIZE | 压缩表结构变化 |
| OPTIMIZE TABLE | 实际是 rebuild 表 |
执行 ALTER TABLE ... ENGINE=InnoDB | 实际触发 rebuild |
| 修改字符集 | rebuild 表以重编码 |
| 创建、添加二级索引 | rebuild 索引页 |
🔹 (2) no-rebuild — 不重建数据页
| 操作 | 说明 |
|---|---|
| 创建 / 删除索引 | 部分可直接修改元数据 |
| 重命名索引 | 不涉及数据变动 |
| 修改索引类型 | 修改元数据即可 |
| 重命名表 | 仅改表名,瞬间完成 |
| 设置 / 删除列默认值 | 仅更新元数据 |
| 修改 VARCHAR 长度(255以内) | 无需 rebuild |
| 添加 / 删除外键 | 改元数据 |
⚠️ 若
VARCHAR长度调整超过 255,则仍需 copy 模式。
支持版本
- MySQL 5.6:首次引入 Inplace Online DDL
- MySQL 5.7:扩大支持范围(支持更多 no-rebuild 操作)
- MySQL 8.0:进一步优化 Online DDL 的并发与日志处理
3. Inplace but Offline 模式
操作方式:表结构修改可在线执行,但首次创建索引需离线
| 操作 | 说明 |
|---|---|
| 添加 FULLTEXT 索引 | 首次需 offline,之后可 online |
| 添加 SPATIAL 索引 | 首次需 offline,之后可 online |
支持版本
- MySQL 5.6:首次支持 FULLTEXT、SPATIAL Online DDL(部分)
- MySQL 5.7+:完全支持 online 添加这些索引
🧠 小结对比表
| 模式 | 是否锁表 | 是否复制表 | 常见操作 | 引入版本 |
|---|---|---|---|---|
| Copy Offline | ✅ 锁表 | ✅ 全表复制 | 删除主键、修改列类型 | ≤5.5 |
| Inplace Online (rebuild) | ⚠️ 短暂锁表 | ❌ 不复制表,仅重建数据页 | 添加列、修改ROW_FORMAT | 5.6+ |
| Inplace Online (no-rebuild) | 🚫 几乎无锁 | ❌ 不重建 | 改默认值、重命名索引 | 5.6+ |
| Inplace but Offline | ⚠️ 首次offline,之后online | ❌ 不复制 | 添加全文或空间索引 | 5.6+ |
📘 参考命令
查看当前 MySQL 的 Online DDL 支持情况:
SHOW VARIABLES LIKE 'innodb_online_alter_log_max_size';
SHOW VARIABLES LIKE 'innodb_table_locks';
SHOW ENGINE INNODB STATUS\G
🔧 实用建议
-
若为高并发业务库,DDL 推荐:
ALTER TABLE table_name ALGORITHM=INPLACE, LOCK=NONE;可强制使用在线模式(失败则报错不执行)。
-
若要完全无锁,可使用
gh-ost或pt-online-schema-change。
1万+

被折叠的 条评论
为什么被折叠?



