基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
增量 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选项。示例如下: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,会输出空字符串。
创建表的语法总览如下:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
| 分类 | 描述 |
|---|---|
| create_definition | create_definition 支持创建列、创建索引或约束,详情请参见表格后《创建列》和《创建索引或约束》的内容。 |
| table_options |
|
| partition_options |
|
注意:
OceanBase 数据库 MySQL 租户支持的字符集有限,详情请参见 字符集。
请勿使用 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,详情请参见 字符序。
创建索引或约束
创建索引或约束时,支持的范围如下:
支持创建 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 定义中包含函数或表达式,示例如下:
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 属性
如果增量 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 租户本身的限制,如果存在以下场景,增量 DDL 被成功转换后,执行到 OceanBase 数据库 MySQL 租户可能会报错。
OceanBase 数据库 MySQL 租户不支持 PRIMARY KEY、UNIQUE KEY、INDEX / KEY、FULLTEXT INDEX、FOREIGN KEY 创建在某些类型的字段上。
OceanBase 数据库 MySQL 租户不支持 CHECK 约束中的某些函数/表达式。
OceanBase 数据库 MySQL 租户不支持 FOREIGN KEY 约束中的某些函数/表达式。
OceanBase 数据库 MySQL 租户不支持某些 COLLATE,详情请参见 字符序。
创建分区
创建分区时,支持的范围如下:
支持创建一级分区:RANGE 分区、LIST 分区、HASH 分区 和 KEY 分区。
支持创建二级分区:HASH 分区 和 KEY 分区。
RANGE 分区、LIST 分区、HASH 分区支持函数分区键(分区键为表达式或函数)和列分区键(分区键是字段),KEY 分区仅支持列分区键。
支持指定 PARTITIONS number 和 SUBPARTITIONS number。
创建分区时,不支持创建 LINEAR HASH 和 LINEAR KEY 分区。
注意:
如果创建分区的 DDL 包含不支持的定义,则分区定义输出空,但是表结构会保留(分区定义被抛弃)。
如果增量 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 租户本身的限制,如果存在以下场景,增量 DDL 被成功转换后,执行到 OceanBase 数据库 MySQL 租户可能会报错。
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。ALTER TABLE t RENAME COLUMN d TO g;
如果增量 DDL 中包含
MODIFY COLUMN或CHANGE COLUMN,会忽略 FIRST | AFTER 关键字。由于 OceanBase 数据库 MySQL 租户本身的限制,如果存在以下场景,增量 DDL 被成功转换后,执行到 OceanBase 数据库 MySQL 租户可能会报错。
通过
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 / KEYalter 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 租户本身的限制,如果存在以下场景,增量 DDL 被成功转换后,执行到 OceanBase 数据库 MySQL 租户可能会报错。
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
操作分区时,不支持的范围如下:
注意:
如果增量 DDL 包含以下不支持的定义,则整个建表语句会转换失败(输出空)。
不支持
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
修改表的属性
修改表的属性时,支持的范围如下:
支持表重命名
alter table tablename rename to new_tablename支持修改表的 comment
ALTER TABLE t comment = 'table comment'
修改表的属性时,不支持的范围如下:
不支持修改 ALGORITHM 属性
ALTER TABLE t ALGORITHM = COPY不支持 CONVERT TO CHARACTER SET
ALTER TABLE t CONVERT TO CHARACTER SET utf16;不支持修改 CHARACTER SET 和 COLLATE
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
TRUNCATE [TABLE] tbl_name
表重命名 RENAME TABLE
迁移 MySQL 数据库的数据至 OceanBase 数据库 MySQL 租户时,RENAME TABLE 支持重命名单表或多表。
删除表 DROP TABLE
迁移 MySQL 数据库的数据至 OceanBase 数据库 MySQL 租户时,DROP TABLE 支持删除单表或多表。
如果增量 DDL 中包含以下特性的定义,则这些特性不会被解析和转换,最终会被忽略掉。
OceanBase 数据库 MySQL 租户 3.2.3 以下版本不支持 TEMPORARY 关键字
不支持 IF EXISTS 关键字
不支持 RESTRICT / CASCADE 关键字
创建索引 CREATE INDEX
创建索引时,支持的范围如下:
支持创建普通索引
支持创建 UNIQUE 索引
支持创建前缀索引
create index i on t(c1(2))index_option中仅支持指定 comment
创建索引时,不支持的范围如下:
注意:
如果增量 DDL 包含以下不支持的定义,则整个建表语句会转换失败(输出空)。
不支持创建 SPATIAL INDEX
不支持创建函数索引
如果增量 DDL 中包含以下特性的定义,则这些特性不会被解析和转换,最终会被忽略掉。
不支持指定 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 租户时,支持删除索引。
如果增量 DDL 中包含以下特性的定义,则这些特性不会被解析和转换,最终会被忽略掉。
不支持指定 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包括分区表,不包括
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 支持的范围
创建表
create table包括分区表,不包括
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注意:
仅支持修改列至更大的长度,不支持修改列的类型。
创建索引
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 |
|
|
修改表 alter table |
|
|
删除表 drop table |
支持 drop table |
无 |
清空表 truncate table |
支持 truncate table |
无 |
表重命名 rename table |
支持 rename table |
无 |
创建索引 create Index |
|
|
删除索引 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 数据库的
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 的关键字。
如果您创建的项目未选择 结构变更 DDL,请进行 DDL 变更前,确保源端无变更,且增量 DML 数据已全部同步至目标端。然后在源端、目标端分别进行相关的 DDL 操作。
OB_MySQL 到 OB_MySQL 迁移项目增量 DDL 支持的范围
迁移 OceanBase 数据库 MySQL 租户的数据至 OceanBase 数据库 MySQL 租户时,支持增量 DDL。
注意:
如果源端创建了
index,目标端已经存在。OMS 会自动忽略该index,不会中断。
增量 DDL 支持的范围
添加列
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 的使用限制
如果需要同步的表涉及不支持的 DDL 类型,数据迁移项目可能会中断并造成数据不一致的问题,且无法恢复。
不能频繁对一张表进行 DDL 操作。当 Store 处理完当前 DDL 后(根据位点判断),再进行下一个 DDL。否则 Store 可能异常退出或造成数据问题,且无法恢复。
新建 Store 前的一段时间和启动过程中,需要确保无 DDL。如果是回拉,回拉点至当前时间保证无 DDL。否则 Store 可能异常退出或造成数据问题,且无法恢复。
rename table前后的表名,必须全在需要同步的表中。
OB_Oracle 到 OB_Oracle 迁移项目增量 DDL 支持的范围和限制
增量 DDL 支持的范围
创建表
create table包括分区表,不包括
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注意:
仅支持修改列至更大的长度,不支持修改列的类型。
创建索引
create index删除索引
drop index添加和删除表或列的注释
增量 DDL 的使用限制
如果需要同步的表涉及不支持的 DDL 类型,数据迁移项目可能会中断并造成数据不一致的问题,且无法恢复。
不能频繁对一张表进行 DDL 操作。当 Store 处理完当前 DDL 后(根据位点判断),再进行下一个 DDL。否则 Store 可能异常退出或造成数据问题,且无法恢复。
新建 Store 前的一段时间和启动过程中,需要确保无 DDL。如果是回拉,回拉点至当前时间保证无 DDL。否则 Store 可能异常退出或造成数据问题,且无法恢复。
rename table前后的表名,必须全在需要同步的表中。不支持同步
case when index的建表 DDL。
常见问题
Q:在源端执行不支持的 DDL 后,导致数据迁移项目运行失败,该如何处理?
A:您需要将 DDL 配置至 SkipDDL 中,然后重启数据迁移项目。具体操作如下:
进入目标项目的详情页面。
登录 OMS 控制台。
在左侧导航栏,单击
数据迁移。在 迁移项目列表 页面,单击目标项目的名称,进入该项目的详情页面。
单击右上角的 查看组件监控。
在 查看组件监控 页面,单击 JDBCWriter 组件后的 ... > 查看日志。
在
error.log中定位到报错 DDL 语句。在
ddl_msg.log中,复制receive ddl:中的内容。更新组件参数。
返回 查看组件监控 页面,单击 JDBCWriter 组件后的 更新。
在 更新配置 页面,鼠标悬停至参数
JDBCWriter.coordinatorFile.skipDdl,单击显示的编辑图标,修改值为之前复制的内容,并单击确认图标。如果有多条 DDL,请使用 & 分隔。您也可以自行配置分隔的符号。鼠标悬停至
extraConfig参数,单击添加图标,新增参数JDBCWriter.coordinatorFile.skipDDLSeparator = "$",并单击确认图标。其默认值为 &。单击 更新。
返回该项目的详情页面,单击右上角的 恢复,重新运行数据迁移项目。