postgresql 有没有办法从Postgres获得一个“干净”的CDC日志?

kx5bkwkv  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(126)

我一直在阅读Postgres的逻辑复制,我注意到一些有点令人不安的事情。In the documentation,它提到它提供的日志消息包括事务消息,如开始,提交,* 和回滚!*
我觉得这有点无意义。如果我尝试运行ChangeDataCapture,我不会关心事务,尤其是那些回滚的事务。根据定义,这不是 * 改变数据 *,因为它最终没有改变任何东西。
有没有办法从Postgres获得一个干净的CDC流,它会告诉我数据库的变化,并忽略任何回滚的事务?

yfwxisqw

yfwxisqw1#

The documentation说:
基本输出插件回调(例如begin_cbchange_cbcommit_cbmessage_cb)仅在事务实际提交时调用。更改仍然从事务日志中解码,但仅在提交时传递给输出插件(如果事务中止,则丢弃)。
这意味着,虽然解码是递增的,并且可能会溢出到磁盘以控制内存使用,但所有解码的更改都必须在事务最终提交时(或者更准确地说,当提交从事务日志中解码时)传输。根据事务的大小和网络带宽,传输时间可能会显著增加应用延迟。
为了减少由大型事务引起的应用延迟,输出插件可以提供额外的回调以支持进行中事务的增量流。有多个必需的流回调(stream_start_cbstream_stop_cbstream_abort_cbstream_commit_cbstream_change_cb)和两个可选的回调(stream_message_cbstream_truncate_cb)。此外,如果要支持两阶段命令的流式传输,则必须提供额外的回调。(详见Section 49.10)。
因此,行为取决于您正在使用的逻辑解码插件。使用基本功能,您将永远不会看到未提交的更改。但要注意:在这种情况下,长时间运行的事务可能会破坏性能。
如果您使用的是pgoutputSTART_REPLICATION允许您指定选项streaming on来流式处理正在进行的事务。如果你不指定它(或者将它设置为off),你将永远不会看到未提交的数据。

相关问题