文档

Online DDL

更新时间:

本文PolarDB-X的DDL的online执行特征进行了详细说明。

前提条件

Online特性概述

本文将对在线业务无影响或者影响时间和范围较小的DDL称为online ddl。

PolarDB-X中存在两类DDL:

  • 第一类为物理执行,直接下推到DN执行物理DDL,包括local index操作、column操作、table操作,CN只进行分片级的物理语句转发、协调和元信息管理,此类DDL的实现原理及online特征与MySQL 5.7基本保持一致。

  • 第二类为逻辑执行,由CN自行实现完整的DDL变更流程,包括global index操作、partition操作、primary key操作以及omc(online modify column),实现方式为实例中冗余一份临时表回填存量和追赶增量数据,然后切流到新表, CN处理完整的数据回填、增量多写和元信息管理流程,此类DDL均是不锁表的。

具体地说,可根据对业务SQL的影响从以下三个维度进一步分析DDL online的行为特征:

  • 是否锁表:online ddl只在切表时秒级阻塞DML操作,在执行的绝大部分时间内均允许DML操作;非online ddl则会在执行过程中全程禁写。

  • 是否需要回填数据:对于只涉及元数据修改的DDL,如instant add column或者rename table,无需处理实际数据,一般在秒级时间内即可完成;另外,对于删表或者删除索引操作,除修改元数据外仅需删除相关物理文件,一般执行时间也较短;对于非instant以及非删表删索引的DDL,则需要在物理执行或者逻辑执行中拷贝原有数据,写入新的聚簇或者二级索引,执行时间与表的大小、并发度、实例资源规格等均相关,且在执行过程中占用一定量的集群资源。

  • 是否需要同步多写:此条仅涉及逻辑执行且需回填数据的DDL,此类DDL在数据回填期间需要将在线DML流量同步多写到目标临时表上,可能与回填流量之间出现数据冲突,并且由于多写采用分布式事务保证原子性,在线流量的性能将出现一定程度的下降。PolarDB-X对于包括move/split partition、omc、rebalance在内的逻辑执行DDL均实现了异步多写优化,将DML的多写流量缓存到数据回填阶段后异步执行,此类DDL的多写冲突和写入性能下降的持续时间被优化到了极短的时间。

DDL online特性说明

索引操作

操作类型

是否逻辑执行

是否锁表

是否重建表

是否需要回填数据

是否支持异步多写优化

创建局部二级索引

No

No

No

Yes

-

删除局部二级索引

No

No

No

No

-

重命名局部二级索引

No

No

No

No

-

创建全局二级索引

Yes

No

Yes

Yes

No

删除全局二级索引

Yes

No

No

No

-

重命名全局二级索引

Yes

No

No

No

-

列操作

操作类型

是否逻辑执行

是否锁表

是否重建表

是否需要回填数据

是否支持异步多写优化

加列

No

No

Yes

Yes

-

减列

No

No

Yes

Yes

-

重命名列

No

No

No

No

-

修改列的顺序

No

No

Yes

Yes

-

修改列的默认值

No

No

No

No

-

删除列的默认值

No

No

No

No

-

修改列的数据类型[①,②]

No

Yes

Yes

Yes

-

延长varchar类型列的长度

No

No

No

No

-

修改列为NULL

No

No

Yes

Yes

-

修改列为NOT NULL

No

No

Yes

Yes

-

PolarDB-X对于加列操作单独支持INSTANT算法,可在仅修改元数据的情况下执行;对于部分改列操作,可采用逻辑执行在线完成,在分别显式声明ALGORITHM=INSTANT和ALGORITHM=OMC前提下,上述两种操作的online执行特征如下:

操作类型

是否逻辑执行

是否锁表

是否重建表

是否需要回填数据

是否支持异步多写优化

秒级加列

No

No

No

No

-

在线变更列类型

Yes

No

Yes

Yes

Yes

修改列涉及主表或者GSI拆分列时,将会触发主表或者GSI的数据重分布,需要在CN上逻辑执行,详细内容请参见主键与拆分键变更操作

在延长VARCHAR列长度时,存储VARCHAR列的长度存储字段不变时才能支持仅修改元数据。255个字节以下的VARCHAR列长度需要一个字节存储,256个字节及以上的VARCHAR列长度需要两个字节存储。因而,延长VARCHAR列时,如果原字节长度到目标字节长度的变化跨越256,则只能支持COPY算法锁表执行。

