我正在尝试使用以下配置应用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"
对于INSERT
和UPDATE
操作,我按预期获得消息,但对于DELETE
,我获得以下作为有效载荷:
"payload": {
"id": 2,
"first_name": "",
"last_name": "",
"__db": "postgres",
"__schema": "schema1",
"__table": "user_details",
"__txId": 5145,
"__ts_ms": 1638760801510,
"__deleted": "true"
}
正如您在上面看到的,first_name
和last_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
是最冗长的模式,也是最耗费资源的模式。要小心使用它,尤其是对于更新频繁的表。