一个WAL段文件大小默认为16MB,并在内部划分为大小为8192字节(8KB)的页面。第一个页包含了由XLogLongPageHeaderData
定义的首部数据,其他的页包含了由XLogPageHeaderData
定义的首部数据。每页在首部数据之后,紧接着就是以降序 写入的XLOG记录,如图9.7所示。
图9.7 WAL段文件内部布局
XLogLongPageHeaderData
与XLogPageHeaderData
结构定义在 src/include/access/xlog_internal.h
中。这两个结构的具体说明就不在此展开了,因为对于后续小节并非必需。
typedef struct XLogPageHeaderData
{
uint16 xlp_magic; /* 用于正确性检查的魔数 */
uint16 xlp_info; /* 标记位,详情见下 */
TimeLineID xlp_tli; /* 页面中第一条记录的时间线ID */
XLogRecPtr xlp_pageaddr; /* 当前页的XLOG地址 */
/* 当本页放不下一条完整记录时,我们会在下一页继续,xlp_rem_len存储了来自先前页面
* 记录剩余的字节数。注意xl_rem_len包含了备份区块的数据,也就是说它会在第一个首部跟踪
* xl_tot_len而不是xl_len。还要注意延续的数据不一定是对齐的。*/
uint32 xlp_rem_len; /* 记录所有剩余数据的长度 */
} XLogPageHeaderData;
typedef XLogPageHeaderData *XLogPageHeader;
/* 当设置了XLP_LONG_HEADER标记位时,我们将在页首部中存储额外的字段。
* (通常是在XLOG文件中的第一个页面中) 额外的字段用于确保文件的正确性。 */
typedef struct XLogLongPageHeaderData
{
XLogPageHeaderData std; /* 标准首部 */
uint64 xlp_sysid; /* 来自pg_control中的系统标识符 */
uint32 xlp_seg_size; /* 交叉校验 */
uint32 xlp_xlog_blcksz;/* 交叉校验 */
} XLogLongPageHeaderData;
下一节:一条XLOG记录由通用的首部部分与特定的数据部分构成。本章第一节描述了首部的结构,剩下两个节分别解释了9.5版本前后数据部分的结构。(9.5版本改变了数据格式)