Debezium 新记录状态提取 SMT 在删除的情况下无法正常工作



我正在尝试使用以下配置应用Debezium的New Record State Extraction SMT

"transforms": "unwrap",
"transforms.unwrap.type": "io.debezium.transforms.ExtractNewRecordState",
"transforms.unwrap.drop.tombstones": true,
"transforms.unwrap.delete.handling.mode": "rewrite",
"transforms.unwrap.add.fields": "db,schema,table,txId,ts_ms"

对于INSERTUPDATE操作,我按预期获得消息,但对于DELETE,我获得以下作为有效载荷:

"payload": {
"id": 2,
"first_name": "",
"last_name": "",
"__db": "postgres",
"__schema": "schema1",
"__table": "user_details",
"__txId": 5145,
"__ts_ms": 1638760801510,
"__deleted": "true"
}

正如您在上面看到的,first_namelast_name字段都有空值,尽管我删除的记录中这两个字段都有非空值。作为这两个字段的值,我希望看到的是它们在删除时的值,如未应用New Record State Extraction SMT时debezium的before有效载荷块中所示。

除了PK之外的所有列的值为空的原因与New Record State Extraction SMT根本无关。对于postgres,有一个REPLICA IDENTITY表级参数,可用于控制写入WAL的信息,以识别正在删除或更新的元组数据。

此参数有4种模式:

  • 默认
  • 使用索引
  • 已满
  • 什么都没有

DEFAULT的情况下,旧元组数据仅使用表的主键来标识。不属于主键的列不会写入其旧值。

FULL的情况下,旧元组的所有列值始终正确地写入WAL。因此,对目标表执行以下命令将使旧记录值正确填充在debezium消息中:

ALTER TABLE some_table REPLICA IDENTITY FULL;

注意!!FULL是最冗长的模式,也是最耗费资源的模式。要小心使用它,尤其是对于更新频繁的表。

最新更新