---
title: "增量 DDL 支持的范围和限制 | OceanBase 文档中心"
description: 增量 DDL 支持的范围和限制 本文为您介绍不同类型的迁移项目增量 DDL 支持的范围及其使用限制。 MySQL 到 OB_MySQL 迁移项目增量 DDL 支持的范围和限制 支持范围总览 支持的范围总览 创建表 CREATE TABLE 修改表 ALTER TABLE 清空表 TRUNCATE TABLE 表重命名…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*L03BS6f-o40AAAAAAAAAAAAADiGDAQ/original) 迁移服务 OMSV 3.3.1 企业版

# 增量 DDL 支持的范围和限制

更新时间：2023-06-08 10:50:48

本文为您介绍不同类型的迁移项目增量 DDL 支持的范围及其使用限制。

## MySQL 到 OB_MySQL 迁移项目增量 DDL 支持的范围和限制

### 支持范围总览

- 支持的范围总览

     - 创建表 `CREATE TABLE`
     - 修改表 `ALTER TABLE`
     - 清空表 `TRUNCATE TABLE`
     - 表重命名 `RENAME TABLE`
     - 删除表 `DROP TABLE`
     - 创建索引 `CREATE INDEX`
     - 删除索引 `DROP INDEX`
 - 不支持的范围总览

     - CREATE / DROP / ALTER DATABASE
     - CREATE / DROP / ALTER FUNCTION
     - CREATE / DROP / ALTER PROCEDURE
     - CREATE / DROP / ALTER EVENT
     - CREATE_/ DROP / ALTER VIEW
     - CREATE / DROP / ALTER ROLE
     - CREATE_/ DROP / ALTER TRIGGER
     - CREATE / DROP / ALTER USER
     - CREATE / DROP / ALTER SERVER
     - CREATE / DROP / ALTER TABLESPACE

### 创建表 `CREATE TABLE`

- 创建表时，支持 `IF NOT EXISTS` 关键字和 `LIKE` 选项。示例如下：

  ```sql
  CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
  { LIKE old_tbl_name | (LIKE old_tbl_name) }

  ```
 - 创建表时，不支持创建临时表（`TEMPORARY` 关键字会被忽略）。

  > **说明:**
  >
  >  
  >
  > OceanBase 数据库 MySQL 租户 3.2.3 版本支持创建临时表。
 - 创建表时，不支持创建基于查询的表：`create table as select`，会输出空字符串。

创建表的语法总览如下：

```sql
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]

```

| 分类 | 描述 |
| --- | --- |
| create_definition | `create_definition` 支持创建列、创建索引或约束，详情请参见表格后《创建列》和《创建索引或约束》的内容。 |
| table_options | - 支持指定表级别 COMMENT - 支持指定 `CHARACTER SET` - 其它 table option 均不支持解析，会被忽略。 |
| partition_options | - 支持一级分区：List、Range、Hash 和 Key      List 分区支持指定函数分区键 \| 列分区键      Range 分区支持指定函数分区键 \| 列分区键      Hash 分区支持指定函数分区键 \| 列分区键，支持 LINEAR Hash 定义       Key 分区支持指定列分区键、LINEAR Key 定义 - 支持指定二级分区：Hash 和 Key - 支持指定 PARTITIONS number 和 SUBPARTITIONS number |

> **注意：**
>
>  
>
> OceanBase 数据库 MySQL 租户支持的字符集有限，详情请参见 [字符集](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000357411)。
>
>  
>
> 请勿使用 latin1 等不支持的字符集。如果强行指定 OceanBase 数据库 MySQL 租户不支持的字符集，DDL 同步时不会将该字符集进行转换，导致执行至目标数据库时报错。

`create_definition` 支持创建列、创建索引或约束：

