CDC YAML Pipeline 作业通过 pipeline 级配置项 schema.change.behavior 控制表结构变更策略,取值包括 IGNORE、LENIENT、TRY_EVOLVE、EVOLVE 和 EXCEPTION。本文说明各 Sink 连接器在 LENIENT(默认)和 EVOLVE 两种模式下对不同表结构变更事件(Schema Change Event)的处理方式。图例:✓ 支持,✗ 不支持,— 不涉及。
Paimon Sink
|
变更事件 |
LENIENT |
EVOLVE |
说明 |
|
添加列 |
✓ |
✓ |
自动在结果表中添加对应列。 |
|
删除列 |
✓ |
✓ |
在结果表中删除该列。 |
|
重命名列 |
✓ |
✓ |
在结果表中将原有列重命名。 |
|
列类型变更 |
✓ |
✓ |
在结果表中变更对应列的数据类型。 |
|
NOT NULL 转 NULLABLE |
✓ |
✓ |
Paimon 允许将列从 NOT NULL 放宽为 NULLABLE。 |
|
NULLABLE 转 NOT NULL |
✗ |
✗ |
框架层和 Paimon 均禁止将 NULLABLE 约束收紧,该变更不会生成事件。 |
|
创建表 |
✓ |
✓ |
在目标端自动创建对应表。如表已存在会校验 Schema 兼容性。 |
|
删除表 |
✗ |
✗ |
LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。 |
|
清空表 |
✗ |
✗ |
LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。 |
|
修改列注释 |
✗ |
✗ |
源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。 |
|
修改表注释 |
✗ |
✗ |
源端对表注释的修改不会同步。创建表时携带的表注释会被同步。 |
Paimon Sink 具备列名大小写自动修正能力,当因大小写不匹配导致 Schema 变更失败时会自动重试。
Fluss Sink
|
变更事件 |
LENIENT |
EVOLVE |
说明 |
|
添加列 |
✓ |
✓ |
仅支持在末尾位置(LAST)添加列。 |
|
删除列 |
✗ |
✗ |
LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。 |
|
重命名列 |
✗ |
✗ |
LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。 |
|
列类型变更 |
✗ |
✗ |
LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。 |
|
NOT NULL 转 NULLABLE |
✗ |
✗ |
列类型变更事件不支持,NULLABLE 变更也被静默跳过。 |
|
NULLABLE 转 NOT NULL |
✗ |
✗ |
框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。 |
|
创建表 |
✓ |
✓ |
在目标端自动创建对应表和数据库。 |
|
删除表 |
✓ |
✓ |
在目标端删除该表。 |
|
清空表 |
✗ |
✗ |
LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。 |
|
修改列注释 |
✗ |
✗ |
源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。 |
|
修改表注释 |
✗ |
✗ |
源端对表注释的修改不会同步。创建表时携带的表注释会被同步。 |
建议使用 schema.change.behavior: LENIENT 模式来更灵活地处理 Fluss 不支持的 Schema 变更。
StarRocks Sink
|
变更事件 |
LENIENT |
EVOLVE |
说明 |
|
添加列 |
✓ |
✓ |
自动在结果表中添加对应列。 |
|
删除列 |
✓ |
✓ |
在结果表中删除该列。 |
|
重命名列 |
✗ |
✗ |
LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。 |
|
列类型变更 |
✗ |
✗ |
LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。 |
|
NOT NULL 转 NULLABLE |
✗ |
✗ |
列类型变更事件不支持,NULLABLE 变更也被静默跳过。 |
|
NULLABLE 转 NOT NULL |
✗ |
✗ |
框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。 |
|
创建表 |
✓ |
✓ |
在目标端自动创建对应表。 |
|
删除表 |
✓ |
✓ |
在目标端删除该表。 |
|
清空表 |
✓ |
✓ |
清空目标端表的数据。 |
|
修改列注释 |
✗ |
✗ |
源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。 |
|
修改表注释 |
✗ |
✗ |
源端对表注释的修改不会同步。创建表时携带的表注释会被同步。 |
StarRocks 3.3+ 版本计划支持 RENAME COLUMN 操作,当前版本暂不支持。
Iceberg Sink
|
变更事件 |
LENIENT |
EVOLVE |
说明 |
|
添加列 |
✓ |
✓ |
支持指定列的位置(FIRST/LAST/BEFORE/AFTER)。 |
|
删除列 |
✓ |
✓ |
在结果表中删除该列。 |
|
重命名列 |
✓ |
✓ |
在结果表中将原有列重命名。 |
|
列类型变更 |
✓ |
✓ |
在结果表中变更对应列的数据类型。 |
|
NOT NULL 转 NULLABLE |
✗ |
✗ |
暂不支持。 |
|
NULLABLE 转 NOT NULL |
✗ |
✗ |
框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。 |
|
创建表 |
✓ |
✓ |
在目标端自动创建对应表和命名空间。 |
|
删除表 |
✗ |
✗ |
LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。 |
|
清空表 |
✗ |
✗ |
LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。 |
|
修改列注释 |
✗ |
✗ |
源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。 |
|
修改表注释 |
✗ |
✗ |
源端对表注释的修改不会同步。创建表时携带的表注释会被同步。 |
Hologres Sink
|
变更事件 |
LENIENT |
EVOLVE |
说明 |
|
添加可空列 |
✓ |
✓ |
自动在结果表 Schema 末尾添加对应列,并同步新增列的数据。 |
|
添加非空列 |
✓ |
✓ |
在结果表 Schema 末尾添加对应列,新增列默认设为可空列,添加列发生之前的数据自动置为 NULL。 |
|
删除列 |
✗ |
✗ |
Hologres 暂不支持删除列。LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。 |
|
重命名列 |
✓ |
✓ |
LENIENT 下作为添加列和删除列处理,末尾添加重命名后的列,原列数据自动填充 NULL;EVOLVE 下直接重命名。 |
|
列类型变更 |
✗ |
✗ |
Hologres 不支持列类型变更。LENIENT 下静默跳过;EVOLVE 下抛出异常导致作业失败。需搭配 |
|
NOT NULL 转 NULLABLE |
✗ |
✗ |
列类型变更事件不支持,NULLABLE 变更也被静默跳过。 |
|
NULLABLE 转 NOT NULL |
✗ |
✗ |
框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。 |
|
删除表 |
✓ |
✓ |
在目标端删除该表。 |
|
清空表 |
✓ |
✓ |
清空目标端表的数据。 |
|
修改列注释 |
✗ |
✗ |
源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。 |
|
修改表注释 |
✗ |
✗ |
源端对表注释的修改不会同步。创建表时携带的表注释会被同步。 |
Hologres Sink 不支持 TRY_EVOLVE 策略。添加列时仅支持在末尾添加(LAST 位置),且不支持添加非 NULLABLE 列。同时不支持同步主键或索引等约束的变更、非空列的删除、以及 NOT NULL 转 NULLABLE 变更。
SelectDB Sink
|
变更事件 |
LENIENT |
EVOLVE |
说明 |
|
添加列 |
✓ |
✓ |
自动在结果表中添加对应列,并同步新增列的数据。 |
|
删除列 |
✓ |
✓ |
在结果表中删除该列。 |
|
重命名列 |
✓ |
✓ |
在结果表中将原有列重命名。 |
|
列类型变更 |
✓ |
✓ |
在结果表中变更对应列的数据类型。 |
|
NOT NULL 转 NULLABLE |
✗ |
✗ |
MODIFY COLUMN 语句未显式指定 NULL,Doris 保持原有 NULLABLE 约束不变。 |
|
NULLABLE 转 NOT NULL |
✗ |
✗ |
框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。 |
|
创建表 |
✓ |
✓ |
在目标端自动创建对应表。 |
|
删除表 |
✓ |
✓ |
在目标端删除该表。 |
|
清空表 |
✓ |
✓ |
清空目标端表的数据。 |
|
修改列注释 |
✗ |
✗ |
源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。 |
|
修改表注释 |
✗ |
✗ |
源端对表注释的修改不会同步。创建表时携带的表注释会被同步。 |
Batch 模式下(sink.enable-batch-mode: true),ALTER TABLE 类型的 Schema 变更(添加列、删除列、重命名列、列类型变更)会等待 Schema 变更完成后再继续处理数据,超时时间通过 schema.evolution.timeout 配置。SelectDB 底层基于 Apache Doris 引擎。
MaxCompute Sink
|
变更事件 |
LENIENT |
EVOLVE |
说明 |
|
添加列 |
✓ |
✓ |
自动在结果表中添加对应列。 |
|
删除列 |
✓ |
✓ |
在结果表中删除该列。 |
|
重命名列 |
✓ |
✓ |
在结果表中将原有列重命名。 |
|
列类型变更 |
✓ |
✓ |
在结果表中变更对应列的数据类型。 |
|
NOT NULL 转 NULLABLE |
✓ |
✓ |
将列约束从 NOT NULL 放宽为 NULLABLE 会被同步到目标端。 |
|
NULLABLE 转 NOT NULL |
✗ |
✗ |
框架层禁止将 NULLABLE 约束收紧,该变更不会生成事件。 |
|
创建表 |
✓ |
✓ |
在目标端自动创建对应表。表已存在时校验 Schema 和主键一致性,不一致则抛出异常。 |
|
删除表 |
✓ |
✓ |
在目标端删除该表。 |
|
清空表 |
✓ |
✓ |
清空目标端表的数据。 |
|
修改列注释 |
✗ |
✗ |
源端对已有列的注释修改不会同步。创建表和添加列时携带的注释会被同步。 |
|
修改表注释 |
✗ |
✗ |
源端对表注释的修改不会同步。创建表时携带的表注释会被同步。 |
Kafka Sink
|
变更事件 |
LENIENT |
EVOLVE |
说明 |
|
创建表 |
✓ |
✓ |
在 Kafka 中自动创建对应的 Topic(Upsert 模式下创建 Compacted Topic)。 |
|
添加列 |
— |
— |
Kafka 不维护 Schema,事件被静默忽略。 |
|
删除列 |
— |
— |
Kafka 不维护 Schema,事件被静默忽略。 |
|
重命名列 |
— |
— |
Kafka 不维护 Schema,事件被静默忽略。 |
|
列类型变更 |
— |
— |
Kafka 不维护 Schema,事件被静默忽略。 |
|
删除表 |
— |
— |
事件被静默忽略。 |
|
清空表 |
— |
— |
事件被静默忽略。 |
|
修改列注释 |
— |
— |
Kafka 不维护 Schema。 |
|
修改表注释 |
— |
— |
Kafka 不维护 Schema。 |
Kafka 作为消息队列不维护表的 Schema 结构,Schema 变更事件会作为消息的一部分发送到下游,但不会在 Kafka 端执行实际的结构变更操作。