PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

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 记录中应包含 完整页面镜像而非增量更新。通常当页面是新建的或已被完全重写时,才设置 该标志。如果 WAL 日志化的操作需要修改多个页面, GenericXLogRegisterBuffer 可以被多次调用。

  3. 对上一步中获得的页面镜像应用修改。

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

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

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