- 创建列

  创建列时，支持的范围如下：

     - 支持指定 NULL / NOT NULL 属性
     - 支持指定 DEFAULT 值，支持 DEFAULT 值为常量/函数
     - 支持指定 VISIBLE / INVISIBLE 属性
     - 支持指定 AUTO_INCREMENT
     - 支持指定 COMMENT
     - 支持指定 COLLATE
     - 支持指定生成列，支持生成列指定 VIRTUAL | STORED 属性
     - 支持指定 UNIQUE KEY / PRIMARY KEY / KEY，详情请参见下文的《创建索引或约束》
     - 支持指定 check 约束（仅 OceanBase 数据库 MySQL 3.2.3 及以上版本支持），详情请参见下文的《创建索引或约束》
     - 支持指定外键，详情请参见下文的《创建索引或约束》
     - 数据类型的支持详情如下：

      | **分类** | **MySQL 数据库** | **OceanBase 数据库 MySQL 租户** |
      | 数据类型 | 整型 | INT | INT |
      | TINYINT | TINYINT |
      | SMALLINT | SMALLINT |
      | MEDIUMINT | MEDIUMINT |
      | BIGINT | BIGINT |
      | BOOL / BOOLEAN | BOOLEAN |
      | 定点类型 | DECIMAL | DECIMAL |
      | NUMERIC | NUMERIC |
      | 浮点类型 | REAL | FLOAT |
      | DOUBLE | DOUBLE |
      | FLOAT | FLOAT |
      | BIT 类型 | BIT | BIT |
      | 字符类型 | CHAR | CHAR |
      | NCHAR | CHAR |
      | VARCHAR | VARCHAR |
      | BINARY | BINARY |
      | VARBINARY | VARBINARY |
      | LONG VARBINARY | BLOB |
      | 时间类型 | YEAR | YEAR |
      | DATE | DATE |
      | TIME | TIME |
      | TIMESTAMP | TIMESTAMP |
      | DATETIME | DATETIME |
      | 大对象和文本类型 | TINYBLOB | TINYBLOB |
      | MEDIUMBLOB | MEDIUMBLOB |
      | BLOB | BLOB |
      | LONGBLOB | LONGBLOB |
      | TINYTEXT | TINYTEXT |
      | MEDIUMTEXT | MEDIUMTEXT |
      | TEXT | TEXT |
      | LONGTEXT | LONGTEXT |
      | 枚举和集合类型 | ENUM | ENUM |
      | SET | SET |
      | JSON 类型 | JSON | 依赖于 OceanBase 数据库 MySQL 的版本：3.2.3 以下版本会转换为 TEXT，3.2.3 及以上版本会转换为 JSON。 |

      不支持转换的数据类型包括 SERIAL 和 GEOMETRY（例如，GEOMETRY、GEOMETRYCOLLECTION、POINT、MULTIPOINT、LINESTRING、MULTILINESTRING、POLYGON、MULTIPOLYGON）。

      > 注意：
      >
      >  
      >
      > 如果出现不支持转换的数据类型，会导致输出空的 DDL 语句。

  如果增量 DDL 中包含以下属性的定义，则这些属性将不会被解析和转换，最终会被忽略。

     - 指定 COLUMN_FORMAT 属性
     - 指定 ENGINE_ATTRIBUTE 属性
     - 指定 SECONDARY_ENGINE_ATTRIBUTE 属性
     - 指定 STORAGE 属性

  由于 OceanBase 数据库 MySQL 租户本身的限制，如果存在以下场景，增量 DDL 被成功转换后，执行到 OceanBase 数据库 MySQL 租户可能会报错。

     - OceanBase 数据库 MySQL 租户不支持在 DEFAULT 中指定某些函数/表达式。
     - OceanBase 数据库 MySQL 租户不支持在生成列中指定某些函数/表达式。
     - OceanBase 数据库 MySQL 租户不支持某些字段类型被指定 UNIQUE KEY / PRIMARY KEY / KEY。
     - OceanBase 数据库 MySQL 租户不支持某些 COLLATE，详情请参见 [字符序](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000357412)。
 - 创建索引或约束

  创建索引或约束时，支持的范围如下：

     - 支持创建 PRIMARY KEY
     - 支持创建 UNIQUE KEY
     - 支持创建 INDEX / KEY
     - 支持创建 FOREIGN KEY，支持 FOREIGN KEY 创建在字段/函数/表达式上

      支持指定 ON [DELETE | UPDATE] RESTRICT | CASCADE | NO ACTION | SET DEFAULT 属性
     - 支持创建 FULLTEXT INDEX
     - OceanBase 数据库 MySQL 租户 3.2.3 及以上版本，支持创建 CHECK 约束
     - 支持前缀索引
     - 支持指定 ASC / DESC

  创建索引或约束时，不支持的范围如下：

     - PRIMARY KEY、UNIQUE KEY、INDEX / KEY、FULLTEXT INDEX 不支持函数索引，仅支持索引建在字段上

      > **注意：**
      >
      >  
      >
      > 如果增量 DDL 包含以下不支持的定义，则整个建表语句会转换失败（输出空）。

      不支持 PRIMARY KEY、UNIQUE KEY、INDEX / KEY、FULLTEXT INDEX 定义中包含函数或表达式，示例如下：

      ```sql
      CREATE TABLE functional_index_t1 (col1 INT, PRIMARY KEY (col1, (ABS(col1))));
      CREATE TABLE functional_index_t1(x VARCHAR(30), INDEX idx ((CAST(x->>'$.name' AS CHAR(30)))));

      ```
     - 不支持创建 SPATIAL INDEX
     - 不支持 FOREIGN KEY 指定 ON [DELETE | UPDATE] SET NULL 属性

     - 指定 USING BTREE 或 USING HASH
     - index option 中指定 KEY_BLOCK_SIZE、index_type、WITH PARSER、COMMENT、VISIBLE | INVISIBLE、ENGINE_ATTRIBUTE、SECONDARY_ENGINE_ATTRIBUTE 属性
     - CHECK 约束中指定 [NOT] ENFORCED 属性
     - FOREIGN KEY 指定 MATCH FULL | MATCH PARTIAL | MATCH SIMPLE 属性

     - OceanBase 数据库 MySQL 租户不支持 PRIMARY KEY、UNIQUE KEY、INDEX / KEY、FULLTEXT INDEX、FOREIGN KEY 创建在某些类型的字段上。
     - OceanBase 数据库 MySQL 租户不支持 CHECK 约束中的某些函数/表达式。
     - OceanBase 数据库 MySQL 租户不支持 FOREIGN KEY 约束中的某些函数/表达式。
     - OceanBase 数据库 MySQL 租户不支持某些 COLLATE，详情请参见 [字符序](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000357412)。
 - 创建分区

  创建分区时，支持的范围如下：

     - 支持创建一级分区：RANGE 分区、LIST 分区、HASH 分区 和 KEY 分区。
     - 支持创建二级分区：HASH 分区 和 KEY 分区。
     - RANGE 分区、LIST 分区、HASH 分区支持函数分区键（分区键为表达式或函数）和列分区键（分区键是字段），KEY 分区仅支持列分区键。
     - 支持指定 PARTITIONS number 和 SUBPARTITIONS number。

  创建分区时，不支持创建 LINEAR HASH 和 LINEAR KEY 分区。

  > 注意：
  >
  >  
  >
  > 如果创建分区的 DDL 包含不支持的定义，则分区定义输出空，但是表结构会保留（分区定义被抛弃）。

     - 分区定义中指定 ENGINE
     - 分区定义中指定 COMMENT
     - 分区定义中指定 DATA DIRECTORY
     - 分区定义中指定 INDEX DIRECTORY
     - 分区定义中指定 MAX_ROWS
     - 分区定义中指定 MIN_ROWS
     - 分区定义中指定 TABLESPACE
     - 指定 KEY 分区中的 ALGORITHM 算法

      `PARTITION BY KEY ALGORITHM={1 | 2} (column_list) -> PARTITION BY KEY (column_list)`

     - OceanBase 数据库 MySQL 租户不支持某些字段类型作为分区键。
     - OceanBase 数据库 MySQL 租户不支持某些函数或表达式作为分区键。