对于修改列为NOT NULL操作,当SQL_MODE包含strict_trans_tables或者strict_all_tables标志时,此操作为online操作,否则将会降级为COPY算法直接锁表拷贝数据。

表操作

操作类型

是否逻辑执行

是否锁表

是否重建表

是否需要回填数据

是否支持异步多写优化

修改ROW_FORMAT

No

No

Yes

Yes

-

OPTIMIZE TABLE

No

No

Yes

Yes

-

重命名表

No

No

No

No

-

声明字符集

No

No

Yes

Yes

-

转换字符集

No

Yes

Yes

Yes

-

清理表(TRUNCATE TABLE without GSI)

No

No

Yes

No

-

清理带有GSI的表(TRUNCATE TABLE with GSI))

Yes

No

Yes

No

-

分区操作

操作类型

是否逻辑执行

是否锁表

是否重建表

是否需要回填数据

是否支持异步多写优化

迁移分区

Yes

No

Yes(仅重建相应分区)

Yes

Yes

分裂分区

Yes

No

Yes(仅重建相应分区)

Yes

Yes

合并分区

Yes

No

Yes(仅重建相应分区)

Yes

No

增加分区

Yes

No

No

No

-

删除分区

Yes

No

No

No

-

重组分区

Yes

No

Yes(仅重建相应分区)

Yes

No

清空分区

Yes

No

No

No

-

重命名分区

Yes

No

No

No

-

修改分区

Yes

No

Yes(仅重建相应分区)

Yes

No

表组和表级分区操作的online特性完全相同,均可参照上表。

异步多写优化通过主键对齐多写的行级流量,PolarDB-X确保所有逻辑表和除全局唯一二级索引(UGSI)以外全局二级索引均具有显式或者隐式主键,而UGSI默认不包含主键,因而此优化对UGSI不适用,UGSI上的DML流量仍是同步多写。

如果原来的Range/Range Columns没有定义MAXVALUE分区或原来的List/List Columns没有定义DEFAULT分区,增加分区的操作无须回填数据,否则就需要回填部分分区数据。

对于Range/Range Columns的删除分区,如果删除的分区是最后一个分区,则没有数据回填,否则会产生数据回填; 对于List/List Columns的删除分区,如果没有定义DEFAULT分区,删除分区操作不会产生数据回填,否则会产生数据回填。

主键与拆分键变更操作

操作类型

是否逻辑执行

是否锁表

是否重建表

是否需要回填数据

是否支持异步多写优化

添加主键

Yes

No

Yes

Yes

No

删除原有主键并添加新主键

Yes

No

Yes

Yes

No

修改拆分方式、分区数或者拆分字段

Yes

No

Yes(重建变更拆分的GSI或者主表)

Yes

No

修改涉及GSI或者主表拆分列的定义

Yes

No

Yes(重建以变更列为拆分键的GSI或者主表)

Yes

No

Sequence变更操作

操作类型

是否逻辑执行

是否锁表

是否重建表

是否需要回填数据

是否支持异步多写优化

创建Sequence

Yes

No

No

No

-

删除Sequence

Yes

No

No

No

-

修改Sequence属性

Yes

No

No

No

-

转换Sequence 类型

Yes

No

No

No

-

Generated Column操作

操作类型

是否逻辑执行

是否锁表

是否重建表

是否需要回填数据

是否支持异步多写优化

增加VIRTUAL Column

No

No

No

No

-

删除VIRTUAL Column

No

No

No

No

-

增加STORED Column

No

No

No

Yes

No

删除STORED Column

No

No

No

No

-

增加LOGICAL Column

Yes

No

No

Yes

No

删除LOGICAL Column

Yes

No

No

No

-

如何控制online执行特性

PolarDB-X支持通过下面的方式指定online执行特征:

  • 对于加列,可通过声明ALGORITHM=INSTANT指定采用intant add column方式。

  • 对于在线修改列,可以通过声明ALGORITHM=OMC方式指定采用逻辑执行方式。

  • 对于逻辑执行的DDL, 默认均为online执行方式,不需要任何特殊声明。

  • 对于物理执行的列操作索引操作DDL,可通过声明ALGORITHM=INPLACE指定online执行方式,如不支持则会直接报错,如支持则会直接执行。