Postgres Debezium 不发布记录的先前状态

Posted

技术标签:

【中文标题】Postgres Debezium 不发布记录的先前状态【英文标题】:Postgres Debezium does not publish the previous state of a record 【发布时间】:2020-05-05 01:24:33 【问题描述】:

我成功安装了Postgres Debezium CDC。现在,我能够捕捉到数据库发生的所有变化。但问题是“之前”字段始终为空。因此,如果我插入一条记录 (id = 1, name = Bill),然后我会从 Kafka 获取这些数据:

'payload': 'before': None, 'after': 'id': 1, 'name': 'Bill', ...

但如果我像这样更新记录:

UPDATE mytable set name = 'Bob' WHERE id = 1

我从卡夫卡那里得到这个:

'payload': 'before': None, 'after': 'id': 1, 'name': 'Bob', ...

这就是我配置连接器的方式:

curl -X POST  localhost:8083/connectors/ \
  -H "Accept:application/json" -H "Content-Type:application/json" -d \
'
    "name": "test-connector",
    "config": 
         "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
         "tasks.max": "1",
         "plugin.name": "pgoutput",
         "database.hostname": "postgres",
         "database.port": "5432",
         "database.user": "postgres",
         "database.password": "postgres",
         "database.dbname" : "test",
         "database.server.name": "postgres",
         "database.whitelist": "public.mytable",
         "database.history.kafka.bootstrap.servers": "kafka:9092",
         "database.history.kafka.topic": "public.topic"
    
'

这有什么问题,我该如何解决?

【问题讨论】:

如何从 Kafka 获取消息? @Iskuskov Alexander。我尝试了两种语言的消费者——php 和 Python。他们都从 Kafka 获取消息并打印他们的正文,在这两种情况下我都看到 before 属性是 None (在 Python 中)或 null (在 PHP 中)。 你是从最早的偏移量开始消费的吗?您确定消息'payload': 'before': None, 'after': 'id': 1, 'name': 'Bob' 是关于更新事件而不是关于您再次阅读的插入事件吗?请在消息中显示更多数据 @Iskuskov Alexander。我从一开始就在消费。例如,在 PHP 中,我会这样做 $topic->consumeStart(0, RD_KAFKA_OFFSET_BEGINNING);。而且我完全确定,带有name: Bob 的消息是一个更新事件,因为当我手动执行UPDATE 语句时它会弹出。 另外,id字段是串行的,所以id = 1不可能有两条记录 【参考方案1】:

before 是一个可选字段,如果存在,则包含事件发生之前行的状态。该字段是否可用在很大程度上取决于每个表的REPLICA IDENTITY 设置。

REPLICA IDENTITY 是 PostgreSQL 特定的表级设置,用于确定在发生UPDATEDELETE 事件时可用于逻辑解码的信息量。

要显示表格所有列的先前值,请将REPLICA IDENTITY级别设置为FULL

ALTER TABLE public.mytable REPLICA IDENTITY FULL;

在Debezium docs查看更多详情。

【讨论】:

以上是关于Postgres Debezium 不发布记录的先前状态的主要内容,如果未能解决你的问题,请参考以下文章

debezium 是不是支持捕获 postgres 模式更改事件?

debezium postgres 找不到`io/debezium/util/IoUtil`

Debezium 导致 Postgres 耗尽 RDS 上的磁盘空间

Kafka Connect Debezium postgres

Kafka Connect:使用 debezium 从 Postgres 流式传输更改到主题

需要 Debezium 连接器中用于 postgres 插入事件的主键信息