### 修改表 `ALTER TABLE`

修改表时，包括操作列、操作约束和索引、操作分区，以及修改表的属性等操作。

- 操作列

  操作列包括添加字段、删除字段和修改字段等。

     - 支持 ADD COLUMN 来添加列（多列），支持指定 FIRST | AFTER 关键字。
     - 支持修改字段的默认值 `ALTER COLUMN SET DEFAULT`。
     - 支持删除字段的默认值 `ALTER COLUMN DROP DEFAULT`。
     - 支持修改列 `CHANGE COLUMN` 和 `MODIFY COLUMN`。
     - 支持删除列 `DROP COLUMN`。

  如果增量 DDL 包含以下不支持的定义，则整个建表语句会转换失败（输出空）。

     - 不支持修改列的可见性 `ALTER COLUMN SET VISIBLE | INVISIBLE`。
     - 不支持 `ORDER BY col_name`。
     - 不支持重命名列 `RENAME COLUMN`。

      ```sql
      ALTER TABLE t RENAME COLUMN d TO g;

      ```

  如果增量 DDL 中包含 `MODIFY COLUMN` 或 `CHANGE COLUMN`，会忽略 FIRST | AFTER 关键字。

     - 通过 `MODIFY COLUMN` 或 `CHANGE COLUMN` 修改字段类型可能会失败：OceanBase 数据库 MySQL 租户不支持修改为某些字段类型。
     - 通过 `MODIFY COLUMN` 或 `CHANGE COLUMN` 修改字段长度可能会失败。
     - 通过 `ALTER COLUMN SET DEFAULT` 设置默认值可能会失败：OceanBase 数据库 MySQL 租户不支持某些函数/表达式。
     - 不支持删除主键、唯一键、普通索引、相关的列，以及包含外键约束的列。
 - 操作约束和索引

  操作约束和索引包括添加约束和索引、删除约束和索引等。

     - 支持创建普通索引 ADD INDEX / KEY
     - 支持删除索引 DROP INDEX
     - 支持创建全文索引 ADD FULLTEXT INDEX / KEY
     - 支持创建唯一索引 ADD UNIQUE INDEX / KEY
     - 支持创建外键 ADD FOREIGN KEY

  操作约束和索引时，不支持的范围如下：

  > 注意：
  >
  >  
  >
  > 如果增量 DDL 包含以下不支持的定义，则整个建表语句会转换失败（输出空）。

     - UNIQUE KEY、INDEX / KEY、FULLTEXT INDEX 不支持函数索引，仅支持索引建在字段上
     - 不支持 `ADD SPATIAL INDEX`
     - 不支持 `ADD PRIMARY KEY`
     - 不支持 `DROP PRIMARY KEY`
     - 不支持 `ALTER TABLE DISABLE | ENABLE KEYS`
     - 不支持 `FOREIGN KEY` 指定 `ON [DELETE | UPDATE] SET NULL` 属性
     - OceanBase 数据库 MySQL 租户 3.2.3 以下版本，不支持如下操作：

           - 不支持 `ADD CHECK`
           - 不支持 `DROP CHECK`
           - 不支持 `ALTER CHECK [NOT] ENFORCED`
           - 不支持 `ALTER INDEX VISIBLE | INVISIBLE`
           - 不支持 `RENAME INDEX / KEY`

            ```sql
            alter table t rename key k to kk;
            ALTER TABLE T RENAME INDEX b TO w;

            ```
     - 不支持 `ALTER TABLE DISABLE | ENABLE KEYS`
     - 不支持 `FOREIGN KEY` 指定 `ON [DELETE | UPDATE] SET NULL` 属性

  如果增量 DDL 中包含以下特性的定义，则这些特性不会被解析和转换，最终会被忽略掉。

     - 指定 `USING BTREE` 或 `USING HASH`。
     - `index option` 中指定 `KEY_BLOCK_SIZE`、`index_type`、`WITH PARSER`、`COMMENT`、`VISIBLE | INVISIBLE`、`ENGINE_ATTRIBUTE` 和 `SECONDARY_ENGINE_ATTRIBUTE` 属性。
     - CHECK 约束中指定 `[NOT] ENFORCED` 属性。
     - `FOREIGN KEY` 指定 `MATCH FULL | MATCH PARTIAL | MATCH SIMPLE` 属性。

     - OceanBase 数据库 MySQL 租户不支持 PRIMARY KEY、UNIQUE KEY、INDEX / KEY、FULLTEXT INDEX、FOREIGN KEY 创建在某些类型的字段上。
     - OceanBase 数据库 MySQL 租户不支持 CHECK 约束中的某些函数/表达式。
     - OceanBase 数据库 MySQL 租户不支持 FOREIGN KEY 约束中的某些函数/表达式。
 - 操作分区

  操作分区时，支持的范围如下：

     - 支持 `ADD PARTITION` 添加 RANGE 分区
     - 支持 `ADD PARTITION` 添加 LIST 分区
     - 支持删除分区 `DROP PARTITION`

  操作分区时，不支持的范围如下：

     - 不支持 `ADD PARTITION`
     - 不支持 `TRUNCATE PARTITION`
     - 不支持 `DISCARD PARTITION`
     - 不支持 `IMPORT PARTITION`
     - 不支持 `COALESCE PARTITION`
     - 不支持 `REORGANIZE PARTITION`
     - 不支持 `EXCHANGE PARTITION`
     - 不支持 `ANALYZE PARTITION`
     - 不支持 `CHECK PARTITION`
     - 不支持 `OPTIMIZE PARTITION`
     - 不支持 `REBUILD PARTITION`
     - 不支持 `REPAIR PARTITION`
     - 不支持 `REMOVE PARTITIONING`
 - 修改表的属性

  修改表的属性时，支持的范围如下：

     - 支持表重命名

      ```sql
      alter table tablename rename to new_tablename

      ```
     - 支持修改表的 comment

      ```sql
      ALTER TABLE t comment = 'table comment'

      ```

  修改表的属性时，不支持的范围如下：

     - 不支持修改 ALGORITHM 属性

      ```sql
      ALTER TABLE t ALGORITHM = COPY

      ```
     - 不支持 CONVERT TO CHARACTER SET

      ```sql
      ALTER TABLE t CONVERT TO CHARACTER SET utf16;

      ```
     - 不支持修改 CHARACTER SET 和 COLLATE

      ```sql
      ALTER TABLE T DEFAULT CHARACTER SET utf8

      ```
     - 不支持 DISCARD | IMPORT TABLESPACE
     - 不支持 ALTER TABLE FORCE
     - 不支持修改 LOCK 属性：LOCK = DEFAULT | NONE | SHARED | EXCLUSIVE
     - 不支持 ALTER TABLE WITHOUT | WITH VALIDATION
     - 不支持修改 table_option 中除 comment 以外的属性

