# 第63章。通用沃尔记录

尽管所有内置的WAL日志模块都有自己的WAL记录类型,但也有一种通用的WAL记录类型,它以通用的方式描述对页面的更改。这对于提供自定义访问方法的扩展非常有用,因为它们无法注册自己的WAL redo例程。

中定义了用于构建通用WAL记录的API访问/通用日志。H并于访问/交易/通用日志。C.

要使用通用WAL记录功能执行WAL记录的数据更新,请执行以下步骤:

  1. state=GenericXLogStart(关系)-开始为给定关系构建通用WAL记录。

  2. page=GenericXLogRegisterBuffer(状态、缓冲区、标志)-在当前通用WAL记录中注册要修改的缓冲区。这个函数返回一个指向缓冲区页面临时副本的指针,在那里应该进行修改。(不要直接修改缓冲区的内容。)第三个参数是适用于该操作的标志位掩码。目前唯一这样的旗帜是通用_XLOG_完整_图像,这表明WAL记录中应包含完整的页面图像,而不是增量更新。通常,如果页面是新的或已完全重写,则会设置此标志。GenericXLogRegisterBuffer如果WAL记录的操作需要修改多个页面,则可以重复。

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

  4. GenericXLogFinish(州)-将更改应用于缓冲区并发出通用WAL记录。

    可以通过调用通用XLOgabort(州)。这将放弃对页面图像副本的所有更改。

    使用通用WAL记录设施时,请注意以下几点:

  • 不允许直接修改缓冲区!所有修改必须以从以下机构获得的副本进行:GenericXLogRegisterBuffer()换句话说,生成通用WAL记录的代码永远不应该调用BufferGetPage()为了自己。然而,在适当的时间锁定/解锁缓冲区仍然是呼叫方的责任。从之前开始,每个目标缓冲区都必须保持独占锁GenericXLogRegisterBuffer()直到之后GenericXLogFinish().

  • 缓冲区的注册(步骤2)和页面图像的修改(步骤3)可以自由混合,也就是说,这两个步骤可以按任意顺序重复。请记住,缓冲区的注册顺序应与重播期间在缓冲区上获得锁的顺序相同。

  • 可为通用WAL记录注册的最大缓冲区数为MAX_通用_XLOG_页面。如果超过此限制,将引发错误。

  • Generic WAL假设要修改的页面具有标准布局,尤其是它们之间没有有用的数据pd_较低pd_upper.

  • 由于您正在修改缓冲页的副本,GenericXLogStart()不会启动关键部分。因此,您可以安全地在GenericXLogStart()GenericXLogFinish().唯一实际的关键部分在内部GenericXLogFinish().不用担心打电话通用XLOgabort()在错误退出期间,也可以。

  • GenericXLogFinish()负责将缓冲区标记为脏并设置其LSN。您不需要明确地这样做。

  • 对于未标记的关系,除了没有发出实际的WAL记录外,其他一切都是一样的。因此,通常不需要对未标记的关系进行任何显式检查。

  • 通用的WAL redo函数将按照缓冲区注册时的顺序获取缓冲区的独占锁。在重做所有更改后,锁将以相同的顺序释放。

  • 如果通用_XLOG_完整_图像如果未为注册缓冲区指定,则通用WAL记录包含新旧页面图像之间的增量。这个增量基于字节对字节的比较。对于在页面中移动数据的情况来说,这不是很紧凑,将来可能会有所改进。