# 第63章。通用沃尔记录
尽管所有内置的WAL日志模块都有自己的WAL记录类型,但也有一种通用的WAL记录类型,它以通用的方式描述对页面的更改。这对于提供自定义访问方法的扩展非常有用,因为它们无法注册自己的WAL redo例程。
中定义了用于构建通用WAL记录的API访问/通用日志。H
并于访问/交易/通用日志。C
.
要使用通用WAL记录功能执行WAL记录的数据更新,请执行以下步骤:
state=GenericXLogStart(关系)
-开始为给定关系构建通用WAL记录。page=GenericXLogRegisterBuffer(状态、缓冲区、标志)
-在当前通用WAL记录中注册要修改的缓冲区。这个函数返回一个指向缓冲区页面临时副本的指针,在那里应该进行修改。(不要直接修改缓冲区的内容。)第三个参数是适用于该操作的标志位掩码。目前唯一这样的旗帜是通用_XLOG_完整_图像
,这表明WAL记录中应包含完整的页面图像,而不是增量更新。通常,如果页面是新的或已完全重写,则会设置此标志。GenericXLogRegisterBuffer
如果WAL记录的操作需要修改多个页面,则可以重复。对上一步中获得的页面图像应用修改。
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记录包含新旧页面图像之间的增量。这个增量基于字节对字节的比较。对于在页面中移动数据的情况来说,这不是很紧凑,将来可能会有所改进。