### 清空表 `TRUNCATE TABLE`

```sql
  TRUNCATE [TABLE] tbl_name

```

### 表重命名 `RENAME TABLE`

迁移 MySQL 数据库的数据至 OceanBase 数据库 MySQL 租户时，`RENAME TABLE` 支持重命名单表或多表。

### 删除表 `DROP TABLE`

迁移 MySQL 数据库的数据至 OceanBase 数据库 MySQL 租户时，`DROP TABLE` 支持删除单表或多表。

- OceanBase 数据库 MySQL 租户 3.2.3 以下版本不支持 TEMPORARY 关键字
 - 不支持 IF EXISTS 关键字
 - 不支持 RESTRICT / CASCADE 关键字

### 创建索引 `CREATE INDEX`

创建索引时，支持的范围如下：

- 支持创建普通索引
 - 支持创建 UNIQUE 索引
 - 支持创建前缀索引

  ```sql
  create index i on t(c1(2))

  ```
 - `index_option` 中仅支持指定 comment

创建索引时，不支持的范围如下：

- 不支持创建 SPATIAL INDEX
 - 不支持创建函数索引

- 不支持指定 ASC / DESC 关键字
 - 不支持指定 `KEY_BLOCK_SIZE`
 - 不支持指定 `WITH PARSER`
 - 不支持指定 `VISIBLE | INVISIBLE`
 - 不支持指定 `ENGINE_ATTRIBUTE`
 - 不支持指定 `SECONDARY_ENGINE_ATTRIBUTE`
 - 不支持指定 `ALGORITHM = DEFAULT | INPLACE | COPY`
 - 不支持指定 `LOCK = DEFAULT | NONE | SHARED | EXCLUSIVE`

由于 OceanBase 数据库 MySQL 租户本身的限制，不支持将索引创建在某些特定字段类型上。否则增量 DDL 被成功转换后，执行到 OceanBase 数据库 MySQL 租户可能会报错。

### 删除索引 `DROP INDEX`

迁移 MySQL 数据库的数据至 OceanBase 数据库 MySQL 租户时，支持删除索引。

- 不支持指定 ALGORITHM = DEFAULT | INPLACE | COPY
 - 不支持指定 LOCK = DEFAULT | NONE | SHARED | EXCLUSIVE

### 增量 DDL 的使用限制

