DDL 变更类型及响应策略
实时整库任务支持监控数据源 DDL 变更,实时将源端变更同步到目标端。支持的 DDL 场景及相应策略如下表:
DDL | 说明 |
新建表 | 1. 自动建表:当来源端被监控的库中出现新建表时,目标端将自动创建同结构的表及字段。 2. 忽略变更:目标端忽略来源端的产生的 DDL 变更消息,目标端及日志不做任何响应或消息提醒。 3. 日志告警:目标端仅接收 DDL 变更消息,并在日志内打印消息内容,不触发新建表操作。 4. 任务出错:目标端接收 DDL 变更消息并持续重启任务,重启过程中任务日志报错并出现数据写入异常。 |
新增列 | 1. 自动新增列:当来源端被监控的表中出现新增列时,目标端将自动创建同名列。 2. 忽略变更:目标端忽略来源端的产生的 DDL 变更消息,目标端及日志不做任何响应或消息提醒。 3. 日志告警:目标端仅接收 DDL 变更消息,并在日志内打印消息内容。此策略并不触发新增列操作。 4. 任务出错:目标端接收 DDL 变更消息并持续重启任务,重启过程中任务日志报错并出现数据写入异常。 |
删除列 | 1. 自动删除列:当来源端被监控的表中出现删除列时,目标端将自动删除同名列。 2. 忽略变更:目标端忽略来源端的产生的 DDL 变更消息,目标端及日志不做任何响应或消息提醒。 3. 日志告警:目标端仅接收 DDL 变更消息,并在日志内打印消息内容。此策略并不触发删除列操作。 4. 任务出错:目标端接收 DDL 变更消息并持续重启任务,重启过程中任务日志报错并出现数据写入异常。 |
重命名列 | 1. 自动重命名列:当来源端被监控的表中出现列名称变化时,目标端将自动重命名列名。 2. 忽略变更:目标端忽略来源端的产生的 DDL 变更消息,目标端及日志不做任何响应或消息提醒。 3. 日志告警:目标端仅接收 DDL 变更消息,并在日志内打印消息内容。此策略并不触发重命名列操作。 4. 任务出错:目标端接收 DDL 变更消息并持续重启任务,重启过程中任务日志报错并出现数据写入异常。 |
修改列类型 | 1. 自动修改列类型:当来源端被监控的库中出现列类型变化时,如字段长度变化、增加 comment 等,目标端将自动进行相应变更。 2. 忽略变更:目标端忽略来源端的产生的 DDL 变更消息,目标端及日志不做任何响应或消息提醒。 3. 日志告警:目标端仅接收 DDL 变更消息,并在日志内打印消息内容。此策略并不触发修改列类型操作。 4. 任务出错:目标端接收 DDL 变更消息并持续重启任务,重启过程中任务日志报错并出现数据写入异常。 |
删除表 | 1. 忽略变更:目标端忽略来源端的产生的 DDL 变更消息,目标端及日志不做任何响应或消息提醒。 2. 日志告警:目标端仅接收 DDL 变更消息,并在日志内打印消息内容。此策略并不触发删除表/重命名表/清空表操作。 3. 任务出错:目标端接收 DDL 变更消息并持续重启任务,重启过程中任务日志报错并出现数据写入异常。 |
重命名表 | |
清空表 | |
说明:
针对源端“高危”的表级操作,如删除表、清空表、重命名表,目标端不支持自动响应变更,即目标端不会自动进行删除表、清空表、重命名表操作。
DML 及 DDL 支持情况概览
目标端是否能自动同步源端的 DML 及 DDL 变更,取决于来源端是否能捕获这些变更,以及目标端是否能响应这些变更。源端支持并且目标端也支持的情况下,对应的链路方可支持对应的 DDL 变更。如 MySQL 源端支持新增列,DLC 目标端支持新增列,则 MySQL 来源表中新增列方能自动在 DLC 目标端新增列;MySQL 源端支持删除表,Doris 目标端不支持删除表,则 MySQL 数据源中删除的表在 Doris 目标端不会自动删除。
不同的来源及目标端支持的 DML、DDL 类型及消息处理存在差异,部分数据源支持情况如下表,具体参见产品页面配置。
说明:
1. 读:“是” 表示读端可感知对应 DML、DDL 操作,传递变更给下游。
2. 写:“是” 表示写端可跟随响应对应DML、 DDL 变更。
3. DDL变更响应目前仅支持增量阶段,全量阶段不支持DDL变更。
类型 | 读(来源端) | | | | | | | | | | |
| DML | | | DDL | | | | | | | |
| 插入 | 删除 | 更新 | 新增列 | 删除列 | 重命名列 | 修改列类型 | 新增表 | 重命名表 | 删除表 | 清空表 |
MySQL | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
TDSQL-C MySQL | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
TDSQL MySQL | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
Oracle | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
SQL Server | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
PostgreSQL | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 是 | 否 | 是 | 是 |
OceanBase | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
Kafka | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
类型 | 写(目标端) | | | | | | | | | | |
| DML | | | DDL | | | | | | | |
| 插入 | 删除 | 更新 | 新增列 | 删除列 | 重命名列 | 修改列类型 | 新增表 | 重命名表 | 删除表 | 清空表 |
DLC | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 |
Iceberg | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 |
Doris | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 |
StarRocks | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 是 | 否 | 否 | 否 |
TChouse-P | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 是 | 否 | 否 | 否 |
Elasticsearch | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 否 | 否 | 否 |
Hive | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
Kafka | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
DDL 解析语法要求
注意:
仅符合 DDL 类型及语法要求的 SQL 可被源端解析并响应,不支持的 SQL 语句可能会导致任务异常重启等情况。请评估业务表结构变更常用语法是否符合要求,并为任务配置符合业务要求的 DDL 变更响应及写入异常处理策略。
MySQL
1. 重命名表(rename table)支持下列语法:
RENAME TABLE tbl_name TO new_tbl_name
2. 新建表(create table)支持下列语法:
CREATE TABLE [IF NOT EXISTS] tbl_name (create_definition,...) CREATE TABLE new_tbl LIKE orig_tbl; CREATE TABLE new_tbl AS SELECT * FROM orig_tbl;
警告:
不支持 CHECK \\ TemporaryTable 等约束
3. 修改列(modify \\ change column) 与 重命名列(rename column)支持下列语法:
ALTER TABLE t1 MODIFY b INT NOT NULL; ALTER TABLE t1 CHANGE b a INT NOT NULL;
4. 增加列(add column) / 重命名列 支持下列语法:
ALTER TABLE table_name ADD new_column_name column_definition [ FIRST | AFTER column_name ];
5. 删除列(drop column)支持下列语法:
Alter table t2 DROP [COLUMN] col_name
6. 清空表(truncate table)支持下列语法:
truncate table a;
7. 删除表(drop table)支持下列语法:
drop table a;