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