- 如果需要同步的表涉及支持范围外的 DDL，数据迁移项目可能会中断并造成数据问题，且无法恢复。
 - 不能频繁对一张表进行 DDL 操作。当 Store 处理完当前 DDL 后（根据位点判断），再进行下一个 DDL。否则 Store 可能异常退出或造成数据问题，且无法恢复。
 - 新建 Store 前的一段时间和启动过程中，需要确保无 DDL。如果是回拉，回拉点至当前时间保证无 DDL。否则 Store 可能异常退出或造成数据问题，且无法恢复。
 - `RENAME TABLE` 前后的表名，必须全在需要同步的表中。
 - 增量 DDL 中，对于主键为 FLOAT 或 DOUBLE 类型的表，数据的最终结果可能会不一致。
 - 如果使用 gh-ost 将 MySQL 数据库的增量 DDL 同步至 OceanBase 数据库 MySQL 租户，则：

     - 选择 **指定对象** 的方式进行迁移时，请勿勾选表名为 `*_ghc` 的表。
     - 选择 **匹配规则** 的方式进行迁移时，请务必配置 **排除对象规则** 为 `{database_name}.*_ghc`。

## OB_MySQL 到 MySQL 迁移项目增量 DDL 支持的范围和限制

OMS 支持 MySQL 数据库 5.5、5.6、5.7 和 8.0 版本。

- 增量 DDL 支持的范围

     - 创建表 `CREATE TABLE`

      > **说明：**
      >
      >  
      >
      > 不支持 `CREATE TABLE AS SELECT`。
     - 删除表 `DROP TABLE`
     - 清空表 `TRUNCATE TABLE`
     - 修改列 `ALTER TABLE CHANGE COLUMN`

      > **注意：**
      >
      >  
      >
      > 仅支持修改列至更大的长度，不支持修改列的类型。
     - 添加列 `ALTER TABLE ADD COLUMN`
     - 修改列的默认值 `ALTER TABLE ALTER COLUMN SET DEFAULT` 或 `ALTER TABLE ALTER COLUMN DROP DEFAULT`
     - 删除列 `ALTER TABLE DROP COLUMN`
     - 新建索引 `CREATE INDEX` 或 `ALTER TABLE ADD INDEX`
     - 删除索引 `DROP INDEX` 或 `ALTER TABLE DROP INDEX`
 - 增量 DDL 的使用限制

     - 如果需要同步的表涉及不支持的 DDL 类型，数据迁移项目可能会中断并造成数据不一致的问题，且无法恢复。
     - 不能频繁对一张表进行 DDL 操作。当 Store 处理完当前 DDL 后（根据位点判断），再进行下一个 DDL。否则 Store 可能异常退出或造成数据问题，且无法恢复。
     - 新建 Store 前的一段时间和启动过程中，需要确保无 DDL。如果是回拉，回拉点至当前时间保证无 DDL。否则 Store 可能异常退出或造成数据问题，且无法恢复。
     - `RENAME TABLE` 前后的表名，必须全在需要同步的表中。

## Oracle 到 OB_Oracle 迁移项目增量 DDL 支持的范围和限制

- 增量 DDL 支持的范围

      包括分区表，不包括 `CREATE TABLE AS SELECT`。
     - 删除表 `DROP TABLE`
     - 清空表 `TRUNCATE TABLE`
     - 添加分区 `ADD PARTITION`

      支持添加一级分区和二级分区。其中一级和二级分区均支持添加 Range/List 分区，不支持添加 Hash 分区。
     - 删除分区 `DROP PARTITION`

      支持删除单个或多个分区，以及删除二级分区。
     - 清空分区 `TRUNCATE PARTITION`

      支持清空单个或多个分区、支持清空二级分区。
     - 表重命名 `RENAME TABLE` 或 `ALTER TABLE RENAME`
     - 添加列 `ALTER TABLE ADD COLUMN`
     - 修改列 `ALTER TABLE MODIFY COLUMN`

      > **注意：**
      >
      >  
      >
      > 仅支持修改列至更大的长度，不支持修改列的类型。
     - 删除列 `ALTER TABLE DROP COLUMN`
     - 创建索引 `CREATE INDEX`
     - 删除索引 `DROP INDEX`
     - 添加表或列的注释
 - 增量 DDL 的使用限制

     - 如果需要同步的表涉及不支持的 DDL 类型，数据迁移项目可能会中断并造成数据不一致的问题，且无法恢复。
     - 不能频繁对一张表进行 DDL 操作。当 Store 处理完当前 DDL 后（根据位点判断），再进行下一个 DDL。否则 Store 可能异常退出或造成数据问题，且无法恢复。
     - 新建 Store 前的一段时间和启动过程中，需要确保无 DDL。如果是回拉，回拉点至当前时间保证无 DDL。否则 Store 可能异常退出或造成数据问题，且无法恢复。
     - `RENAME TABLE` 前后的表名，必须全在需要同步的表中。
     - 删除用户未命名的 PK，对应删除的是 Oracle 系统命名的约束（`SYS_C` 开头的命名方式）。如果是 Oracle 数据库至 OceanBase 数据库等库到库的数据迁移或数据同步，OceanBase 数据库上的 PK 名称和 Oracle 数据库的不同，因此无法在 OceanBase 数据库中删除。
     - 不支持同步 `CASE WHEN INDEX` 的建表 DDL。

## OB_Oracle 到 Oracle 迁移项目增量 DDL 支持的范围和限制

