我一直在阅读Postgres的逻辑复制,我注意到一些有点令人不安的事情。In the documentation,它提到它提供的日志消息包括事务消息,如开始,提交,* 和回滚!*
我觉得这有点无意义。如果我尝试运行ChangeDataCapture,我不会关心事务,尤其是那些回滚的事务。根据定义,这不是 * 改变数据 *,因为它最终没有改变任何东西。
有没有办法从Postgres获得一个干净的CDC流,它会告诉我数据库的变化,并忽略任何回滚的事务?
我一直在阅读Postgres的逻辑复制,我注意到一些有点令人不安的事情。In the documentation,它提到它提供的日志消息包括事务消息,如开始,提交,* 和回滚!*
我觉得这有点无意义。如果我尝试运行ChangeDataCapture,我不会关心事务,尤其是那些回滚的事务。根据定义,这不是 * 改变数据 *,因为它最终没有改变任何东西。
有没有办法从Postgres获得一个干净的CDC流,它会告诉我数据库的变化,并忽略任何回滚的事务?
1条答案
按热度按时间yfwxisqw1#
The documentation说:
基本输出插件回调(例如
begin_cb
、change_cb
、commit_cb
和message_cb
)仅在事务实际提交时调用。更改仍然从事务日志中解码,但仅在提交时传递给输出插件(如果事务中止,则丢弃)。这意味着,虽然解码是递增的,并且可能会溢出到磁盘以控制内存使用,但所有解码的更改都必须在事务最终提交时(或者更准确地说,当提交从事务日志中解码时)传输。根据事务的大小和网络带宽,传输时间可能会显著增加应用延迟。
为了减少由大型事务引起的应用延迟,输出插件可以提供额外的回调以支持进行中事务的增量流。有多个必需的流回调(
stream_start_cb
,stream_stop_cb
,stream_abort_cb
,stream_commit_cb
和stream_change_cb
)和两个可选的回调(stream_message_cb
和stream_truncate_cb
)。此外,如果要支持两阶段命令的流式传输,则必须提供额外的回调。(详见Section 49.10)。因此,行为取决于您正在使用的逻辑解码插件。使用基本功能,您将永远不会看到未提交的更改。但要注意:在这种情况下,长时间运行的事务可能会破坏性能。
如果您使用的是
pgoutput
,START_REPLICATION
允许您指定选项streaming on
来流式处理正在进行的事务。如果你不指定它(或者将它设置为off
),你将永远不会看到未提交的数据。