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进行简单对比。
|
方案 |
MySQL Online DDL |
gh-ost |
|---|---|---|
|
适用场景 |
|
若DDL操作只能采用COPY算法,原表又是大表/频繁执行DML的表,对性能和稳定性要求高的场景,推荐使用gh-ost。 |
|
原理 |
|
|
|
约束限制 |
|
|
|
DML阻塞时长 |
|
1. 数据同步期间,分批次锁定行数据,仅阻塞批次内的行数据的DML操作,不阻塞批次外的行数据。 2. 原子表名切换时会阻塞,时间极短。 |
|
额外空间占用 |
|
至少占用和原表空间一样大小。 |
|
复制延迟 |
|
中。 |