postgresql集群方案hot standby初级测试(四)——xlog详细解释hea
xlog日志header部分详解 前些天,做了些实验,也确实能够证明手动同步xlog数据是可行性的,为了更深入的研究,我觉得研究下xlog的源码,并且打开xlog的二进制文件,读一读它里面的内容。
本文来自:http://blog.csdn.net/lengzijian/article/details/7836402
首先来看下xlog日志的结构图:
从上到下观察下: xlog日志文件命名: 文件名 = 时间线 + 日志文件号(logid) + 段号(segmented) 分为三部分,每个部分由8个16进制字符组成,时间线由1开始,日志文件号和段号由0开始,所以在系统中第一个事务日志文件名为:000000010000000000000000
一个xlog文件日志备有256个段组成,每个段大小为16M,当最近的文件名有000000010000000000000000变为000000010000000100000000时,实际增加了256个段文件,但是逻辑上只增加了一个xlog日志文件。
每一个段文件又分为很多页面,每个一面的大小为一个块的大小: include/pg_config.h: #defineXLOG_BLCKSZ 8192 //块大小 //页面个数 = 16M / 8192bit = 2048
对于每一个日志页面,需要在器头部写一个头部信息XLogPageHeaderData,数据结构如下:
其中标志位xlp_info只使用最低两位“01”或者“10”或者11: “01”表明该页的第一个XLOG记录着上一个页的最后一个XLOG记录,这样的记录会接在一个XLogContRecord结构体之后; “10”表明该页的头部是一个长头部,既该页是XLOG段文件的首页;
这样头部标志位会有三种状态:
长头部结构体如下:
要注意的地方,对于一条很长的xlog日志,当页面没有足够的空间存储时,postgreseql允许把多余的数据存储到下一个页面,即同一条日志写到了两个文件档中。一种数据除外,头部数据是不允许存到两个页面当中的。 当出现一条日志存放到两个页面时,需要用XLogContRecord来记录该页除了本页面存储的内容外,剩余的存储数据信息:
使用xlogdump(之后做一篇详细介绍xlogdump的文章)工具来观察下页面头信息(也可以观察源码xlogdump.c文件的readXLogPage函数),之后详细讲解xlogdump用法: 打印信息如下:
函数方法为:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |