什么是OnlineDDL?
2 个回答
无论什么关系,我看不到我想要的态度。我就不会给你想要的细节。小三**Online DDL(在线DDL)** 是数据库提供的一种能够在不中断业务访问或只短暂影响业务的情况下完成数据结构变更(如添加字段、添加索引、修改列定义等)的技术。 在MySQL中,Online DDL通常指的是通过特定的DDL执行算法(ALGORITHM)和锁机制(LOCK)减少对业务的影响,核心目标是: - **不锁表或尽量缩短锁表时间**,避免业务阻塞。 - **在修改表结构时持续允许读写操作**,提高业务连续性。 ### 常见实现方式: - MySQL InnoDB 提供了三种DDL算法: - **COPY**:复制整张表(老方式),需长时间锁表,业务影响较大。 - **INPLACE(在线)**:在原表基础上直接完成修改,业务无明显阻塞。 - **INSTANT(即时)**:仅修改元数据,无需重建表结构,例如增加列(需放在表尾且有默认值)。 例如: ```sql ALTER TABLE user ADD COLUMN age INT DEFAULT 0, ALGORITHM=INPLACE, LOCK=NONE; ``` - **ALGORITHM=INPLACE** 表示在线(原地)修改表结构。 - **LOCK=NONE** 表示修改期间允许DML操作,不锁表。 ### 常用的第三方工具: - **pt-online-schema-change**: - 原理:创建临时表、迁移数据,通过触发器捕获增量变更,最后快速切换表。 - 优势:支持几乎所有DDL操作,影响最小。 - 劣势:增加额外IO与CPU消耗。 ### 常见问题与限制: - 不支持所有DDL操作,如修改主键、修改分区键等特殊操作可能不支持在线。 - 在线DDL过程可能引发额外的资源占用(磁盘IO、CPU),需注意监控线上负载。 ### 总结: Online DDL是一种数据库表结构在线变更方案,MySQL原生InnoDB通过`ALGORITHM=INPLACE`实现,主流公司大都采用这种方式配合第三方工具如 `pt-online-schema-change` 或`gh-ost`进行安全高效的在线表结构变更,以保障服务高可用性。发布于 2025-03-15 11:47 •IP属地 天津举报评论收藏
天一亮,时间就不属于我了。林惊羽**Online DDL** 是 MySQL 5.6 引入的一种 DDL 执行优化方案,尽可能减少 `ALTER TABLE` 等操作对数据库的影响,使 DML(增删改查)在 DDL 执行过程中仍能进行,但并非所有 DDL 变更都能完全无锁执行。 ### **1. Online DDL 的背景** 在 MySQL 5.6 之前,执行 `ALTER TABLE` 之类的 DDL 操作时,会**锁定整个表**,导致所有写入、查询操作被阻塞。例如: ```sql ALTER TABLE users ADD COLUMN age INT; ``` 在大表上执行时,可能导致长时间锁表,影响业务。 为了解决这个问题,MySQL 5.6 引入了 **Online DDL**,允许在大多数 DDL 操作期间继续进行**读写操作**。 ### **2. Online DDL 的工作原理** Online DDL 主要分为 **Prepare(准备)、Execute(执行)、Commit(提交)** 三个阶段: #### **1️⃣ Prepare 阶段** - 创建临时 `.frm` 文件,存储新表结构。 - 获取 **排他 MDL 锁**,禁止表的 DML 操作(时间短)。 - 根据变更类型,选择合适的 DDL 执行方式(`COPY`、`INPLACE`)。 - 分配 **row_log**(记录 DML 变更的日志)。 #### **2️⃣ Execute 阶段** - 降级 **MDL 锁**,允许 DML(读写)。 - 扫描原表数据,构建索引或修改表结构。 - 记录 DDL 执行过程中新增的 DML 变更到 **row_log**。 - 处理增量数据,保证数据一致性。 #### **3️⃣ Commit 阶段** - **再次获取排他 MDL 锁**(时间短)。 - **回放 row_log**,将 DDL 执行过程中产生的数据变更应用到新表。 - **更新数据字典**,完成 DDL 变更。 - **释放 MDL 锁**,DDL 操作完成。 ### **3. Online DDL 的算法** MySQL 5.6+ 支持 3 种不同的 DDL 变更方式: #### **1️⃣ COPY(旧方式,全表重建)** - **创建新表**,复制原表数据,执行变更后替换原表。 - **需要长时间表锁**,对大表影响极大。 - **适用于不支持 Online DDL 的操作**。 #### **2️⃣ INPLACE(在线修改,减少锁)** - **不会创建新表,而是尽可能在原表上直接修改**。 - **执行过程中允许 DML 操作**(大部分情况下)。 - **适用于增加索引、修改列类型等**。 INPLACE 进一步分为: - `inplace-no-rebuild`:不重建原表,如**修改索引、变长字段(`VARCHAR`)**等。 - `inplace-rebuild`:需要重建原表,如**修改主键、删除列、修改字符集**等。 #### **3️⃣ INSTANT(MySQL 8.0.12+,最快方式)** - 仅修改 **元数据**,不重建表。 - **几乎瞬间完成**,不影响性能。 - **适用于添加列等少数操作**。 **查看当前 MySQL 选择的 DDL 执行方式:** ```sql EXPLAIN FORMAT=JSON ALTER TABLE users ADD COLUMN age INT; ``` ### **4. Online DDL 的优缺点** #### ✅ **优点** - **减少锁表时间**,大部分情况下 DML 可正常执行。 - **降低业务影响**,适用于大表结构变更。 - **支持回放 DML**,保证数据一致性。 #### ❌ **缺点** - **仍需获取 MDL 锁**,如果有**长事务未提交**,DDL 可能会阻塞。 - **某些操作仍会锁表**(如修改主键)。 - **失败回滚代价高**,可能影响主从复制。 --- ### **5. Online DDL 使用注意事项** - **避免高峰期执行 DDL**,即使是 Online DDL 仍可能影响性能。 - **检查是否有长事务**,防止 DDL 执行时等待锁: ```sql SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; ``` - **使用 `pt-online-schema-change` 或 `gh-ost` 等工具**,更加安全地执行 Online DDL。 - **MySQL 8.0+ 尽可能使用 `INSTANT`,避免重建表**。 ### **6. Online DDL 适用场景** | 操作 | COPY | INPLACE | INSTANT | |------|------|---------|---------| | 添加列 | ❌ | ✅ | ✅ | | 删除列 | ❌ | ✅ | ❌ | | 修改列类型 | ❌ | ✅ | ❌ | | 添加索引 | ❌ | ✅ | ❌ | | 删除索引 | ❌ | ✅ | ❌ | | 修改主键 | ❌ | ✅ | ❌ | ### **7. 结论** Online DDL **减少了 DDL 操作对业务的影响**,但仍有局限性。在大规模变更时,仍需**谨慎选择执行方式**,避免影响数据库性能。编辑于 2025-03-15 06:00 •IP属地 美国举报评论收藏
公众号进入网站体验更佳

