PostgreSQL WAL解析:构建WAL记录准备
发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,以heap_insert为例,简述WAL的插入过程。在构建WAL日志记录的过程中主要涉及2个数据变量:static XLogRecData *rdatas数组和static registered_bu
千家信息网最后更新 2025年11月11日PostgreSQL WAL解析:构建WAL记录准备
以heap_insert为例,简述WAL的插入过程。
在构建WAL日志记录的过程中主要涉及2个数据变量:static XLogRecData *rdatas数组和static registered_buffer *registered_buffers数组。这两个数组分别用来保存WAL数据和管理rdatas链表。
主要涉及3个重要的函数:XLogRegisterData、XLogRegisterBuffer和XLogRegisterBufData。这三个函数的作用分别是将WAL记录的特殊结构体数据注册到WAL,比如heap_insert中的xl_heap_insert结构体;将涉及到的buf注册到wal记录,比如heap_insert中page页赋予regbuf->page;将元组内容注册到WAL记录,比如insert语句的元组数据等。
下面首先介绍相关数据结构。
1、数据结构
HeapTupleData
typedef struct HeapTupleData{ uint32 t_len; /* length of *t_data */ ItemPointerData t_self; /* SelfItemPointer */ Oid t_tableOid; /* table the tuple came from */ HeapTupleHeader t_data; /* -> tuple header and data */} HeapTupleData;xl_heap_header
/* * We don't store the whole fixed part (HeapTupleHeaderData) of an inserted * or updated tuple in WAL; we can save a few bytes by reconstructing the * fields that are available elsewhere in the WAL record, or perhaps just * plain needn't be reconstructed. These are the fields we must store. * NOTE: t_hoff could be recomputed, but we may as well store it because * it will come for free due to alignment considerations. */typedef struct xl_heap_header{ uint16 t_infomask2; uint16 t_infomask; uint8 t_hoff;} xl_heap_header;xl_heap_insert
/* This is what we need to know about insert */typedef struct xl_heap_insert{ OffsetNumber offnum; /* inserted tuple's offset */ uint8 flags; /* xl_heap_header & TUPLE DATA in backup block 0 */} xl_heap_insert;XLogRecData
/* * The functions in xloginsert.c construct a chain of XLogRecData structs * to represent the final WAL record. */typedef struct XLogRecData{ struct XLogRecData *next; /* next struct in chain, or NULL */ char *data; /* start of rmgr data to include */ uint32 len; /* length of rmgr data to include */} XLogRecData;registered_buffer
/* * For each block reference registered with XLogRegisterBuffer, we fill in * a registered_buffer struct. */typedef struct{bool in_use; /* is this slot in use? */uint8 flags; /* REGBUF_* flags */RelFileNode rnode; /* identifies the relation and block */ForkNumber forkno;BlockNumber block;Page page; /* page content */uint32 rdata_len; /* total length of data in rdata chain */XLogRecData *rdata_head; /* head of the chain of data registered with this block */XLogRecData *rdata_tail; /* last entry in the chain, or &rdata_head if empty */XLogRecData bkp_rdatas[2]; /* temporary rdatas used to hold references to * backup block data in XLogRecordAssemble() *//* buffer to store a compressed version of backup block image */char compressed_page[PGLZ_MAX_BLCKSZ];} registered_buffer;2、heap_insert涉及WAL的流程

第一步中,得到如下结果,mainrdata_last保存rdata[0],存储的是xl_heap_insert结构:
第二步,得到如下结果,取registered_buffer[0],其rdata_head->next指向rdata[1],存储tuple记录的头信息:
接着进入第三步,取rdata[2],将其放到rdata[1]->next中,即加入registered_buffers[0]的rdata_head链表中,存储TUPLE值:
以上是构建WAL记录的准备阶段,下一节介绍WAL的构建及其通用结构。
数据
结构
数组
存储
函数
数据结构
结果
过程
准备
特殊
重要
三个
两个
作用
信息
内容
变量
指向
日志
流程
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
游戏服务器 引擎
oracle数据库 破解
电力网络安全告警
广东广电网络u点家庭服务器电话
花雨庭服务器真的有用吗
json数据数据库
网络安全防控机制
新能源并网发电软件开发上市公司
bvd数据库下载格式有哪些
惠州教育软件开发咨询
河南云鸣网络技术有限公司
专科文科可以学计算机网络技术吗
梦幻西游手游方块世界服务器
内蒙古网络安全问题
如何判断高防服务器
交通大学网络安全技术研究院
海口网络技术优化方案
网络安全2016年题库
沃奕软件开发有限公司怎么样
大专从事网络安全
为什么服务器32g内存用完了
开源服务器监控工具
网络安全传播联盟成立
青少年网络安全漫画作品
服务器域名一般申请多久才能使用
数据库查0的md5
下载软件时显示数据库异常
博兴企业管理软件开发定制
大数据商务软件开发什么意思
肇庆市职校专科计算机网络技术