增量 DDL 支持的范围和限制

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

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

支持的范围

  • 创建语句

    • 创建表 create table

      创建表时,支持 IF NOT EXISTS 关键字和 LIKE 选项。示例如下:

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

      创建表时,不支持创建临时表(TEMPORARY 关键字会被忽略)和基于查询的表(输出空字符串)。

      创建表的语法总览如下:

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

      分类

      描述

      create_definition

      总览:

      • 支持创建列

      • 支持创建 INDEX

      • 支持创建 FULLTEXT index

      • 支持创建 PRIMARY KEY

      • 支持创建 UNIQUE KEY

      • 支持创建 CHECK 约束

      • 支持创建 FOREIGN KEY

      • 不支持创建 SPATIAL index(输出空语句)

      列定义:

      • 支持生成列 GENERATED ALWAYS AS (expr) ,支持指定 VIRTUAL | STORED

      • 支持指定 NOT NULL | NULL

      • 支持指定 DEFAULT值,表达式为常见函数、操作符、常量等

      • 支持指定 VISIBLE | INVISIBLE

      • 支持指定 AUTO_INCREMENT

      • 支持指定 UNIQUE KEY / PRIMARY KEY

      • 支持指定 COMMENT

      • 支持指定 COLLATE

      • 支持指定外键

        支持指定 ON DELETE | ON UPDATE

        不支持指定 MATCH FULL | MATCH PARTIAL | MATCH SIMPLE(忽略该 option)

      • 支持指定 check 约束

      • 不支持指定 [NOT] ENFORCED (忽略该 option)

      table_options

      仅支持指定表级别 COMMENT

      partition_options

      • 支持一级分区:List、Range、Hash 和 Key

        List 分区支持指定函数分区键 | 列分区键

        Range 分区支持指定函数分区键 | 列分区键

        Hash 分区支持指定函数分区键 | 列分区键,支持 LINEAR Hash 定义

        Key 分区支持指定列分区键、LINEAR Key 定义

      • 支持指定二级分区:Hash 和 Key

      • 支持指定 PARTITIONS number 和 SUBPARTITIONS number

    • 创建索引 create index

  • 修改表 alter table

    • 支持的添加操作

      操作

      描述

      添加列

      • 支持添加单列

      • 支持添加多列

      • 支持 add column [FIRST | AFTER] col_name

      添加索引

      • 支持前缀索引

      • 支持添加 FULLTEXT INDEX

      • 支持添加 SPATIAL INDEX

      • 不支持函数索引(输出空语句)

      • 不支持指定索引方向 asc | desc(忽略该 option)

      • 不支持指定 index_typeUSING {BTREE | HASH}(忽略该 option)

      • 不支持指定 index_option(忽略该 option)

      添加 PRIMARY KEY

      • 支持前缀索引

      • 不支持函数索引(输出空语句)

      • 不支持指定索引方向 asc | desc(忽略该 option)

      • 不支持指定 index_type :USING {BTREE | HASH}(忽略该 option)

      • 不支持指定 index_option(忽略该 option)

      添加 UNIQUE KEY

      • 支持前缀索引

      • 不支持函数索引(输出空语句)

      • 不支持指定索引方向 asc | desc(忽略该 option)

      • 不支持指定 index_typeUSING {BTREE | HASH}(忽略该 option)

      • 不支持指定 index_option(忽略该 option)

      添加 FOREIGN KEY

      • 支持指定 ON DELETE | ON UPDATE reference_option

      • 不支持指定 MATCH FULL | MATCH PARTIAL | MATCH SIMPLE(忽略该 option)

    • 不支持的添加操作

      不支持 add check 约束(输出空语句)

    • 支持的删除操作

      操作

      示例语句

      删除字段

      alter table t DROP [COLUMN] col_name

      删除 index

      alter table t DROP {INDEX | KEY} index_name
    • 不支持的删除操作

      操作

      示例语句

      删除约束(输出空语句)

      alter table t drop constraint c1

      删除 check(输出空语句)

      alter table t drop check c1

      删除主键(输出空语句)

      alter table t DROP PRIMARY KEY

      删除外键

      alter table t DROP FOREIGN KEY fk_symbol
    • 支持的修改操作

      操作

      描述

      修改表的 comment

      alter table t comment = 'table comment'

      修改字段信息

      • 支持修改字段的 Default 值

      • 支持删除字段的 Default 值

      • 支持 modify 语法

      • 支持修改表名

    • 不支持的修改操作

      操作

      描述

      重命名列名

      alter table t  RENAME COLUMN old_col_name TO new_col_name

      重命名索引

      alter table t RENAME {INDEX | KEY} old_index_name TO new_index_name

      修改字段 VISIBLE 属性

      alter table t ALTER COLUMN col_name SET {VISIBLE | INVISIBLE}

      修改约束和 check /约束是否生效

      alter table t ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED

      修改 index 可见性

      alter table t ALTER INDEX index_name {VISIBLE | INVISIBLE}

      修改 index 是否生效

      alter table t {DISABLE | ENABLE} KEYS

      设置表的字符集 collate

      alter table t [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]

      修改表的字符集 collate

      alter table t CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]

      其它

      • 设置 ALGORITHM

        alter table t ALGORITHM [=] {DEFAULT | INSTANT | INPLACE | COPY}
      • 设置 DISCARD | IMPORT TABLESPACE

        alter table t {DISCARD | IMPORT} TABLESPACE
      • 设置 FORCE

        alter table t FORCE
      • 设置 lock 属性

        alter table t LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
      • 设置 VALIDATION

        alter table t {WITHOUT | WITH} VALIDATION
  • 删除语句

    • 删除表 drop table

      支持删除单表和多表,但不支持删除临时表,以及指定 IF EXISTS 或 RESTRICT | CASCADE,执行时会忽略相应的关键字。

      DROP [TEMPORARY] TABLE [IF EXISTS]
          tbl_name [, tbl_name] ...
          [RESTRICT | CASCADE]
    • 删除索引 drop index

      不支持指定 algorithm_option 和 lock_option,执行时会忽略。

      DROP INDEX index_name ON tbl_name
          [algorithm_option | lock_option] ...
      
      algorithm_option:
          ALGORITHM [=] {DEFAULT | INPLACE | COPY}
      
      lock_option:
          LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
  • 表重命名 rename table

    支持重命名单表或多表。

    RENAME TABLE
        tbl_name TO new_tbl_name
        [, tbl_name2 TO new_tbl_name2] ...
  • 清空表 truncate table

    TRUNCATE [TABLE] tbl_name

