侵权投诉
搜索
更多>> 热门搜索:
订阅
纠错
加入自媒体

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

2021-04-19 11:05
yzsDBA
关注

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

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

if (!(options & HEAP_INSERT_SKIP_WAL) && RelationNeedsWAL(relation)){    ...    recptr = XLogInsert(RM_HEAP_ID, info);    PageSetLSN(page, recptr);}

       页头结构:

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日志的生成:

#define PageXLogRecPtrSet(ptr, lsn)   ((ptr).xlogid = (uint32) ((lsn) >> 32), (ptr).xrecoff = (uint32) (lsn))

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

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

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

声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

    文章纠错
    x
    *文字标题:
    *纠错内容:
    联系邮箱:
    *验 证 码:

    粤公网安备 44030502002758号