表结构变更同步支持

更新时间:
复制 MD 格式

CDC YAML Pipeline 作业通过 pipeline 级配置项 schema.change.behavior 控制表结构变更策略,取值包括 IGNORE、LENIENT、TRY_EVOLVE、EVOLVE 和 EXCEPTION。本文说明各 Sink 连接器在 LENIENT(默认)和 EVOLVE 两种模式下对不同表结构变更事件(Schema Change Event)的处理方式,其他模式详情可见Schema变更模式。

图例如下:

  • ✓ :Sink Schema会同步该类型变更。

  • ✗ :Sink Schema不会直接同步该类型变更,可能改为其他方式同步。

  • — :不涉及,框架层面不允许或不会识别为变更。

Paimon Sink

变更事件

LENIENT

EVOLVE

说明

添加列

✓

✓

LENIENT 下会在列末尾添加列,并将列类型改为nullable的类型;EVOLVE 下自动在结果表中添加对应列。

删除列

✗

✓

LENIENT 下不删除列,后续数据的该列写入NULL;EVOLVE 下在结果表中删除该列。

重命名列

✗

✓

LENIENT 下作为添加列和删除列处理,末尾添加重命名后的列,原列数据自动填充 NULL;EVOLVE 下在结果表中将原有列重命名。

列类型变更

✓

✓

在结果表中变更对应列的数据类型。

NOT NULL 转 NULLABLE

✓

✓

Paimon 允许将列从 NOT NULL 放宽为 NULLABLE。

NULLABLE 转 NOT NULL

—

—

框架层和 Paimon 均禁止将 NULLABLE 约束收紧,该变更不会生成事件。

创建表

✓

✓

在目标端自动创建对应表。如表已存在会校验 Schema 兼容性。

删除表

✗

✗

LENIENT 下不同步删除表变更;EVOLVE 下因为不支持删除表导致作业失败。

清空表

✗

✗

LENIENT 下不同步清空表变更;EVOLVE 下因为不支持清空表导致作业失败。

修改列注释

✗

✗

源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。

修改表注释

✗

✗

源端对表注释的修改不会同步。创建表时携带的表注释会被同步。

修改列顺序

✗

✓

LENIENT 下变更列顺序不同步,sink按照原有字段顺序写入;EVOLVE 下同步列顺序变更。

说明

Paimon Sink 具备列名大小写自动修正能力,当因大小写不匹配导致 Schema 变更失败时会自动重试。

Fluss Sink

变更事件

LENIENT

EVOLVE

说明

添加列

✓

✓

Fluss仅支持在末尾位置(LAST)添加列。LENIENT 下会在列末尾添加列,并将列类型改为nullable的类型;EVOLVE 下自动在结果表中添加对应列,如果不是在末尾位置添加列,作业会失败。

删除列

✗

✗

LENIENT 下不删除列,后续数据的该列写入NULL;EVOLVE 下因为不支持删除列导致作业失败。

重命名列

✗

✗

LENIENT 下作为添加列和删除列处理,末尾添加重命名后的列,原列数据自动填充 NULL;EVOLVE 下因为不支持重命名列导致作业失败。

列类型变更

✗

✗

Fluss因为不支持修改列类型会导致Flink作业失败。

NOT NULL 转 NULLABLE

✗

✗

Fluss因为不支持修改列类型会导致Flink作业失败。

NULLABLE 转 NOT NULL

—

—

框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。

创建表

✓

✓

在目标端自动创建对应表和数据库。

删除表

✗

✓

LENIENT 下不同步删除表变更;EVOLVE 下在目标端删除该表。

清空表

✗

✗

LENIENT 下不同步清空表变更;EVOLVE 下因为不支持清空表导致作业失败。

修改列注释

✗

✗

源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。

修改表注释

✗

✗

源端对表注释的修改不会同步。创建表时携带的表注释会被同步。

修改列顺序

✗

✗

LENIENT 下变更列顺序不同步,sink按照原有字段顺序写入;EVOLVE 下因为不支持同步列顺序变更导致作业失败。

说明

建议使用 schema.change.behavior: LENIENT 模式来更灵活地处理 Fluss 不支持的 Schema 变更。

StarRocks Sink

变更事件

LENIENT

EVOLVE

说明

添加列

✓

✓

LENIENT 下会在列末尾添加列,并将列类型改为nullable的类型;EVOLVE 下自动在结果表中添加对应列。

删除列

✗

✓

LENIENT 下不删除列,后续数据的该列写入NULL;EVOLVE 下在结果表中删除该列。

重命名列

✗

✗

LENIENT 下作为添加列和删除列处理,末尾添加重命名后的列,原列数据自动填充 NULL;EVOLVE 下因为不支持重命名列导致作业失败。

列类型变更

✗

✗

