Postgresql - WAL Records

根据官方文档,我们看一下WAL。

虽然所有内置的WAL日志模块都有自己的WAL记录类型,但也有一个通用的WAL记录类型,它以通用的方式描述对页面的更改。这对于提供自定义访问方法的扩展是有用的,因为它们不能注册自己的WAL redo例程。
 WAL records 被定义在 access/generic_xlog.h,实施在 access/transam/generic_xlog.c.

执行WAL日志数据更新
1. state = GenericXLogStart(relation) 开始构造给定的关系的通用WAL记录。
2. page = GenericXLogRegisterBuffer(state, buffer, flags) 在当前通用的WAL记录中注册要修改的缓冲区。此函数返回指向缓冲区页的临时副本的指针,其中应进行修改。(不要直接修改缓冲区的内容。)第三个参数是适用于操作的标志位掩码。目前,只有这样的标志是GENERIC_XLOG_FULL_IMAGE,这表明应该在WAR记录中包含全页图像而不是增量更新。通常,如果该页是新的或已完全重写,则该标志将被设置。如果WAL日志记录操作需要修改多个页面,则可以重复GenericXLogRegisterBuffer。
3. 对前一步中获得的页面图像进行修改
4. GenericXLogFinish(state) 将更改应用于缓冲区并发出通用的WAL记录。

可以通过调用GenericXLogAbort(state)来取消任何上述步骤之间的WAR记录构造。这将放弃对页面图像副本的所有更改。

注意使用通用WAL记录时的以下几点:
1. 不允许对缓冲器进行直接修改!所有的修改都必须在从GenericXLogRegisterBuffer()获取的副本中完成。换句话说,使通用WAL记录的代码不应该为自己调用BufferGetPage()。但是,在适当的时候,锁定/解锁和锁定/解锁缓冲区仍然是调用者的责任。必须在GenericXLogRegisterBuffer()之前对每个目标缓冲区保持独占锁,直到GenericXLogFinish()之后。
2. 缓冲器的注册(步骤2)和页面图像的修改(步骤3)可以自由地混合,即,这两个步骤可以以任何顺序重复。请记住,缓冲器应该以相同的顺序注册,其中在重放期间要获得锁。
3. 可以为通用WAL记录注册的缓冲区的最大数量是MAX_GENERIC_XLOG_PAGES。如果超出此限制,将引发错误。
4. 通用WAL假定要修改的页面具有标准布局,特别是在pd_lower and pd_upper之间没有有用的数据。
5. 由于您正在修改缓冲页的副本,所以GenericXLogStart()不会启动关键部分。因此,可以安全地在GenericXLogStart()和GenericXLogFinish()之间进行内存分配、错误抛掷等。GenericXLogFinish()中只存在实际的临界段。在错误退出过程中,不必担心调用GenericXLogAbort()。
6. GenericXLogFinish()负责标记缓冲区脏并设置它们的LSN。
7. 对于未记录的relations,除了没有实际的WAL记录外,所有的工作都是相同的。因此,通常不需要对未记录的relations进行任何明确的检查。
8. 通用的WAL redo 函数将以与它们注册的顺序相同的顺序获取缓冲区的排他锁。重做所有更改之后,锁将以相同的顺序释放。
9. 如果GENERIC_XLOG_FULL_IMAGE没有被指定注册到buffer,则通用WAL记录包含旧页和新页图像之间的增量。这个增量是基于逐字节比较的。对于在页面内移动数据的情况来说,这并不十分紧凑,并且可能在将来得到改进。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值