本文说明 TDSQL Boundless 对 OnlineDDL 的支持。TDSQL Boundless 已支持大部分的 OnlineDDL,包括部分只需要修改元数据的 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 | 引擎只支持普通索引,不支持 Btree/Hash 等 | / | / | / |
主键
涉及主键修改的 DDL 都不支持 Online 方式。
操作项 | 语法支持 | 在线更改 | 不支持在线更改原因 | 仅修改元数据 | 对用户数据的操作 | 支持并发 DML |
Adding a primary key | Yes | No | 需要重新组织数据 | No | 需要锁表 COPY | No |
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 | Yes | Yes | / | Yes | / | 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)相关操作。
外键
目前暂不支持外键(Foreign keys)相关操作。
与社区版 MySQL 支持情况对比
将 TDSQL Boundless 的 Inplace 和 Online Copy 以及 社区版 MySQL8.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 类型,社区版 MySQL8.0会对 VARCHAR(X) 指定的字符长度做出限制,主要涉及存储的 pack length。假设以UTF8MB4作为字符集,某字段所占的字节数为 X*4。
进行 DDL 时,假设当前 VARCHAR 字段 X*4<256,且修改后的字段 Y*4<256;则支持 Inplace;
进行 DDL 时,假设当前 VARCHAR 字段 X*4<256,但修改后的字段 Y*4>=256;则不支持 Inplace;
示例:
CREATETABLEt1(aINTPRIMARYKEY,bVARCHAR(10))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci;ALTERTABLEt1 CHANGECOLUMNb bVARCHAR(20),ALGORITHM=INPLACE,LOCK=NONE;→ 成功ALTERTABLEt1 CHANGECOLUMNb bVARCHAR(64),ALGORITHM=INPLACE,LOCK=NONE;→ 失败