- 增量 DDL 支持的范围

      支持清空单个或多个分区，以及清空二级分区。
     - 表重命名 `rename table` 或 `alter table rename`
     - 添加列 `alter table add column`
     - 修改列 `alter table modify column`

      > **注意：**
      >
      >  
      >
      > 仅支持修改列至更大的长度，不支持修改列的类型。
     - 创建索引 `create Index`
     - 删除索引 `drop Index`
     - 添加和删除表或列的注释
 - 增量 DDL 的使用限制

     - 除支持的增量 DDL 类型外，其它类型均不支持。如果需要同步的表涉及其它类型的 DDL，迁移链路可能会中断并造成数据问题，且无法恢复。
     - 不能频繁对一张表进行 DDL 操作。当 Store 处理完当前 DDL 后（根据位点判断），再进行下一个 DDL。否则 Store 可能异常退出或造成数据问题，且无法恢复。
     - 新建 Store 前的一段时间和启动过程中，需要确保无 DDL。如果是回拉，回拉点至当前时间保证无 DDL。否则 Store 可能异常退出或造成数据问题，且无法恢复。
     - `rename table` 前后的表名，必须全在需要同步的表中。
     - 删除用户未命名的 PK，对应删除的是 Oracle 系统命名的约束（`SYS_C` 开头的命名方式）。如果是 Oracle 数据库至 OceanBase 数据库等库到库的数据迁移或数据同步，OceanBase 数据库上的 PK 名称和 Oracle 数据库的不同，因此无法在 OceanBase 数据库中删除。
     - 迁移 OceanBase 数据库 Oracle 租户的数据至 Oracle 数据库时，不支持导致表从有主键表变为无主键表的 DDL 操作。

           - 如果 OceanBase 数据库 Oracle 租户中存在 `pk`，则支持所有的 DDL 操作。
           - 如果 OceanBase 数据库 Oracle 租户中仅存在 `not null uk`，则不支持导致 OceanBase 数据库失去 `not null uk` 的 DDL 操作。
     - 存在 `case when index` 的建表 DDL 不支持同步。

## OB_Oracle 和 DB2 LUW 之间的迁移项目动态 DDL 处理

- 支持的类型

     - 创建表 `create table`
     - 修改表 `alter table`
     - 删除表 `drop table`
     - 清空表 `truncate table`
     - 表重命名 `rename table`
     - 创建索引 `create Index`
     - 删除索引 `drop Index`
     - 添加和删除表或列的注释

  迁移 DB2 LUW 数据库 10.1 版本的数据至 OceanBase 数据库 Oracle 租户 2.2.76 及以上版本时，仅支持如下类型的增量 DDL：

     - 创建表 `create table`
     - 删除表 `drop table`
     - 清空表 `truncate table`
     - 表重命名 `rename table`
     - 添加列 `add column`
     - 修改列 `modify column`
 - 使用限制

     - Create Table

      | 分类 | 描述 |
      | --- | --- |
      | 语法限制 | - 不支持 Create like 语法。     - 不支持带有列类型别名（非原生数据类型）的语法。     - 不支持带有 Select 或者 Subquery 的语法。     - 生成列中，如果包含不兼容函数或复杂表达式可能会报错。     - 不支持包含 XML 类型的语法。 |
      | 列属性处理 | - 目前列属性值重点关注了列名、列类型、null 标志位和 Default 值。     - 不支持生成列属性，DDL 没有处理生成列定义。     - 请谨慎使用带有函数的 Default 值。如果函数不支持执行，则会导致创建表失败。 |
      | 索引处理 | - 建议使用显式的索引定义，包括显式的定义 PK、UK 和 CHECK，不建议使用 CHECK。匿名索引会自动生成名称，可能会造成命名冲突。     - 请谨慎使用函数。如果函数不支持执行，则会导致创建表失败。     - 不建议使用外键。目前 OMS 不支持同步具备外键的表，外键在 DDL 转换中会被丢弃。 |
      | 分区（Partition） | - 仅支持根据时间的 Range 分区同步，对于非时间的 Range 分区会直接平移表达式。不建议在分区使用函数，可能导致语法不兼容，从而导致迁移项目失败。     - Partition 的 range 开头和结尾不支持 `MINVALUE` 和 `MAXVALUE` 等数据源相关的表示。     - DB2 LUW 数据库的 Partition 必须包含 `ending`，并且必须加 `exclusive`，否则会报错。     - DB2 LUW 数据库不支持 Partition 的 `every` 语法扩展，防止计算出错。     - DB2 LUW 数据库的 table 主键加 Partition 列。如果主键和分区键没有交集，则主键会更改为唯一索引来适配 OceanBase 数据库的 Partition 规则约束。     - DB2 LUW 数据库中，`CREATE/ALTER TABLE ADD PARTITION` 必须带 Partition 的名称，不支持匿名 Partition。 |
     - Alter Table

           - DB2 LUW 数据库的 `alter table add primary` 会转换为 OceanBase 数据库 Oracle 租户的 `add unique` 语法。因为 OceanBase 数据库不支持后加主键，您需要在创建表时，显式地指定主键。
           - 如果要 `alter table` 修改 LOB 类型，应该带上 LOB 类型长度，不支持缩小 LOB 类型长度的 `alter table` 操作。
           - DB2 LUW 数据库要求 `unique index` 为非空属性，所以创建 UK 列需要为非空约束。即 `alter table add unique` 时，涉及的列为非空约束。
     - Create Index

      不支持在 OceanBase 数据库端的普通表中，添加 Local 语法。
     - DDL 解析

      请参见 DB2 官方文档执行 DDL 语句，以保证最大程度的兼容。DB2 LUW 解析源端 DDL 有以下操作限制：

           - 目前 DB2 LUW 解析的 DDL 缓存刷新，使用的是回查 Schema 的方式。建议您每次只解析一类 DDL，待解析完成确认无误后再进行下一类 DDL 解析。
           - 对于分区表，请尽量避免频繁的 `create` 和 `drop` 操作。建议您在 `create partition table`，并确认同步正常后，再进行 `drop partition table` 的操作。
           - DB2 LUW 数据库仅支持解析对象名称由字母、下划线和数字组成，需要以字母和下划线开头，且对象名称不能为 DB2 LUW 的关键字。

