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

64.1. 通用 WAL 记录 #

虽然所有内置的、会生成 WAL 记录的模块都有各自的 WAL 记录类型,但也有一种通用 WAL 记录类型,可以用通用方式描述对页面的更改。

Note

通用 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 记录中包含整页镜像,而不是增量更新。通常在页面是新的,或者已经被完全重写时,会设置该标志。如果该操作需要修改多个页面,则可以重复调用GenericXLogRegisterBuffer

  3. 对上一步得到的页面镜像施加修改。

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

在上述任意步骤之间,都可以调用GenericXLogAbort(state)取消 WAL 记录的构造。这会丢弃对页面镜像副本所做的全部更改。

在使用通用 WAL 记录功能时请注意以下几点: