是否有可能在 postgreSQL 逻辑复制插件中获取当前的 64 位 transactionId(带有纪元)

Is it possible to get the current 64 bit transactionId (with the epoch) in a postgreSQL logical replication plugin

我正在构建一个通过逻辑解码输出插件使用 Postgres WAL 的变更捕获系统。

在回调中很容易访问当前的 transactionId (https://doxygen.postgresql.org/structReorderBufferTXN.html#ad3ff4a8f320f2ec21e3e07688d29c741),但这是 32 位的,可以在 4B 提交后回绕,因此它作为逻辑计数器不可靠。

Postgres 内部维护一个 64 位的 transactionID,它不会环绕 (select txid_current()) : https://www.postgresql.org/docs/9.4/functions-info.html#FUNCTIONS-TXID-SNAPSHOT

https://github.com/postgres/postgres/blob/3412030205211079f9b0510e2244083e4ee7b15a/src/backend/access/transam/xact.c#L473-L488

是否可以从逻辑解码插件访问此 ID?如果不是,原因是什么?

谢谢

你有两个选择:

  1. 您使用OidFunctionCall0调用SQL函数txid_current()

  2. 您从 txid_currentload_xid_epochconvert_xidsrc/backend/utils/adt/txid.c 复制代码。

第二个选项会更快,但你必须复制代码。