【MySQL】MySQL Online DDL

🧩 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_FORMAT5.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-ostpt-online-schema-change


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值