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"
对于 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
字段都具有空值,尽管我删除的记录在这两个字段中都具有非空值。我希望看到这 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.
我正在尝试使用以下配置应用 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
字段都具有空值,尽管我删除的记录在这两个字段中都具有非空值。我希望看到这 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.