Starrocks因为不支持修改列类型会导致Flink作业失败。

NOT NULL 转 NULLABLE

✗

✗

Starrocks因为不支持修改列类型会导致Flink作业失败。

NULLABLE 转 NOT NULL

—

—

框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。

创建表

✓

✓

在目标端自动创建对应表。

删除表

✗

✓

LENIENT 下不同步删除表变更;EVOLVE 下在目标端删除该表。

清空表

✗

✓

LENIENT 下不同步清空表变更;EVOLVE 下清空目标端表的数据。

修改列注释

✗

✗

源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。

修改表注释

✗

✗

源端对表注释的修改不会同步。创建表时携带的表注释会被同步。

修改列顺序

✗

✗

LENIENT 下变更列顺序不同步,sink按照原有字段顺序写入;EVOLVE 下因为不支持同步列顺序变更导致作业失败。

说明

StarRocks 3.3+ 版本计划支持重命名列和列顺序变更操作,当前连接器版本暂不支持。

Iceberg Sink

变更事件

LENIENT

EVOLVE

说明

添加列

✓

✓

LENIENT 下会在列末尾添加列,并将列类型改为nullable的类型;EVOLVE 下自动在结果表中添加对应列。

删除列

✗

✓

LENIENT 下不删除列,后续数据的该列写入NULL;EVOLVE 下在结果表中删除该列。

重命名列

✗

✓

LENIENT 下作为添加列和删除列处理,末尾添加重命名后的列,原列数据自动填充 NULL;EVOLVE 下在结果表中将原有列重命名。

列类型变更

✓

✓

在结果表中变更对应列的数据类型。

NOT NULL 转 NULLABLE

✗

✗

Iceberg当前不支持修改NOT NULL 到 NULLABLE。

NULLABLE 转 NOT NULL

—

—

框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。

创建表

✓

✓

在目标端自动创建对应表和命名空间。

删除表

✗

✗

LENIENT 下不同步删除表变更;EVOLVE 下因为不支持删除表导致作业失败。

清空表

✗

✗

LENIENT 下不同步清空表变更;EVOLVE 下因为不支持清空表导致作业失败。

修改列注释

✗

✗

源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。

修改表注释

✗

✗

源端对表注释的修改不会同步。创建表时携带的表注释会被同步。

修改列顺序

✗

✗

LENIENT 下变更列顺序不同步,sink按照原有字段顺序写入;EVOLVE 下因为不支持同步列顺序变更导致作业失败。

Hologres Sink

变更事件

LENIENT

EVOLVE

说明

添加可空列

✓

✓

LENIENT 下会在列末尾添加列,并将列类型改为nullable的类型;EVOLVE 下自动在结果表中添加对应列。

添加非空列

✓

✓

Hologres不支持添加非空列,非空列添加会降级为:在结果表 Schema 末尾添加对应列,新增列默认设为可空列,历史数据该列自动置为 NULL。

删除列

✗

✗

Hologres 暂不支持删除列。LENIENT 下不删除列,后续数据的该列写入NULL,作业不会报错;EVOLVE 下因为不支持删除列导致作业失败。

重命名列

✗

✓

LENIENT 下作为添加列和删除列处理,末尾添加重命名后的列,原列数据自动填充 NULL;EVOLVE 下直接重命名。

列类型变更

✗

✗

Hologres 因为不支持修改列类型会导致Flink作业失败。建议搭配 sink.type-normalize-strategy 避免作业失败。

NOT NULL 转 NULLABLE

✗

✗

Hologres因为不支持修改列类型会导致Flink作业失败。

NULLABLE 转 NOT NULL

—

—

框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。

创建表

✓

✓

在目标端自动创建对应表。

删除表

✗

✓

LENIENT 下不同步删除表变更;EVOLVE 下在目标端删除该表。

清空表

✗

✓

LENIENT 下不同步清空表变更;EVOLVE 下清空目标端表的数据。

修改列注释

✗

✗

源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。

修改表注释

✗

✗

源端对表注释的修改不会同步。创建表时携带的表注释会被同步。

修改列顺序

✗

✗

LENIENT 下变更列顺序不同步,sink按照原有字段顺序写入;EVOLVE 下因为不支持同步列顺序变更导致作业失败。

说明

Hologres Sink 不支持 TRY_EVOLVE 策略。添加列时仅支持在末尾添加(LAST 位置),且不支持添加非 NULLABLE 列。同时不支持同步主键或索引等约束的变更、非空列的删除、以及 NOT NULL 转 NULLABLE 变更。

SelectDB Sink

变更事件

LENIENT

EVOLVE

说明

添加列

✓

✓

LENIENT 下会在列末尾添加列,并将列类型改为nullable的类型;EVOLVE 下自动在结果表中添加对应列。

删除列