使用限制

  • 如果需要同步的表涉及支持范围外的 DDL,迁移链路可能会中断并造成数据问题,且无法恢复。

  • 不能频繁对一张表进行 DDL 操作。当增量解析组件处理完当前 DDL 后(根据位点判断),再进行下一个 DDL。否则增量解析组件可能异常退出或造成数据问题,且无法恢复。

  • rename table 前后的表名,必须全在需要同步的表中,或者全不在需要同步的表中。

  • 开启增量 DDL 后,drop index 命令会无差别执行,可能导致目标端索引丢失。

  • 增量 DDL 中,对于主键为 FLOAT 或 DOUBLE 类型的表,数据的最终结果可能会不一致。

  • 如果使用 gh-ost 将 MySQL 数据库的增量 DDL 同步至 OceanBase 数据库 MySQL 租户,则:

    • 选择 指定对象 的方式进行迁移时,请勿勾选表名为“*_ghc”的表。

    • 选择 匹配规则 的方式进行迁移时,请务必配置 排除对象规则 为 {database_name}.*_ghc。

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

支持的范围

  • 创建表 create table

    说明

    create table 中支持外键约束。

  • 删除表 drop table

  • 清空表 truncate table

  • 修改列 alter table change column

  • 添加字段 alter table add column

  • 修改字段长度 alter table modify column

    注意

    仅支持修改字段至更大的长度,不支持修改字段的类型。

  • 修改字段的默认值 alter table alter column set defaultalter table alter column drop default

  • 删除字段 alter table drop column

  • 新建索引 create indexalter table add index

  • 删除索引 drop indexalter table drop index

使用限制

  • 如果需要同步的表涉及支持范围外的 DDL,迁移链路可能会中断并造成数据问题,且无法恢复。

  • 不能频繁对一张表进行 DDL 操作。当 Store 处理完当前 DDL 后(根据位点判断),再进行下一个 DDL。否则 Store 可能异常退出或造成数据问题,且无法恢复。

  • 新建 Store 前的一段时间和启动过程中,需要确保无 DDL。如果是回拉,回拉点至当前时间保证无 DDL。否则 Store 可能异常退出或造成数据问题,且无法恢复。

  • rename table 前后的表名,必须全在需要同步的表中,或者全不在需要同步的表中。

  • 开启增量 DDL 后,drop index 命令会无差别执行,可能导致目标端索引丢失。

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

