本文说明 TDSQL Boundless 对 Online DDL 的支持。TDSQL Boundless 已支持大部分的 Online DDL,包括部分只需要修改元数据的 Inplace DDL。
对 Online DDL 的支持
二级索引
操作项 | 语法支持 | 在线更改 | 不支持在线更改原因 | 仅修改元数据 | 对用户数据的操作 | 支持并发 DML |
Creating or adding a secondary index | Yes | Yes | / | No | 需要数据回填 | Yes |
Dropping an index | Yes | Yes | / | No | 需要异步删除数据 | Yes |
Renaming an index | Yes | Yes | / | No | / | Yes |
Adding a FULLTEXT index | No | No | 暂不支持全文索引 | / | / | / |
Adding a SPATIAL index | No | No | 暂不支持空间索引 | / | / | / |
Changing the index type | No | No | 引擎只支持普通索引,不支持 B-tree/Hash 等 | / | / | / |
主键
操作项 | 语法支持 | 在线更改 | 不支持在线更改原因 | 仅修改元数据 | 对用户数据的操作 | 支持并发 DML |
Adding a primary key | Yes | Yes | / | No | 需要 Online Copy | Yes |
Dropping a primary key | Yes | No | 需要重新组织数据 | No | 需要锁表 COPY | No |
Dropping a primary key and adding another | Yes | Yes | / | No | 需要锁表 COPY | Yes |
列
操作项 | 语法支持 | 在线更改 | 不支持在线更改原因 | 仅修改元数据 | 对用户数据的操作 | 支持并发 DML |
Adding a column (尾部追加) | Yes | Yes | / | Yes | / | Yes |
Adding a column (非尾部追加) | Yes | Yes | / | No | 需要 Online Copy | Yes |
Dropping a column | Yes | Yes | / | No | 需要 Online Copy | Yes |
Renaming a column | Yes | Yes | / | Yes | / | Yes |
Reordering columns | Yes | Yes | / | No | 需要 Online Copy | Yes |
Setting a column default value | Yes | Yes | / | Yes | / | Yes |
Changing the column data type | Yes | Yes | / | No | 需要 Online Copy | Yes |
Extending VARCHAR column size (column is not part of primary key) | Yes | Yes | / | Yes | ||
Extending VARCHAR column size (column is part of primary key) | Yes | Yes | / | No | 需要 Online Copy | Yes |
Dropping the column default value | Yes | Yes | / | Yes | / | Yes |
Changing the auto-increment value | Yes | Yes | / | Yes | / | Yes |
Making a column NULL | Yes | Yes | / | No | 需要 Online Copy | Yes |
Making a column NOT NULL | Yes | Yes | / | No | 需要 Online Copy | Yes |
Modifying the definition of an ENUM or SET column | Yes | Yes | / | Yes | / | Yes |
表
操作项 | 语法支持 | 在线更改 | 不支持在线更改原因 | 仅修改元数据 | 对用户数据的操作 | 支持并发 DML |
Changing the ROW_FORMAT | No | No | 引擎不支持 | / | / | / |
Changing the KEY_BLOCK_SIZE | No | No | 引擎不支持 | / | / | / |
Setting persistent table statistics | No | No | 引擎不支持 | / | / | / |
Specifying a character set | Yes | Yes | / | No | 需要 Online Copy | Yes |
Converting a character set | Yes | Yes | / | No | 需要 Online Copy | Yes |
Optimizing a table | Yes | / | 使用该语法时直接返回成功,实际未做任何操作,因为引擎会执行自动 compaction,该语法的行为并不适用。 | / | / | / |
Rebuilding with the FORCE option | Yes | Yes | / | No | 需要 Online Copy | Yes |
Performing a null rebuild | No | No | 引擎不支持 | / | / | / |
Renaming a table | Yes | Yes | / | Yes | / | Yes |
分区
操作项 | 语法支持 | 在线更改 | 不支持在线更改原因 | 仅修改元数据 | 对用户数据的操作 | 支持并发 DML |
PARTITION BY | Yes | Yes | / | No | 需要 Online Copy | Yes |
ADD PARTITION (添加 Range/List 分区) | Yes | Yes | / | Yes | / | Yes |
ADD PARTITION (添加 Hash/Key 分区) | Yes | Yes | / | NO | 需要 Online Copy | Yes |
DROP PARTITION | Yes | Yes | / | Yes | / | Yes |
DISCARD PARTITION | No | No | 引擎不支持 | / | / | / |
IMPORT PARTITION | No | No | 引擎不支持 | / | / | / |
TRUNCATE PARTITION | Yes | Yes | / | / | 需要异步删除数据 | Yes |
COALESCE PARTITION | Yes | Yes | / | No | 需要 Online Copy | Yes |
REORGANIZE PARTITION | Yes | Yes | / | No | 需要 Online Copy | Yes |
EXCHANGE PARTITION | No | No | 引擎不支持 | / | / | / |
ANALYZE PARTITION | No | No | 引擎不支持 | / | / | / |
CHECK PARTITION | No | No | 引擎不支持 | / | / | / |
OPTIMIZE PARTITION | Yes | / | 使用该语法时直接返回成功,实际未做任何操作,因为 引擎会执行自动 compaction,该语法的行为并不适用。 | / | / | / |
REBUILD PARTITION | Yes | Yes | / | No | 需要 Online Copy | Yes |
REPAIR PARTITION | Yes | No | 未算作 DDL | / | / | / |
REMOVE PARTITIONING | Yes | Yes | / | No | 需要 Online Copy | Yes |
说明:
表空间
目前暂不支持表空间(Tablespace)相关操作。
生成列
生成列即虚拟列(Generated Column),从21.6.4.0版本及以上开始支持 VIRTUAL 与 STORED 生成列的 Online DDL 操作:
VIRTUAL 生成列支持 Instant ADD/DROP:无需重建数据,仅涉及元数据修改。
ADD/DROP STORED 生成列、修改生成列表达式、加宽基础列类型等需重写数据的操作,基于 Online Copy DDL 在线执行,支持并发 DML。
仅修改生成列属性(如 COMMENT)、不改动表达式与类型时,MODIFY 支持 INPLACE,只涉及元数据修改。
不支持的操作:VIRTUAL 与 STORED 互转;RENAME/DROP 被生成列引用的基础列。
操作项 | 语法支持 | 在线更改 | 不支持在线更改原因 | 仅修改元数据 | 对用户数据的操作 | 支持并发 DML |
Adding VIRTUAL generated column | Yes | Yes | / | Yes | / | Yes |
Adding STORED generated column | Yes | Yes | / | No | 需要 Online Copy | Yes |
Dropping VIRTUAL generated column | Yes | Yes | / | Yes | / | Yes |
Dropping STORED generated column | Yes | Yes | / | No | 需要 Online Copy | Yes |
Modifying generated column expression(VIRTUAL/STORED) | Yes | Yes | / | No | 需要 Online Copy | Yes |
Modifying generated column(仅改属性,表达式/类型不变) | Yes | Yes | / | Yes | / | Yes |
Renaming generated column(表达式不变) | Yes | Yes | / | Yes | / | Yes |
Renaming generated column(改名 + 改表达式) | No | No | 引擎不支持 | / | / | / |
Changing storage type(VIRTUAL ↔ STORED) | No | No | 引擎不支持 | / | / | / |
Renaming base column referenced by generated column | No | No | 引擎不支持 | / | / | / |
Dropping base column referenced by generated column | No | No | 引擎不支持 | / | / | / |
Widening base column type(INT→BIGINT、VARCHAR 加长、改字符集) | Yes | Yes | / | No | 需要 Online Copy | Yes |
外键
目前暂不支持外键(Foreign keys)相关操作。
TTL
操作项 | 语法支持 | 在线更改 | 不支持在线更改原因 | 仅修改元数据 | 对用户数据的操作 | 支持并发 DML |
Adding TTL | Yes | Yes | / | Yes | / | Yes |
Modifying TTL | Yes | Yes | / | Yes | / | Yes |
Removing TTL (REMOVE TTL) | Yes | Yes | / | Yes | / | Yes |
TTL_ENABLE | Yes | Yes | / | Yes | / | Yes |
TTL_JOB_INTERVAL | Yes | Yes | / | Yes | / | Yes |
TTL_ARCHIVE_TABLE | Yes | Yes | / | Yes | / | Yes |
TTL_ARCHIVE_ON_CONFLICT | Yes | Yes | / | Yes | / | Yes |
与社区版 MySQL 支持情况对比
将 TDSQL Boundless 的 Inplace 和 Online Copy 以及 社区版 MySQL 8.0 的 Instant 和 Inplace 均视为 Online 操作,两者对于常用 DDL 的差异对比说明如下。
操作项 | TDSQL Boundless | MySQL |
Converting a character set | 支持 DML 并发 | 不支持 DML 并发 |
Changing the column data type | 支持 DML 并发 | 不支持 DML 并发 |
PARTITION BY | 支持 DML 并发 | 不支持 DML 并发 |
Extending VARCHAR column size | 支持 DML 并发 | 部分情况下支持,对 VARCHAR(X) 中的 X 有限制 |
Adding a primary key | 支持 DML 并发 | 支持 DML 并发 |
说明:
TDSQL Boundless 目前尚有少量 DDL 没有支持,因此此处只说明了对比 TDSQL Boundless 和社区版 MySQL 8.0均支持的部分的差异;
对于 Extending VARCHAR column size 类型,社区版 MySQL 8.0会对 VARCHAR(X) 指定的字符长度做出限制,主要涉及存储的 packed length。假设以 UTF8MB4 作为字符集,某字段所占的字节数为 X * 4。
进行 DDL 时,假设当前 VARCHAR 字段 X * 4 < 256,且修改后的字段 Y * 4 < 256;则支持 Inplace;
进行 DDL 时,假设当前 VARCHAR 字段 X * 4 < 256,但修改后的字段 Y * 4 >= 256;则不支持 Inplace;
示例:
CREATE TABLE t1(a INT PRIMARY KEY, b VARCHAR(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;ALTER TABLE t1 CHANGE COLUMN b b VARCHAR(20), ALGORITHM=INPLACE, LOCK=NONE; -- 成功ALTER TABLE t1 CHANGE COLUMN b b VARCHAR(64), ALGORITHM=INPLACE, LOCK=NONE; -- 失败
无主键表 Online DDL 支持
从21.6.3.0版本起,支持对无主键表执行 Online Copy DDL 操作。此前无主键表只能走 Offline DDL,无法并发读写。当前实现通过表内部的隐藏主键完成增量数据同步,使得无主键表可以享受与有主键表相同的 Online Copy DDL 能力。目前支持大部分标记为"需要 Online Copy"的 DDL 操作,包括但不限于:
修改列类型(如 int 列转换为 bigint 列)
添加/删除列(非尾部追加的添加列)
列重排序
修改字符集
添加主键(ADD PRIMARY KEY)
注意:
无主键分区表执行 Online DDL 时不可修改分区规则、也不可与非分区表互相转换。
限制项 | 说明 |
分区表的分区规则不可变 | 无主键分区表执行 Online Copy DDL 时,不能修改分区规则(不能修改分区数目、分区算法等) |
分区表和非分区表之间不可互相转换 | 无主键分区表和无主键非分区表之间暂不支持通过 Online DDL 互相转换 |
注意事项
当前 TDSQL Boundless 支持抢占式 DDL 模式和无阻塞 DDL 模式,通过参数
tdsql_ddl_block_mode 来控制,详细请参见 tdsql_ddl_block_mode。