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作业失败。建议搭配 |
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 端执行实际的结构变更操作。