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 特定的表级设置,用于确定在发生UPDATE
和DELETE
事件时可用于逻辑解码的信息量。
要显示表格所有列的先前值,请将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