MySQL大表DDL操作
概述
MySQL大表(千万级+行)执行DDL操作(如添加字段)时的快速方案选择。核心问题是传统DDL会锁表和全表复制,导致线上服务中断。
MySQL版本演进
| 版本 | 特性 | 说明 |
|---|---|---|
| 5.5及以前 | COPY算法 | 全表复制,全程锁表 |
| 5.6+ | Online DDL (INPLACE) | 允许并发DML,但仍需重建数据 |
| 8.0.12+ | INSTANT ADD COLUMN | 只改元数据,毫秒级,仅限末尾加列 |
| 8.0.29+ | INSTANT任意位置加列 | 放宽了位置限制 |
INSTANT的限制
- ❌ 添加列的同时添加索引
- ❌ 列涉及外键
- ❌ ROW_FORMAT=COMPRESSED
- ❌ 表含全文索引
- ❌ 临时表
第三方工具
gh-ost(GitHub)
- 解析binlog同步增量数据,无触发器
- ⭐ 13,300+ Stars
- 适合高并发写入场景
- 支持暂停/恢复/回滚
pt-online-schema-change(Percona)
- 使用触发器同步增量数据
- 高并发写入时触发器开销较大
- 上手简单,Percona Toolkit的一部分
对比
- 高并发 → gh-ost(无触发器)
- 低并发/已有经验 → pt-osc
- MySQL 8.0+ → 优先INSTANT
操作前检查清单
- 表大小、行数、索引大小
- 外键约束
- 主从延迟状态
- 磁盘剩余空间(至少表大小的2倍)
相关实体
- [[mysql]] — 数据库系统
- [[gh-ost]] — GitHub开源DDL工具
- [[pt-online-schema-change]] — Percona DDL工具
来源
- IMA知识库「κ的知识库」原始收藏
- MySQL 8.0 Reference Manual