更新时间:2025-12-29 GMT+08:00
分享

Online DDL使用指导

操作场景

在数据库的日常运维与使用中,数据定义语言(DDL)操作,如为表添加字段、增删索引,是常见的需求。然而,对于大型表而言,这些操作可能持续数小时甚至数天,并在此期间阻塞对原表的所有DML(INSERT/UPDATE/DELETE等)操作,严重影响业务的连续性和可用性。

为了解决这一核心问题,MySQL Online DDL功能在实现表结构变更的同时,允许对该表进行并发的数据读写操作,从而最大限度地保证业务的连续性和可用性。本章节将详细介绍MySQL官方基于InnoDB存储引擎的Online DDL实现机制,以及gh-ost工具的实现原理,帮助您更安全、高效地执行DDL操作。

MySQL Online DDL介绍

在 MySQL Online DDL 操作中,通过显式指定ALGORITHM可以对表结构变更的行为进行精细控制。以添加索引为例:

ALTER TABLE table_name  ADD INDEX index_name(column_name), ALGORITHM=INPLACE;

其中,ALGORITHM 用于指定 DDL 执行的算法,可选取值如下:

  • COPY:会在整个DDL操作过程中阻塞所有并发DML操作,可能导致长时间的数据库锁定,因此不推荐使用。
  • INPLACE:允许在不阻塞并发DML的情况下执行DDL操作,适用于大多数DDL操作。DDL支持情况请参考如何确定DDL是否支持instant或inplace算法?
  • INSTANT:通过修改数据字典中的元数据来完成DDL操作,无需复制数据或重建表,因此通常可以在秒级完成,对原表数据几乎无影响,不阻塞并发DML,但仅支持少数DDL操作,推荐使用。DDL支持情况请参考如何确定DDL是否支持instant或inplace算法?

gh-ost工具介绍

若DDL操作只能采用COPY算法(全程锁表),且原表是大表/频繁执行DML的表,对性能和稳定性要求高的场景,可以考虑使用gh-ost。

gh-ost是一款开源工具,专为MySQL数据库设计,用于执行Online DDL操作,避免传统DDL操作导致的长时间锁表,从而减少对业务的影响。

免责声明

gh-ost是第三方开源工具,并非华为云产品。为了帮助您更好地使用gh-ost,本文介绍了gh-ost的使用约束、建议、工作原理等内容,内容仅供参考。更多详细内容请参见官方文档

MySQL Online DDL 与gh-ost的区别

下面对MySQL官方DDL和gh-ost进行简单对比。

表2 MySQL Online DDL 与gh-ost的区别

方案

MySQL Online DDL

gh-ost

适用场景

  • 若DDL操作支持INSTANT或INPLACE,推荐使用。
  • 若DDL操作仅支持COPY算法,不推荐使用(尤其是大表)。

若DDL操作只能采用COPY算法,原表又是大表/频繁执行DML的表,对性能和稳定性要求高的场景,推荐使用gh-ost。

原理

  • INSTANT 算法:仅修改元数据。
  • INPLACE 算法:在现有表空间内修改元数据和数据页,并通过row Log同步增量数据。
  • COPY 算法:创建临时表并拷贝数据。
  1. 创建影子表。
  2. 消费Binlog同步增量数据。
  3. 分批拷贝原表数据到影子表。
  4. 原子交换表名。
  5. 清理资源,执行结束。

约束限制

  • 删除主键、新增全文索引/空间索引、更改列类型等少数操作,仅支持COPY算法。
  • 不支持临时表。
  • 表必须存在唯一键。
  • 必须开启 binlog,且binlog格式必须是row,binlog_row_image必须是FULL。
  • 不支持临时表、外键、触发器。

DML阻塞时长

  • INSTANT:阻塞时间短。
  • INPLACE:仅开始和结束阶段短暂阻塞。
  • COPY:全程阻塞。

1. 数据同步期间,分批次锁定行数据,仅阻塞批次内的行数据的DML操作,不阻塞批次外的行数据。

2. 原子表名切换时会阻塞,时间极短。

额外空间占用

  • INSTANT:极小。
  • INPLACE:小(需要重建表时略大) 。
  • COPY:至少占用和原表空间一样大小。

至少占用和原表空间一样大小。

复制延迟

  • INSTANT:极小。
  • INPLACE:小 。
  • COPY:大 。

中。

FAQ

相关文档