Redrock Postgres 搜索 英文
版本: 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17 / 18

64.1. 通用 WAL 记录 #

虽然所有内置的 WAL 日志记录模块都有自己的 WAL 记录类型,但还有一个通用的 WAL 记录类型,它以通用方式描述页面的更改。

注意

逻辑解码期间,通用 WAL 记录会被忽略。如果您的扩展需要逻辑解码,请考虑使用自定义 WAL 资源管理器。

用于构造通用 WAL 记录的 API 定义在 access/generic_xlog.h 中,实现在 access/transam/generic_xlog.c 中。

要使用通用 WAL 记录机制执行 WAL 日志记录的数据更新,请执行以下步骤:

  1. state = GenericXLogStart(relation) — 为给定的关系开始构造一个通用 WAL 记录。

  2. page = GenericXLogRegisterBuffer(state, buffer, flags) — 注册要在当前通用 WAL 记录中修改的缓冲区。此函数返回指向缓冲区页面临时副本的指针,修改应在此副本上进行。(请勿直接修改缓冲区内容。)第三个参数是一个适用于该操作的标志位掩码。目前唯一的标志是 GENERIC_XLOG_FULL_IMAGE,它指示 WAL 记录应包含完整页面映像而不是增量更新。通常,如果页面是新的或已完全重写,则会设置此标志。如果 WAL 日志记录的操作需要修改多个页面,则可以重复调用 GenericXLogRegisterBuffer

  3. 在上一阶段获得的页面映像上应用修改。

  4. GenericXLogFinish(state) — 将更改应用于缓冲区并发出通用 WAL 记录。

在上述任何步骤之间,都可以通过调用 GenericXLogAbort(state) 来取消 WAL 记录的构造。这将丢弃对页面映像副本的所有更改。

使用通用 WAL 记录机制时,请注意以下几点: