9.3 WAL段文件的内部布局

一个WAL段文件大小默认为16MB,并在内部划分为大小为8192字节(8KB)的页面。第一个页包含了由XLogLongPageHeaderData定义的首部数据,其他的页包含了由XLogPageHeaderData定义的首部数据。每页在首部数据之后,紧接着就是以降序 写入的XLOG记录,如图9.7所示。

图9.7 WAL段文件内部布局图9.7 WAL段文件内部布局

XLogLongPageHeaderDataXLogPageHeaderData结构定义在 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版本改变了数据格式)