本文基于云原生数据库PolarDB MySQL版,对常见DDL的操作进行了说明,方便用户查询和了解DDL的行为,评估DDL操作风险,降低对业务的影响。
DDL操作说明
在MySQL生态中,DDL是一类非常复杂的操作,包括Index操作、Primary Key操作、Column操作、Table操作、Foreign Key操作、Generated Column操作等多种不同类型的操作。DDL操作不仅耗时长、消耗硬件资源多,而且其中涉及锁表操作,操作不当就可能影响正常业务,造成灾难性的影响。
PolarDB MySQL版的DDL模块经过多年的经验积累和持续的功能迭代,在性能和锁稳定性方面取得了长足的进步。本文将从如下几个方面介绍PolarDB MySQL版的各个版本常见的DDL操作的行为特征:
是否锁表(允许并发DML):非锁表的DDL(Online DDL)只在修改元数据时申请表互斥锁(持续时间一般不超过1秒),在表结构变更期间允许对目标表进行读写操作,提高了在生产环境中的响应速度和可用性。相反,不支持Online DDL功能的语句会全程锁表,不支持并发的写入操作,当DDL操作持续时间较长时,可能会对业务操作造成重大影响。
是否重建表(持续时间长短):此类DDL需要根据新的表结构重新创建Primary Key以及所有二级索引,通常需要花费较长时间。
说明由于PolarDB MySQL版支持并行DDL功能,使用内核方式执行DDL的性能远优于使用gh-ost/pt-osc等第三方工具时的性能。
是否只修改元数据(秒级完成):只修改元数据,无需修改表数据。此类DDL操作的执行时间不会随着表规模的变大而变长,一般秒级完成。
是否支持并行DDL(多线程加速):对于在大表上创建索引、重建表等场景,PolarDB支持通过并行DDL,使用多线程提升DDL的执行效率,最高可提升15~20倍的性能。详细内容请查看并行DDL的说明文档。
DDL执行算法
PolarDB MySQL版支持以下三种DDL执行算法:
INSTANT算法: 使用INSTANT算法执行DDL操作时,只需要修改数据字典中的元数据,不需要修改或复制存量数据,也不需要重建表。因此其不受表的大小影响,整个DDL过程可以秒级完成。
INPLACE算法:使用INPLACE算法时,表中数据的复制和重建都是在引擎内部完成,执行速度会更快。同时,绝大部分使用INPLACE算法执行的DDL允许并发读写访问,对业务的影响较小。此外,部分采用INPLACE算法执行的DDL,如RENAME TABLE、ADD COMMENT等可以做到仅修改元信息,不修改表中数据,可以做到秒级完成。
COPY算法:当使用COPY算法执行DDL操作时,需要将表中所有的数据复制到新表中。在数据复制期间,会持有原表的SNW(SHARED_NO_WRITE)锁。因此,在执行DDL操作期间仅支持读操作,不允许执行并发写入操作,对业务影响较大。
其中,允许并发读写操作的DDL操作被统称为Online DDL。Online DDL对业务的影响相对较小。通常情况下,用户无需手动指定DDL使用的算法,PolarDB会自动按照INSTANT、INPLACE、COPY的顺序选择最佳的算法。此外,您也可以使用ALTER TABLE语句的ALGORITHM和LOCK子句对DDL的行为做精细化管理:
ALGORITHM子句:为了使用指定算法执行DDL语句,您可以指定ALGORITHM字段,可选的值有DEFAULT、INSTANT、INPLACE和COPY。当DDL操作不支持该算法时,会立即返回报错。
LOCK子句:LOCK子句用于调整执行DDL期间对表的并发访问。您可以使用该LOCK子句来控制表被更改时的并发读写级别,可配置的选项及含义介绍如下:
DEFAULT:内核根据不同的DDL类型,允许最大程度的并发读取和写入。
NONE:允许在执行DDL期间进行并发读取和写入。如果不支持,则返回错误。
SHARED:允许并发读取但阻止写入。如果不支持并发读取,则返回错误。
EXCLUSIVE:禁止在执行DDL操作期间的一切并发读取和写入操作。
为了防止在执行ALTER TABLE期间出现表不可访问的情况,您可以在ALTER TABLE语句中指定LOCK子句。即如果DDL执行时的锁行为不满足给定条件时,操作就会被立即停止。
DDL行为特征
Index操作
PolarDB MySQL版8.0.2版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
创建二级索引 | 是 | 否 | 否 | 支持 |
删除二级索引 | 是 | 否 | 是 | 不涉及 |
重命名二级索引 | 是 | 否 | 是 | 不涉及 |
增加全文索引(FULLTEXT) | 否 | 否 说明 在添加表的第一个全文索引时,如果没有用户定义的FTS_DOC_ID列,会导致额外的重建表操作。 | 否 | 不支持 |
增加空间索引(SPATIAL) | 否 | 否 | 否 | 不支持 |
PolarDB MySQL版8.0.1版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
创建二级索引 | 是 | 否 | 否 | 支持 |
删除二级索引 | 是 | 否 | 是 | 不涉及 |
重命名二级索引 | 是 | 否 | 是 | 不涉及 |
增加全文索引(FULLTEXT) | 否 | 否 说明 在添加表的第一个全文索引时,如果没有用户定义的FTS_DOC_ID列,会导致额外的重建表操作。 | 否 | 不支持 |
增加空间索引(SPATIAL) | 否 | 否 | 否 | 不支持 |
PolarDB MySQL版5.7版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
创建二级索引 | 是 | 否 | 否 | 支持 |
删除二级索引 | 是 | 否 | 是 | 不涉及 |
重命名二级索引 | 是 | 否 | 是 | 不涉及 |
增加全文索引(FULLTEXT) | 否 | 否 说明 在添加表的第一个全文索引时,如果没有用户定义的FTS_DOC_ID列,会导致额外的重建表操作。 | 否 | 不支持 |
增加空间索引(SPATIAL) | 否 | 否 | 否 | 不支持 |
PolarDB MySQL版5.6版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
创建二级索引 | 是 | 否 | 否 | 不支持 |
删除二级索引 | 是 | 否 | 是 | 不涉及 |
重命名二级索引 | 是 | 否 | 是 | 不涉及 |
增加全文索引(FULLTEXT) | 否 | 否 说明 在添加表的第一个全文索引时,如果没有用户定义的FTS_DOC_ID列,会导致额外的重建表操作。 | 否 | 不支持 |
增加空间索引(SPATIAL) | 否 | 否 | 否 | 不支持 |
Primary Key操作
PolarDB MySQL版8.0.2版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加Primary Key | 是 | 是 | 否 | 支持 |
删除Primary Key | 否 | 是 | 否 | 不支持 |
删除原来的Primary Key,增加新的Primary Key | 是 | 是 | 否 | 支持 |
PolarDB MySQL版8.0.1版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加Primary Key | 是 | 是 | 否 | 支持 |
删除Primary Key | 否 | 是 | 否 | 不支持 |
删除原来的Primary Key,增加新的Primary Key | 是 | 是 | 否 | 支持 |
PolarDB MySQL版5.7版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加Primary Key | 是 | 是 | 否 | 支持 |
删除Primary Key | 否 | 是 | 否 | 不支持 |
删除原来的Primary Key,增加新的Primary Key | 是 | 是 | 否 | 支持 |
PolarDB MySQL版5.6版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加Primary Key | 是 | 是 | 否 | 不支持 |
删除Primary Key | 否 | 是 | 否 | 不支持 |
删除原来的Primary Key,增加新的Primary Key | 是 | 是 | 否 | 不支持 |
Column操作
PolarDB MySQL版8.0.2版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加列 | 是 | 否1 | 是1 | 支持1 |
删除列 | 是 | 是 | 否 | 支持 |
重命名列 | 是 | 否 | 是 | 不涉及 |
重排序列 | 是 | 是 | 否 | 支持 |
设置列的默认值 | 是 | 否 | 是 | 不涉及 |
修改列注释 | 是 | 否 | 是 | 不涉及 |
修改列类型 | 否 | 是 | 否 | 不支持 |
扩展VARCHAR长度 | 是2 | 否 | 是 | 不涉及 |
将UTF8mb3字符集修改为UTF8mb4字符集 | 否 | 否3 | 是3 | 不支持 |
删除列默认值 | 是 | 否 | 是 | 不涉及 |
修改auto-increment值 | 是 | 否 | 是 | 不涉及 |
变更某列为NULL | 是 | 是 | 否 | 支持 |
变更某列为非NULL | 是 | 是 | 否 | 支持 |
修改ENUM/SET列的定义 | 是 | 否 | 是4 | 不涉及 |
秒级加字段功能仅支持将列添加至表的末尾。当表未指定主键时,需要将参数
implicit_primary_key
的值设置为OFF,以避免在执行秒级加字段操作时因表的最末尾的隐式主键列导致加列操作失败。除此之外,不支持在压缩表(ROW_FORMAT=COMPRESSED)、带有全文索引的表以及临时表上执行秒级加字段操作。如果集群不支持使用秒级加字段功能,增加字段将使用INPLACE方式执行DDL。此时需要进行全表重建,重建期间允许并发读写操作。您也可以通过并行DDL功能进行加速。此外,若您的表中存在列存索引,由于加列操作需要重建列存索引,因此,不支持对含有列存索引的表执行秒级加列操作。您可以将参数
loose_imci_enable_add_column_instant_ddl
的值设置为ON来开启秒级加列功能,此时,PolarDB会在后台异步重建列存索引,重建期间列存索引暂不可用,详情请参见动态增加或删除列存索引的DDL语法。扩展VARCHAR长度时,存储VARCHAR列长度所需的字节数需要保持一致,才能支持快速列扩展。具体来说,对于0~255个字节的VARCHAR列,只需要一个Byte存储长度。而对于大于等于256字节的VARCHAR列,就需要两个Bytes存储长度。只有控制VARCHAR列长度的扩展范围,比如从0~255字节或从256字节扩展到更大的范围,才能保证在执行ALTER TABLE时只修改元数据。即当修改VARCHAR列的长度从小于256字节扩展到大于256字节的长度时,PolarDB默认使用Copy DDL,即全程锁表,不支持DML写操作,仅支持读操作。
当您不确定自己修改VARCHAR列的范围是否满足上述条件时,可以使用
ALGORITHM=INPLACE
指定采用INPLACE算法执行当前DDL操作。此时,如果不支持快速列扩展,则会直接报错。示例如下:ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
VARCHAR类型属于变长存储类型,磁盘仅存储实际长度,因此建议您在使用VARCHAR类型的字段时,考虑将最大长度直接调整到256个字节以上,以避免在扩展字段时可能需要使用COPY算法。
当满足以下条件时,将列的字符集从UTF8mb3修改至UTF8mb4仅修改元数据,无需修改数据。否则,需要使用COPY算法进行表重建,且重建期间全程锁表,目标表只能读,不能执行写入操作。
列类型为CHAR、VARCHAR、ENUM以及TEXT类型。
修改的列上不存在任何索引。
字符集转换前后,列的最大存储长度均小于256或均大于255。
您可以通过指定ALGORITHM=INPLACE来强制使用非重建表的方式执行DDL,如果需要使用COPY算法才能执行时,会立刻返回报错。示例如下:
ALTER TABLE test modify column b char(1) CHARACTER SET utf8mb4 default null,algorithm = inplace; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
仅当数据类型的存储大小不发生改变,且向ENUM或SET的末尾追加元素时,才可以仅修改元数据,不重建整张表。否则需要使用COPY算法进行表重建。
PolarDB MySQL版8.0.1版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加列 | 是 | 否1 | 是1 | 支持1 |
删除列 | 是 | 是 | 否 | 支持 |
重命名列 | 是 | 否 | 是 | 不涉及 |
重排序列 | 是 | 是 | 否 | 支持 |
设置列的默认值 | 是 | 否 | 是 | 不涉及 |
修改列注释 | 是 | 否 | 是 | 不涉及 |
修改列类型 | 否 | 是 | 否 | 不支持 |
扩展VARCHAR长度 | 是2 | 否 | 是 | 不涉及 |
将UTF8mb3字符集修改为UTF8mb4字符集 | 否 | 否3 | 是3 | 不支持 |
删除列默认值 | 是 | 否 | 是 | 不涉及 |
修改auto-increment值 | 是 | 否 | 是 | 不涉及 |
变更某列为NULL | 是 | 是 | 否 | 支持 |
变更某列为非NULL | 是 | 是 | 否 | 支持 |
修改ENUM/SET列的定义 | 是 | 否 | 是4 | 不涉及 |
秒级加字段功能仅支持将列添加至表的末尾。当表未指定主键时,需要将参数
implicit_primary_key
的值设置为OFF,以避免在执行秒级加字段操作时因表的最末尾的隐式主键列导致加列操作失败。除此之外,不支持在压缩表(ROW_FORMAT=COMPRESSED)、带有全文索引的表以及临时表上执行秒级加字段操作。如果集群不支持使用秒级加字段功能,增加字段将使用INPLACE方式执行DDL。此时需要进行全表重建,重建期间允许并发读写操作。您也可以通过并行DDL功能进行加速。此外,若您的表中存在列存索引,由于加列操作需要重建列存索引,因此,不支持对含有列存索引的表执行秒级加列操作。您可以将参数
loose_imci_enable_add_column_instant_ddl
的值设置为ON来开启秒级加列功能,此时,PolarDB会在后台异步重建列存索引,重建期间列存索引暂不可用,详情请参见动态增加或删除列存索引的DDL语法。扩展VARCHAR长度时,存储VARCHAR列长度所需的字节数需要保持一致,才能支持快速列扩展。具体来说,对于0~255个字节的VARCHAR列,只需要一个Byte存储长度。而对于大于等于256字节的VARCHAR列,就需要两个Bytes存储长度。只有控制VARCHAR列长度的扩展范围,比如从0~255字节或从256字节扩展到更大的范围,才能保证在执行ALTER TABLE时只修改元数据。即当修改VARCHAR列的长度从小于256字节扩展到大于256字节的长度时,PolarDB默认使用Copy DDL,即全程锁表,不支持DML写操作,仅支持读操作。
当您不确定自己修改VARCHAR列的范围是否满足上述条件时,可以使用
ALGORITHM=INPLACE
指定采用INPLACE算法执行当前DDL操作。此时,如果不支持快速列扩展,则会直接报错。示例如下:ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
VARCHAR类型属于变长存储类型,磁盘仅存储实际长度,因此建议您在使用VARCHAR类型的字段时,考虑将最大长度直接调整到256个字节以上,以避免在扩展字段时可能需要使用COPY算法。
当参数
loose_innodb_support_instant_modify_charset
的值为ON,且满足以下条件时,将列的字符集从UTF8mb3修改至UTF8mb4仅修改元数据,无需修改数据。否则,需要使用COPY算法进行表重建,且重建期间全程锁表,目标表只能读,不能执行写入操作。列类型为CHAR、VARCHAR、ENUM以及TEXT类型。
修改的列上不存在任何索引。
字符集转换前后,列的最大存储长度均小于256或均大于255。
您可以通过指定ALGORITHM=INPLACE来强制使用非重建表的方式执行DDL,如果需要使用COPY算法才能执行时,会立刻返回报错。示例如下:
ALTER TABLE test modify column b char(1) CHARACTER SET utf8mb4 default null,algorithm = inplace; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
仅当数据类型的存储大小不发生改变,且向ENUM或SET的末尾追加元素时,才可以仅修改元数据,不重建整张表。否则需要使用COPY算法进行表重建。
PolarDB MySQL版5.7版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加列 | 是 | 否1 | 是1 | 支持1 |
删除列 | 是 | 是 | 否 | 支持 |
重命名列 | 是 | 否 | 是 | 不涉及 |
重排序列 | 是 | 是 | 否 | 支持 |
设置列的默认值 | 是 | 否 | 是 | 不涉及 |
修改列注释 | 是 | 否 | 是 | 不涉及 |
修改列类型 | 否 | 是 | 否 | 不支持 |
扩展VARCHAR长度 | 是2 | 否 | 是 | 不涉及 |
将UTF8mb3字符集修改为UTF8mb4字符集 | 否 | 是 | 否 | 不支持 |
删除列默认值 | 是 | 否 | 是 | 不涉及 |
修改auto-increment值 | 是 | 否 | 是 | 不涉及 |
变更某列为NULL | 是 | 是 | 否 | 支持 |
变更某列为非NULL | 是 | 是 | 否 | 支持 |
修改ENUM/SET列的定义 | 是 | 否 | 是3 | 不涉及 |
开启秒级加字段功能需要将参数
loose_innodb_support_instant_add_column
的值设置为ON,且仅支持将列添加至表的末尾。当表未指定主键时,需要将参数implicit_primary_key
的值设置为OFF,以避免在执行秒级加字段操作时因表的最末尾的隐式主键列导致加列操作失败。除此之外,不支持在压缩表(ROW_FORMAT=COMPRESSED)、带有全文索引的表以及临时表上执行秒级加字段操作。如果集群不支持使用秒级加字段功能,增加字段将使用INPLACE方式执行DDL。此时需要进行全表重建,重建期间允许并发读写操作。您也可以通过并行DDL功能进行加速。扩展VARCHAR长度时,存储VARCHAR列长度所需的字节数需要保持一致,才能支持快速列扩展。具体来说,对于0~255个字节的VARCHAR列,只需要一个Byte存储长度。而对于大于等于256字节的VARCHAR列,就需要两个Bytes存储长度。只有控制VARCHAR列长度的扩展范围,比如从0~255字节或从256字节扩展到更大的范围,才能保证在执行ALTER TABLE时只修改元数据。即当修改VARCHAR列的长度从小于256字节扩展到大于256字节的长度时,PolarDB默认使用Copy DDL,即全程锁表,不支持DML写操作,仅支持读操作。
当您不确定自己修改VARCHAR列的范围是否满足上述条件时,可以使用
ALGORITHM=INPLACE
指定采用INPLACE算法执行当前DDL操作。此时,如果不支持快速列扩展,则会直接报错。示例如下:ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
VARCHAR类型属于变长存储类型,磁盘仅存储实际长度,因此建议您在使用VARCHAR类型的字段时,考虑将最大长度直接调整到256个字节以上,以避免在扩展字段时可能需要使用COPY算法。
仅当数据类型的存储大小不发生改变,且向ENUM或SET的末尾追加元素时,才可以仅修改元数据,不重建整张表。否则需要使用COPY算法进行表重建。
PolarDB MySQL版5.6版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加列 | 是 | 否1 | 是1 | 不支持 |
删除列 | 是 | 是 | 否 | 不支持 |
重命名列 | 是 | 否 | 是 | 不涉及 |
重排序列 | 是 | 是 | 否 | 不支持 |
设置列的默认值 | 是 | 否 | 是 | 不涉及 |
修改列注释 | 是 | 否 | 是 | 不涉及 |
修改列类型 | 否 | 是 | 否 | 不支持 |
扩展VARCHAR长度 | 否 | 是 | 否 | 不支持 |
将UTF8mb3字符集修改为UTF8mb4字符集 | 否 | 是 | 否 | 不支持 |
删除列默认值 | 是 | 否 | 是 | 不涉及 |
修改auto-increment值 | 是 | 否 | 是 | 不涉及 |
变更某列为NULL | 是 | 是 | 否 | 不支持 |
变更某列为非NULL | 是 | 是 | 否 | 不支持 |
修改ENUM/SET列的定义 | 是 | 否 | 是2 | 不涉及 |
开启秒级加字段功能需要将参数
loose_innodb_support_instant_add_column
的值设置为ON,且仅支持将列添加至表的末尾。当表未指定主键时,需要将参数implicit_primary_key
的值设置为OFF,以避免在执行秒级加字段操作时因表的最末尾的隐式主键列导致加列操作失败。除此之外,不支持在压缩表(ROW_FORMAT=COMPRESSED)、带有全文索引的表、临时表以及分区表上执行秒级加字段操作。如果集群不支持使用秒级加字段功能,增加字段将使用INPLACE方式执行DDL。此时需要进行全表重建,重建期间允许并发读写操作。说明PolarDB MySQL版5.6版本的秒级加列功能目前处于灰度阶段,如需使用,请前往配额中心,根据配额ID
polardb_mysql_iac_56
找到配额名称,在对应的操作列单击申请来开通该功能。仅当数据类型的存储大小不发生改变,且向ENUM或SET的末尾追加元素时,才可以仅修改元数据,不重建整张表。否则需要使用COPY算法进行表重建。
Table操作
PolarDB MySQL版8.0.2版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
修改ROW_FORMAT | 是 | 是 | 否 | 支持 |
修改KEY_BLOCK_SIZE | 是 | 是 | 否 | 支持 |
设置持久化统计信息 | 是 | 否 | 是 | 不涉及 |
声明character set | 是 | 否 | 是 | 不涉及 |
转换character set | 否 | 是 | 否 | 不支持 |
Optimize表 | 是 | 是 说明 通过 | 否 | 支持 |
重建表 | 是 | 是 | 否 | 支持 |
重命名表 | 是 | 否 | 是 | 不涉及 |
修改表注释 | 是 | 否 | 是 | 不涉及 |
PolarDB MySQL版8.0.1版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
修改ROW_FORMAT | 是 | 是 | 否 | 支持 |
修改KEY_BLOCK_SIZE | 是 | 是 | 否 | 支持 |
设置持久化统计信息 | 是 | 否 | 是 | 不涉及 |
声明character set | 是 | 否 | 是 | 不涉及 |
转换character set | 否 | 是 | 否 | 不支持 |
Optimize表 | 是 | 是 说明 通过 | 否 | 支持 |
重建表 | 是 | 是 | 否 | 支持 |
重命名表 | 是 | 否 | 是 | 不涉及 |
修改表注释 | 是 | 否 | 是 | 不涉及 |
PolarDB MySQL版5.7版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
修改ROW_FORMAT | 是 | 是 | 否 | 支持 |
修改KEY_BLOCK_SIZE | 是 | 是 | 否 | 支持 |
设置持久化统计信息 | 是 | 否 | 是 | 不涉及 |
声明character set | 是 | 否 | 是 | 不涉及 |
转换character set | 否 | 是 | 否 | 不支持 |
Optimize表 | 是 | 是 说明 通过 | 否 | 支持 |
重建表 | 是 | 是 | 否 | 支持 |
重命名表 | 是 | 否 | 是 | 不涉及 |
修改表注释 | 是 | 否 | 是 | 不涉及 |
PolarDB MySQL版5.6版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
修改ROW_FORMAT | 是 | 是 | 否 | 不支持 |
修改KEY_BLOCK_SIZE | 是 | 是 | 否 | 不支持 |
设置持久化统计信息 | 是 | 否 | 是 | 不涉及 |
声明character set | 是 | 否 | 是 | 不涉及 |
转换character set | 否 | 是 | 否 | 不支持 |
Optimize表 | 是 | 是 说明 通过 | 否 | 不支持 |
重建表 | 是 | 是 | 否 | 不支持 |
重命名表 | 是 | 否 | 是 | 不涉及 |
修改表注释 | 是 | 否 | 是 | 不涉及 |
Generated Column操作
PolarDB MySQL版8.0.2版本
操作 | 允许并发DML | 重建表 | 仅修改元信息 | 支持并行DDL |
增加STORED Column | 否 说明 由于增加Stored Column表达式涉及SQL/Server层,因此不支持在增加Stored Column时使用Online DDL。 | 是 | 否 | 不支持 |
修改STORED Column顺序 | 否 | 是 | 否 | 不支持 |
删除STORED Column | 是 | 是 | 否 | 支持 |
增加VIRTUAL Column | 是 | 否 | 是 | 不涉及 |
修改VIRTUAL Column顺序 | 否 | 是 | 否 | 不支持 |
删除VIRTUAL Column | 是 | 否 | 是 | 不涉及 |
PolarDB MySQL版8.0.1版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加STORED Column | 否 说明 由于增加Stored Column表达式涉及SQL/Server层,因此不支持在增加Stored Column时使用Online DDL。 | 是 | 否 | 不支持 |
修改STORED Column顺序 | 否 | 是 | 否 | 不支持 |
删除STORED Column | 是 | 是 | 否 | 支持 |
增加VIRTUAL Column | 是 | 否 | 是 | 不涉及 |
修改VIRTUAL Column顺序 | 否 | 是 | 否 | 不支持 |
删除VIRTUAL Column | 是 | 否 | 是 | 不涉及 |
PolarDB MySQL版5.7版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加STORED Column | 否 说明 由于增加Stored Column表达式涉及SQL/Server层,因此不支持在增加Stored Column时使用Online DDL。 | 是 | 否 | 不支持 |
修改STORED Column顺序 | 否 | 是 | 否 | 不支持 |
删除STORED Column | 是 | 是 | 否 | 支持 |
增加VIRTUAL Column | 是 | 否 | 是 | 不涉及 |
修改VIRTUAL Column顺序 | 否 | 是 | 否 | 不支持 |
删除VIRTUAL Column | 是 | 否 | 是 | 不涉及 |
PolarDB MySQL版5.6版本
PolarDB MySQL版5.6版本不支持Generated Column特性。
Foreign Key操作
PolarDB MySQL版8.0.2版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加Foreign Key | 是1 | 否1 | 是1 | 不涉及 |
删除Foreign Key | 是1 | 否1 | 是1 | 不涉及 |
PolarDB MySQL版8.0.1版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加Foreign Key | 是1 | 否1 | 是1 | 不涉及 |
删除Foreign Key | 是1 | 否1 | 是1 | 不涉及 |
PolarDB MySQL版5.7版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加Foreign Key | 是1 | 否1 | 是1 | 不涉及 |
删除Foreign Key | 是1 | 否1 | 是1 | 不涉及 |
PolarDB MySQL版5.6版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加Foreign Key | 是1 | 否1 | 是1 | 不涉及 |
删除Foreign Key | 是1 | 否1 | 是1 | 不涉及 |
只有在关闭了foreign_key_checks开关,并且只修改元数据的情况下,才支持使用INPLACE DDL。否则只支持使用COPY DDL,且需要全程锁表。
分区表操作
PolarDB MySQL版8.0.2版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加分区(ADD) | 是1 | 否2 | 是 | 不支持 |
删除分区(DROP) | 是1 | 否2 | 否 | 不支持 |
删除分区表空间(DISCARD) | 否 | 否 | 否 | 不支持 |
导入分区表空间(IMPORT) | 否 | 否 | 否 | 不支持 |
截断分区(TRUNCATE) | 是 | 否 | 否 | 不支持 |
合并分区(COALESCE) | 否 | 是3 | 否 | 不支持 |
重分布分区(REORGANIZE) | 是1 | 否7 | 否 | 不支持 |
交换分区(EXCHANGE) | 是1 | 否 | 是 | 不支持 |
分析分区(ANALYZE) | 是 | 否 | 否8 | 不支持 |
检查分区(CHECK) | 是 | 否 | 否9 | 不支持 |
优化分区(OPTIMIZE) | 是4 | 是4 | 否 | 支持4 |
重建分区(REBUILD) | 是1 | 否7 | 否 | 不支持 |
修复分区(REPAIR) | 是 | 否10 | 否 | 不支持 |
表转分区 | 否 | 是 | 是5 | 不支持 |
分区转表 | 否 | 是 | 否 | 不支持 |
创建PARTIAL INDEX | 是 | 否6 | 否 | 支持 |
引入分区级元数据锁MDL,将参数
loose_partition_level_mdl_enabled
的值设为true后,执行DDL操作时不影响不涉及的分区上的DML,详细信息请查看在线分区维护。RANGE和LIST分区增加或删除分区时不需要重建表。HASH和KEY分区增加分区时需要重建表,HASH和KEY分区不支持删除分区操作。
仅支持HASH和KEY分区。
对InnoDB引擎中的表执行OPTIMIZE PARTITION操作时,会重建整张分区表。重建期间支持对目标表的读写操作。此时,您可以将参数
innodb_parallel_build_primary_index
的值设置为ON,使用并行DDL功能加快重建速度。秒级转换仅支持将普通表快速转换为RANGE分区表。
PolarDB MySQL版支持创建和删除分区粒度的索引,详情请参见部分索引(Partial Index)。
重分布分区或重建分区只重建指定需要做数据重分布和重建的分区,其他分区不受影响。
分析分区只修改统计信息,不修改表的元数据和数据。
检查分区不修改元数据和数据。
修复分区只重建指定需要修复的分区。
PolarDB MySQL版8.0.1版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加分区(ADD) | 否 | 否1 | 是 | 不支持 |
删除分区(DROP) | 否 | 否2 | 否 | 不支持 |
删除分区表空间(DISCARD) | 否 | 否 | 否 | 不支持 |
导入分区表空间(IMPORT) | 否 | 否 | 否 | 不支持 |
截断分区(TRUNCATE) | 是 | 否 | 否 | 不支持 |
合并分区(COALESCE) | 否 | 是 | 否 | 不支持 |
重分布分区(REORGNIZATE) | 否 | 否4 | 否 | 不支持 |
交换分区(EXCHANGE) | 是 | 是 | 是 | 不支持 |
分析分区(ANALYZE) | 是 | 是 | 否5 | 不支持 |
检查分区(CHECK) | 是 | 否 | 否6 | 不支持 |
优化分区(OPTIMIZE) | 是3 | 是3 | 否 | 支持3 |
重建分区(REBUILD) | 否 | 否4 | 否 | 不支持 |
修复分区(REPAIR) | 是 | 否4 | 否 | 不支持 |
表转分区 | 否 | 是 | 否 | 不支持 |
分区转表 | 否 | 是 | 否 | 不支持 |
RANGE和LIST分区增加分区时不需要重建表。HASH和KEY分区增加分区时需要重建表。
HASH和KEY分区不支持删除分区操作。
对InnoDB引擎中的表执行OPTIMIZE PARTITION操作时,会重建整张分区表。重建期间支持对目标表的读写操作。此时,您可以将参数
innodb_parallel_build_primary_index
的值设置为ON,使用并行DDL功能加快重建速度。重分布、重建和修复分区只重建指定需要重分布、重建和修复的分区, 不涉及其他分区。
分析分区只修改统计信息,不修改表的元数据和数据。
检查分区不修改元数据和数据。
PolarDB MySQL版5.7版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加分区(ADD) | 否 | 否1 | 是 | 不支持 |
删除分区(DROP) | 否 | 否1 | 否 | 不支持 |
删除分区表空间(DISCARD) | 否 | 否 | 否 | 不支持 |
导入分区表空间(IMPORT) | 否 | 否 | 否 | 不支持 |
截断分区(TRUNCATE) | 是 | 否 | 否 | 不支持 |
合并分区(COALESCE) | 否 | 是 | 否 | 不支持 |
重分布分区(REORGNIZATE) | 否 | 否2 | 否 | 不支持 |
交换分区(EXCHANGE) | 是 | 否 | 是 | 不支持 |
分析分区(ANALYZE) | 是 | 否 | 否3 | 不支持 |
检查分区(CHECK) | 是 | 否 | 否4 | 不支持 |
优化分区(OPTIMIZE) | 否 | 是 | 否 | 不支持 |
重建分区(REBUILD) | 否 | 否2 | 否 | 不支持 |
修复分区(REPAIR) | 是 | 否2 | 否 | 不支持 |
表转分区 | 否 | 是 | 否 | 不支持 |
分区转表 | 否 | 是 | 否 | 不支持 |
RANGE和LIST分区增加或删除分区时不需要重建表。HASH和KEY分区增加分区时需要重建表,HASH和KEY分区不支持删除分区操作。
重分布、重建和修复分区只重建指定需要重分布、重建和修复的分区, 不涉及其他分区。
分析分区只修改统计信息,不修改表的元数据和数据。
检查分区不修改元数据和数据。
PolarDB MySQL版5.6版本
操作 | 允许并发DML | 重建表 | 仅修改元数据 | 支持并行DDL |
增加分区(ADD) | 否 | 否1 | 是 | 不支持 |
删除分区(DROP) | 否 | 否1 | 否 | 不支持 |
删除分区表空间(DISCARD) | 否 | 否 | 否 | 不支持 |
导入分区表空间(IMPORT) | 否 | 否 | 否 | 不支持 |
截断分区(TRUNCATE) | 是 | 否 | 否 | 不支持 |
合并分区(COALESCE) | 否 | 是 | 否 | 不支持 |
重分布分区(REORGNIZATE) | 否 | 否2 | 否 | 不支持 |
交换分区(EXCHANGE) | 是 | 否 | 是 | 不支持 |
分析分区(ANALYZE) | 是 | 否 | 否3 | 不支持 |
检查分区(CHECK) | 是 | 否 | 否4 | 不支持 |
优化分区(OPTIMIZE) | 否 | 是 | 否 | 不支持 |
重建分区(REBUILD) | 否 | 否2 | 否 | 不支持 |
修复分区(REPAIR) | 是 | 否2 | 否 | 不支持 |
表转分区 | 否 | 是 | 否 | 不支持 |
分区转表 | 否 | 是 | 否 | 不支持 |
RANGE和LIST分区增加或删除分区时不需要重建表。HASH和KEY分区增加分区时需要重建表,HASH和KEY分区不支持删除分区操作。
重分布、重建和修复分区只重建指定需要重分布、重建和修复的分区, 不涉及其他分区。
分析分区只修改统计信息,不修改表的元数据和数据。
检查分区不修改元数据和数据。
DDL执行方式
当PolarDB MySQL版采用INPLACE或INSTANT算法执行DDL操作时,建议优先使用内核方式(Online DDL)执行。该方式执行速度快,稳定性高。
当PolarDB MySQL版采用COPY算法执行DDL操作时,DDL需要全程锁表,在执行期间无法对目标表进行读写操作。此时可以考虑使用DMS无锁变更或gh-ost等第三方工具执行DDL。此类第三方工具可以在DDL执行期间允许读写操作,但通常情况下此类工具的执行速度较慢,在大表或高并发场景下,若增量数据过多,容易执行失败。
使用内核方式和第三方工具执行DDL操作的差异请参见下表:
执行方式 | 允许并发读写 | 执行速率 | 是否需要开启Binlog | 并行加速 |
内核(Online DDL) | 是 | 快 | 否 | 支持 |
第三方工具(DMS无锁变更、gh-ost等) | 是 | 慢 | 是 | 不支持 |
联系我们
若您对DDL操作有任何疑问,可通过钉钉搜索群号入群咨询。您可以直接@群内专家,并附上您要咨询的问题;同时群内也有PolarDB MySQL版小助手24*7小时在线回答您的问题。钉钉群号:1537504****。