## DB2 LUW 到 OB_MySQL 迁移项目增量 DDL 支持的范围和限制

| 增量 DDL | 支持 | 不支持 |
| --- | --- | --- |
| 创建表 `create table` | - 支持指定列 NULL 或 NOT NULL - 支持指定列的 DEFAULT 值 - 支持包含 PK 或 UK - 支持分区表（仅支持使用 range 一级分区） - 支持生成列 | - 不支持设置外键 - 不支持表级别和列级别的 check 约束 - 不支持隐藏列 - 分区不支持下述情况：      - 分区右边界不能包含闭区间。如果有一个分区包含闭区间（即右区间不加 EXCLUSIVE），则不支持转换，会保留表结构，丢失分区信息。     - 不支持 every 语法，但会保留表结构，丢失分区信息。     - OceanBase 数据库 MySQL 租户不支持 date time timestamp 作为分区键。 |
| 修改表 `alter table` | - 列      - 支持增加多列     - 支持删除单列或多列     - 支持修改列的类型     - 支持修改列的长度          **注意：**         仅支持修改相同类型的列，且修改后的长度必须大于修改前的长度。     - 支持修改或删除默认值          **注意：**         不支持列的类型为空。     - 支持指定 NULL 或 NOT NULL     - 支持指定 DEFAULT 值 - 分区      如果表达式中均包含 EXCLUSIVE，则支持增加分区 - 约束      支持指定唯一约束 | - 列      - 不支持修改或删除 NOT NULL 属性     - 不支持指定列为 primary key     - 不支持指定 `check constraint`     - 不支持增加和删除外键     - 不支持重命名列 `rename column` - 分区      - 如果任意表达式不包含 EXCLUSIVE，则不支持增加分区     - 不支持 `detach partition`     - 不支持 `attach partition` - 约束      - 不支持增加和删除主键     - 不支持增加和删除 check 约束     - 不支持删除唯一键 |
| 删除表 `drop table` | 支持 `drop table` | 无 |
| 清空表 `truncate table` | 支持 `truncate table` | 无 |
| 表重命名 `rename table` | 支持 `rename table` | 无 |
| 创建索引 `create Index` | - 支持创建普通索引或唯一索引 - 支持创建分区索引 | - 不支持 desc 降序（丢失 desc） - 不支持 cluster index（丢失 cluster） - 不支持反向索引（丢失 reverse） - 不支持索引页的合并与分裂 |
| 删除索引 `drop index` | 无 | 不支持 `drop index` |
| 重命名索引 `rename index` | 无 | 不支持 `rename index` |
| 添加和删除注释 `add comment`/`drop comment` | 支持添加和删除表级别的注释 | 不支持添加和删除列级别的注释 |

## OB_MySQL 到 DB2 LUW 迁移项目 DDL 支持的范围和限制

### 支持的类型

- 创建表 `create table`
 - 修改表 `alter table`
 - 删除表 `drop table`
 - 清空表 `truncate table`
 - 表重命名 `rename table`
 - 创建索引 `create Index`
 - 删除索引 `drop Index`
 - 添加和删除表或列的注释

### 使用限制

