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

第 65 章. 通用 WAL 记录

虽然所有内置 WAL 日志模块都有自己的 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 记录工具时,请注意以下几点