前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PG修改数据页页头等信息时是否会产生WAL?

PG修改数据页页头等信息时是否会产生WAL?

作者头像
yzsDBA
发布2021-04-26 14:52:26
3150
发布2021-04-26 14:52:26
举报

研究PG WAL机制时想到个问题:进行插入、删除、更新等操作时,需要通过WAL来保证其一致性,以及复制构建高可用环境,当修改数据页页头等元数据信息时是否会产生WAL?

凡是产生WAL的地方都会有函数进行预先判断:RelationNeedsWAL。例如插入一个tuple时:heap_insert函数。

代码语言:javascript
复制
if (!(options & HEAP_INSERT_SKIP_WAL) && RelationNeedsWAL(relation)){
    ...
    recptr = XLogInsert(RM_HEAP_ID, info);
    PageSetLSN(page, recptr);
}

页头结构:

代码语言:javascript
复制
typedef struct PageHeaderData
{
  /* XXX LSN is member of *any* block, not only page-organized ones */
  PageXLogRecPtr pd_lsn;    /* LSN: next byte after last byte of xlog
                 * record for last change to this page */
  uint16    pd_checksum;  /* checksum */
  uint16    pd_flags;    /* flag bits, see below */
  LocationIndex pd_lower;    /* offset to start of free space */
  LocationIndex pd_upper;    /* offset to end of free space */
  LocationIndex pd_special;  /* offset to start of special space */
  uint16    pd_pagesize_version;
  TransactionId pd_prune_xid; /* oldest prunable XID, or zero if none */
  ItemIdData  pd_linp[FLEXIBLE_ARRAY_MEMBER]; /* line pointer array */
} PageHeaderData;

插入的话肯定会修改页头信息的。仔细看这段代码,却没找到修改页头时产生WAL的地方。甚至,修改页头的LSN字段pg_lsn时PageSetLSN,该函数在日志拷贝到WAL BUFFER后才进行修改:XLogInsert。而修改lsn的代码也不涉及WAL日志的生成:

代码语言:javascript
复制
#define PageXLogRecPtrSet(ptr, lsn) \
  ((ptr).xlogid = (uint32) ((lsn) >> 32), (ptr).xrecoff = (uint32) (lsn))

heap_insert函数后续也没有涉及WAL操作的代码了。难道修改数据页页头等信息时不产生WAL?

这样的话,进行复制时,是否会有问题,主机页头中lsn信息未同步到备机,对其回放会产生问题吧。

这个疑惑后续深入研究,是否他会通过现有WAL日志解决,而确实不需要产生WAL。大家了解的话,请教下,希望能够得到帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档