- Create Table

  | 分类 | 描述 |
  | --- | --- |
  | 语法限制 | - 不支持 Create like 语法。   - 不支持带有列类型别名（非原生数据类型）的语法。   - 不支持带有 Select 或者 Subquery 的语法。   - 生成列中，如果包含不兼容函数或复杂表达式可能会报错。   - 不支持包含 XML 类型的语法。 |
  | 列属性处理 | - 目前列属性值重点关注了列名、列类型、null 标志位和 Default 值。   - 不支持生成列属性，DDL 没有处理生成列定义。   - 请谨慎使用带有函数的 Default 值。如果函数不支持执行，则会导致创建表失败。 |
  | 索引处理 | - 建议使用显式的索引定义，包括显式的定义 PK、UK 和 CHECK，不建议使用 CHECK。匿名索引会自动生成名称，可能会造成命名冲突。   - 请谨慎使用函数。如果函数不支持执行，则会导致创建表失败。   - 不建议使用外键。目前 OMS 不支持同步具备外键的表，外键在 DDL 转换中会被丢弃。 |
  | 分区（Partition） | - 仅支持根据时间的 Range 分区同步，对于非时间的 Range 分区会直接平移表达式。不建议在分区使用函数，可能导致语法不兼容，从而导致迁移项目失败。   - Partition 的 range 开头和结尾不支持 `MINVALUE` 和 `MAXVALUE` 等数据源相关的表示。   - DB2 LUW 数据库的 Partition 必须包含 `ending`，并且必须加 `exclusive`，否则会报错。   - DB2 LUW 数据库不支持 Partition 的 `every` 语法扩展，防止计算出错 。   - DB2 LUW 数据库的 table 主键加 Partition 列。如果主键和分区键没有交集，则主键会更改为唯一索引来适配 OceanBase 数据库的 Partition 规则约束。   - DB2 LUW 数据库中，`CREATE/ALTER TABLE ADD PARTITION` 必须带 Partition 的名称，不支持匿名 Partition。 |
 - Alter Table

     - 目前 DB2 LUW 解析的 DDL 缓存刷新，使用的是回查 Schema 的方式。建议您每次只解析一类 DDL，待解析完成确认无误后再进行下一类 DDL 解析。
     - 对于分区表，请尽量避免频繁的 `create` 和 `drop` 操作。建议您在 `create partition table`，并确认同步正常后，再进行 `drop partition table` 的操作。
     - DB2 LUW 数据库仅支持解析对象名称由字母、下划线和数字组成，需要以字母和下划线开头，且对象名称不能为 DB2 LUW 的关键字。
     - 如果您创建的项目未选择 **结构变更 DDL**，请进行 DDL 变更前，确保源端无变更，且增量 DML 数据已全部同步至目标端。然后在源端、目标端分别进行相关的 DDL 操作。

## OB_MySQL 到 OB_MySQL 迁移项目增量 DDL 支持的范围

迁移 OceanBase 数据库 MySQL 租户的数据至 OceanBase 数据库 MySQL 租户时，支持增量 DDL。

> **注意：**
>
>  
>
> 如果源端创建了 `index`，目标端已经存在。OMS 会自动忽略该 `index`，不会中断。

     - 添加列 `alter table add column`
     - 修改列 `alter table modify column`

      > **注意：**
      >
      >  
      >
      > 仅支持修改列至更大的长度，不支持修改列的类型。
     - 修改列的默认值 `alter table alter column set default` 或 `alter table alter column drop default`
     - 删除列 `alter table drop column`
     - 创建表 `create table`
     - 删除表 `drop table`
     - 清空表 `truncate table`
     - 新建索引 `create index` 或 `alter table add index`
     - 删除索引 `drop index` 或 `alter table drop index`
     - 表重命名 `rename table` 或 `alter table rename`
 - 增量 DDL 的使用限制

## OB_Oracle 到 OB_Oracle 迁移项目增量 DDL 支持的范围和限制

- 增量 DDL 支持的范围

      包括分区表，不包括 `create table as select`。支持的分区表类型有 1 级分区（Hash、Range 和 List）、2 级分区（Hash、Range 和 List）。
     - 删除表 `drop table`
     - 清空表 `truncate table`
     - 表重命名 `rename table` 或 `alter table rename`
     - 添加列 `alter table add column`
     - 修改列 `alter table modify column`

     - 如果需要同步的表涉及不支持的 DDL 类型，数据迁移项目可能会中断并造成数据不一致的问题，且无法恢复。
     - 不能频繁对一张表进行 DDL 操作。当 Store 处理完当前 DDL 后（根据位点判断），再进行下一个 DDL。否则 Store 可能异常退出或造成数据问题，且无法恢复。
     - 新建 Store 前的一段时间和启动过程中，需要确保无 DDL。如果是回拉，回拉点至当前时间保证无 DDL。否则 Store 可能异常退出或造成数据问题，且无法恢复。
     - `rename table` 前后的表名，必须全在需要同步的表中。
     - 不支持同步 `case when index` 的建表 DDL。

## 常见问题

Q：在源端执行不支持的 DDL 后，导致数据迁移项目运行失败，该如何处理？

A：您需要将 DDL 配置至 SkipDDL 中，然后重启数据迁移项目。具体操作如下：

1. 进入目标项目的详情页面。

      1. 登录 OMS 控制台。
      2. 在左侧导航栏，单击 `数据迁移`。
      3. 在 **迁移项目列表** 页面，单击目标项目的名称，进入该项目的详情页面。
 2. 单击右上角的 **查看组件监控**。
 3. 在 **查看组件监控** 页面，单击 JDBCWriter 组件后的 **...** > **查看日志**。
 4. 在 `error.log` 中定位到报错 DDL 语句。
 5. 在 `ddl_msg.log` 中，复制 `receive ddl:` 中的内容。
 6. 更新组件参数。

      1. 返回 **查看组件监控** 页面，单击 JDBCWriter 组件后的 **更新**。
      2. 在 **更新配置** 页面，鼠标悬停至参数 `JDBCWriter.coordinatorFile.skipDdl`，单击显示的编辑图标，修改值为之前复制的内容，并单击确认图标。如果有多条 DDL，请使用 & 分隔。您也可以自行配置分隔的符号。
      3. 鼠标悬停至 `extraConfig` 参数，单击添加图标，新增参数 `JDBCWriter.coordinatorFile.skipDDLSeparator = "$"`，并单击确认图标。其默认值为 &。
      4. 单击 **更新**。
 7. 返回该项目的详情页面，单击右上角的 **恢复**，重新运行数据迁移项目。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