支持的范围

  • 创建表 create table

    包括分区表,不包括 create table as select

  • 删除表 drop table

  • 清空表 truncate table

  • 添加分区 add partition

    支持添加一级分区和二级分区。其中 1 级和 2 级分区均支持添加 Range/List 分区,不支持添加 Hash 分区。

  • 删除分区 drop partition

    支持删除单个或多个分区、支持删除二级分区,同时支持删除分区时添加 option UPDATE GLOBAL INDEXES,其它 option 会被忽略。

  • 清空分区 truncate partition

    支持 truncate 单个或多个分区、支持 truncate 二级分区,同时支持添加 option UPDATE INDEXES,其它 option 会被丢弃。

  • 表重命名 rename tablealter table rename

  • 添加列 alter table add column

  • 修改列 alter table modify column

  • 删除列 alter table drop column

  • 修改字段长度 alter table modify column

    注意

    仅支持修改字段至更大的长度,不支持修改字段的类型。

  • 创建索引 create index

  • 删除索引 drop index

  • 添加和删除表或列的注释

使用限制

  • 如果目标端为 VPC 内自建数据库类型的 OceanBase 数据库 Oracle 租户数据源,则不支持增量 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。

  • 开启增量 DDL 后,drop index 命令会无差别执行,可能导致目标端索引丢失。

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

支持的范围

  • 添加字段 alter table add column

  • 修改字段长度 alter table modify column

    注意

    仅支持修改字段至更大的长度,不支持修改字段的类型。

  • 修改字段的默认值 alter table alter column set defaultalter table alter column drop default

  • 删除字段 alter table drop column

  • 创建表 create table

  • 删除表 drop table

  • 清空表 truncate table

  • 新建索引 create indexalter table add index

  • 删除索引 drop indexalter table drop index

  • 表重命名 rename tablealter table rename

使用限制

  • 如果目标端为 VPC 内自建数据库类型的 OceanBase 数据库 MySQL 租户数据源,则不支持增量 DDL。

  • 如果需要同步的表涉及支持范围外的 DDL,迁移链路可能会中断并造成数据问题,且无法恢复。

  • 不能频繁对一张表进行 DDL 操作。当 Store 处理完当前 DDL 后(根据位点判断),再进行下一个 DDL。否则 Store 可能异常退出或造成数据问题,且无法恢复。

  • 新建 Store 前的一段时间和启动过程中,需要确保无 DDL。如果是回拉,回拉点至当前时间保证无 DDL。否则 Store 可能异常退出或造成数据问题,且无法恢复。

  • rename table 前后的表名,必须全在需要同步的表中,或者全不在需要同步的表中。

  • 开启增量 DDL 后,drop index 命令会无差别执行,可能导致目标端索引丢失。

  • 如果源端创建了 index,目标端已经存在。OMS 会自动忽略该 index,不会中断。

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

支持的范围

  • 创建表 create table

    包括分区表,不包括 create table as select。支持的分区表类型有 1 级分区(Hash、Range 和 List)、2 级分区(Hash、Range 和 List)。

  • 删除表 drop table

  • 清空表 truncate table

  • 表重命名 rename tablealter table rename

  • 添加列 alter table add column

  • 修改字段长度 alter table modify column

    注意

    仅支持修改字段至更大的长度,不支持修改字段的类型。

  • 创建索引 create index

  • 删除索引 drop index

  • 添加和删除表或列的注释

使用限制

  • 如果目标端为 VPC 内自建数据库类型的 OceanBase 数据库 Oracle 租户数据源,则不支持增量 DDL。

  • 如果需要同步的表涉及支持范围外的 DDL,迁移链路可能会中断并造成数据问题,且无法恢复。

  • 不能频繁对一张表进行 DDL 操作。当 Store 处理完当前 DDL 后(根据位点判断),再进行下一个 DDL。否则 Store 可能异常退出或造成数据问题,且无法恢复。

  • 新建 Store 前的一段时间和启动过程中,需要确保无 DDL。如果是回拉,回拉点至当前时间保证无 DDL。否则 Store 可能异常退出或造成数据问题,且无法恢复。

  • rename table 前后的表名,必须全在需要同步的表中,或者全不在需要同步的表中。

  • 不支持同步 case when index 的建表 DDL。

  • 开启增量 DDL 后,drop index 命令会无差别执行,可能导致目标端索引丢失。

阿里云首页 云数据库 OceanBase 相关技术圈