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

63.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 记录功能时请注意以下几点