使用Debezium与Kafka Connect时PostgreSQL删除事件Payload值为NULL
Debezium捕获PostgreSQL删除事件时payload为NULL的解决办法
使用Debezium结合Kafka Connect同步PostgreSQL数据变更时,CREATE、UPDATE事件均能正常生成,但DELETE事件的message.value字段为NULL,典型事件内容如下:
{ topic: 'omnichannel.public.Department', partition: 0, message: { magicByte: 2, attributes: 0, timestamp: '1668117212311', offset: '12', key: Buffer(272) [Uint8Array] [ 123, 34, 115, 99, 104, 101, 109, 97, 34, 58, 123, 34, 116, 121, 112, 101, 34, 58, 34, 115, 116, 114, 117, 99, 116, 34, 44, 34, 102, 105, 101, 108, 100, 115, 34, 58, 91, 123, 34, 116, 121, 112, 101, 34, 58, 34, 115, 116, 114, 105, 110, 103, 34, 44, 34, 111, 112, 116, 105, 111, 110, 97, 108, 34, 58, 102, 97, 108, 115, 101, 44, 34, 102, 105, 101, 108, 100, 34, 58, 34, 110, 97, 109, 101, 115, 112, 97, 99, 101, 73, 100, 34, 125, 44, 123, 34, 116, 121, 112, 101, ... 172 more items ], value: null, headers: {}, isControlRecord: false, batchContext: { firstOffset: '11', firstTimestamp: '1668117212311', partitionLeaderEpoch: 0, inTransaction: false, isControlBatch: false, lastOffsetDelta: 1, producerId: '-1', producerEpoch: -1, firstSequence: -1, maxTimestamp: '1668117212311', timestampType: 0, magicByte: 2 } }, heartbeat: [Function: heartbeat], pause: [Function: pause] }
解决步骤:
调整Debezium连接器的
delete.handling.mode配置
默认该参数为none,会导致DELETE事件的value字段为NULL。将其设置为rewrite后,Debezium会把删除前的记录数据存入payload的before字段中,确保事件包含完整的删除信息。确认PostgreSQL的
wal_level设置为logical
逻辑复制需要PostgreSQL开启逻辑日志,修改postgresql.conf中的wal_level = logical,重启数据库生效。若wal_level为minimal或replica,Debezium无法捕获删除前的完整数据。确保同步表存在主键
Debezium依赖主键追踪删除操作,无主键的表无法正确生成包含有效payload的DELETE事件。为同步表添加主键后重新部署连接器。验证连接器的快照配置
若为新部署的连接器,确认snapshot.mode设置为initial或schema_only,确保初始同步时表结构和主键元数据被正确捕获。
内容的提问来源于stack exchange,提问作者omidh
相关产品推荐
相关产品推荐

