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

2014-11-24 18:50:43 · 作者: · 浏览: 0

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>





里面包括






……



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。