✗

✓

LENIENT 下不删除列,后续数据的该列写入NULL;EVOLVE 下在结果表中删除该列。

重命名列

✗

✓

LENIENT 下作为添加列和删除列处理,末尾添加重命名后的列,原列数据自动填充 NULL;EVOLVE 下在结果表中将原有列重命名。

列类型变更

✓

✓

在结果表中变更对应列的数据类型。

NOT NULL 转 NULLABLE

✗

✗

MODIFY COLUMN 语句未显式指定 NULL,Doris 保持原有 NULLABLE 约束不变。

NULLABLE 转 NOT NULL

—

—

框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。

创建表

✓

✓

在目标端自动创建对应表。

删除表

✗

✓

LENIENT 下不同步删除表变更;EVOLVE 下在目标端删除该表。

清空表

✗

✓

LENIENT 下不同步清空表变更;EVOLVE 下清空目标端表的数据。

修改列注释

✗

✗

源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。

修改表注释

✗

✗

源端对表注释的修改不会同步。创建表时携带的表注释会被同步。

修改列顺序

✗

✗

LENIENT 下变更列顺序不同步,sink按照原有字段顺序写入;EVOLVE 下因为不支持同步列顺序变更导致作业失败。

说明

Batch 模式下(sink.enable-batch-mode: true),ALTER TABLE 类型的 Schema 变更(添加列、删除列、重命名列、列类型变更)会等待 Schema 变更完成后再继续处理数据,超时时间通过 schema.evolution.timeout 配置。SelectDB 底层基于 Apache Doris 引擎。

MaxCompute Sink

变更事件

LENIENT

EVOLVE

说明

添加列

✓

✓

LENIENT 下会在列末尾添加列,并将列类型改为nullable的类型;EVOLVE 下自动在结果表中添加对应列。

删除列

✗

✓

LENIENT 下不删除列,后续数据的该列写入NULL;EVOLVE 下在结果表中删除该列。

重命名列

✗

✓

LENIENT 下作为添加列和删除列处理,末尾添加重命名后的列,原列数据自动填充 NULL;EVOLVE 下在结果表中将原有列重命名。

列类型变更

✓

✓

在结果表中变更对应列的数据类型。

NOT NULL 转 NULLABLE

✓

✓

将列约束从 NOT NULL 放宽为 NULLABLE 会被同步到目标端。

NULLABLE 转 NOT NULL

—

—

框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。

创建表

✓

✓

在目标端自动创建对应表。表已存在时校验 Schema 和主键一致性,不一致会导致作业失败。

删除表

✗

✓

LENIENT 下不同步删除表变更;EVOLVE 下在目标端删除该表。

清空表

✗

✓

LENIENT 下不同步清空表变更;EVOLVE 下清空目标端表的数据。

修改列注释

✗

✗

源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。

修改表注释

✗

✗

源端对表注释的修改不会同步。创建表时携带的表注释会被同步。

修改列顺序

✗

✗

LENIENT 下变更列顺序不同步,sink按照原有字段顺序写入;EVOLVE 下因为不支持同步列顺序变更导致作业失败。

Kafka Sink

变更事件

LENIENT

EVOLVE

说明

创建表

✓

✓

在 Kafka 中自动创建对应的 Topic(Upsert 模式下创建 Compacted Topic)。

添加列

✓

✓

Kafka 不维护 Schema。LENIENT 下会在数据末尾添加新列的数据;EVOLVE 下会按照指定的列顺序添加新列的数据。

删除列

✗

✓

Kafka 不维护 Schema。LENIENT 下后续数据删除的列写入null;EVOLVE 下会停止写入删除的列。

重命名列

✗

✓

Kafka 不维护 Schema。LENIENT 下作为添加列和删除列处理,末尾添加重命名后的列,原列数据自动填充 NULL;EVOLVE 下按照变更后的Schema同步数据。

列类型变更

✓

✓

Kafka 不维护 Schema。后续按照变更后的类型写入数据。

NOT NULL 转 NULLABLE

✓

✓

Kafka 不维护 Schema。NOT NULL 转 NULLABLE不会进行额外处理。

NULLABLE 转 NOT NULL

—

—

框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。

删除表

✗

✗

不处理删除表变更。

清空表

✗

✗

不处理清空表变更。

修改列注释

✗

✗

不处理修改列注释变更。

修改表注释

✗

✗

不处理修改表注释变更。

修改列顺序

✓

✓

Kafka 不维护 Schema。LENIENT 下变更列顺序不同步,sink按照原有字段顺序写入;EVOLVE 下按照变更后的Schema同步数据。

说明

Kafka 作为消息队列不维护表的 Schema 结构,Schema 变更事件会作为消息的一部分发送到下游,但不会在 Kafka 端执行实际的结构变更操作。