PostgreSQL的存储系统二:REDOLOG文件存储结构


Pg XLOG文件(常说的REDOLOG)名字的命名方法是在XLogFileName宏里定义的,分别由时间线ID、日志ID、段ID的八位16进制数依次构成。例如00000001000000010000008F。

#define XLogFileName(fname,tli, log, seg)    \

snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli, log, seg)

不同的段ID对应不同的物理XLOG日志文件,日志ID是逻辑概念,有多个物理XLOG日志文件组成。

Pg XLOG文件(常说的REDOLOG)的大小初始值是在configure.in和configure文件里设置的,默认大小是16M。大小设置形式如下

wal_segsize=16

XLOG_SEG_SIZE (${wal_segsize} * 1024 * 1024)=16M

这个XLOG_SEG_SIZE是XLOG日志文件的段大小,就是一个物理的日志文件的大小。一个逻辑的XLOG日志文件大小是4Gb。

 

Pg XLOG文件的存储格式大致如下:

<PageHeaderData>

<XLogRecord>

<rmgr-specific data>

<BkpBlock>

<XLogRecData>里面包括<CheckPoint>等

<BkpBlock>

<XLogRecData>

<BkpBlock>

<XLogRecData>

……

 

1

先看<PageHeaderData>,这个根据不同情况对应XLogLongPageHeaderDataXLogPageHeaderData结构。XLOG文件头用XLogLongPageHeaderData结构和一些合适场合,XLogPageHeaderData用在文件里的页面头。结构XLogLongPageHeaderData的第一个成员是结构XLogPageHeaderData。下面是这两个结构定义:

 

typedefstruct XLogLongPageHeaderData

{

    XLogPageHeaderDatastd;     /*页头结构*/

    uint64     xlp_sysid;    /* 控制文件pg_control里的系统标识符*/

    uint32     xlp_seg_size; /* XLOG文件大小 */

    uint32     xlp_xlog_blcksz/* XLOG文件页面大小 */

} XLogLongPageHeaderData;

 

XLOG文件里的页面头结构

typedefstruct XLogPageHeaderData

{

    uint16     xlp_magic;    /* WAL版本指示器 */

    uint16     xlp_info;     /* flag bits, see below */

    TimeLineIDxlp_tli;      /* 本页第一个记录的时间线*/

    XLogRecPtrxlp_pageaddr; /* 本页XLOG位置*/

} XLogPageHeaderData;

    XLOG文件里的页面头结构XLogPageHeaderData的成员xlp_magic表示WAL版本号。成员xlp_tli表示本页第一个记录的时间线,成员xlp_pageaddr表示本页的XLOG位置。成员xlp_info表示紧跟页头的记录是否是跨页记录的一部分,或者该页头结构XLogPageHeaderData是否在文件头结构XLogLongPageHeaderData里。其值定义见下面:

当记录跨页时,在后面的页头里设置标志

#defineXLP_FIRST_IS_CONTRECORD    0x0001

这个指明是长页头(多用于文件第一页)

#define XLP_LONG_HEADER            0x0002

在xlp_info中定义的所有标志位(用于头的有效性检查)

#define XLP_ALL_FLAGS              0x0003

如果成员xlp_info的值是XLP_FIRST_IS_CONTRECORD,表示页头后面跟的是一个跨页结构的一部分。

XLOG文件头结构XLogLongPageHeaderData的成员xlp_seg_size表示XLOG文件大小,默认是16M。在configure.in和configure文件里设置形式如下

wal_segsize=16

XLOG_SEG_SIZE (${wal_segsize} * 1024 * 1024)=16M

成员xlp_xlog_blcksz表示文件里的页面大小,默认是8k。

  • 1
  • 2
  • 3
  • 下一页

相关内容