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

Debezium New Record State Extraction SMT doesn't work properly in case of DELETE

我正在尝试使用以下配置应用 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 字段都具有空值,尽管我删除的记录在这两个字段中都具有非空值。我希望看到这 2 个字段的值是它们在删除时的值,因为它显示在 debezium 的 before 有效负载块中,以防未应用 New Record State Extraction SMT

除主键外所有列均为空值的原因与New Record State Extraction SMT完全无关。对于postgres,有一个REPLICA IDENTITY table-level参数可以用来控制写入WAL的信息,用来识别正在被删除或更新的tuple数据

该参数有4种模式:

  • 默认
  • 使用索引索引
  • 已满
  • 没有

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

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

ALTER TABLE some_table REPLICA IDENTITY FULL;

注意!! FULL 是最冗长的,也是最 resource-consuming 模式。特别注意 heavily-updated tables.