PostgreSQL DBA(16) - WAL segment file内部结构

上节介绍了WAL的文件结构,PG把日志文件划分为N个大小为16M(默认值)的WAL segment file,本节就WAL segment file的内部结构作一简要概述。

一、WAL segment file内部结构

WAL segment file默认大小为16MB,其内部结构如下图所示:


WAL segment file内部结构

WAL segment file
WAL segment file内部划分为N个page(Block),每个page大小为8K,第一个page的header对应的数据结构为XLogLongPageHeaderData,其他page的header对应的数据结构是XLogPageHeaderData.在header后是N个XLOG Record.

XLOG Record
XLOG Record由两部分组成,第一部分固定大小,对应的结构体为XLogRecord;第二部分是XLOG Record data

XLOG Record data
XLOG Record data由以下几部分组成:
1.0..N个XLogRecordBlockHeader,每个XLogRecordBlockHeader对应一个block data;
注意:如设置了BKPBLOCK_HAS_IMAGE标记,则在XLogRecordBlockHeader结构体后跟XLogRecordBlockImageHeader结构体;如设置了BKPIMAGE_HAS_HOLE和 BKPIMAGE_IS_COMPRESSED则在XLogRecordBlockImageHeader后跟XLogRecordBlockCompressHeader结构体;
2.XLogRecordDataHeader[Short|Long]:如数据<256Bytes,则使用Short格式,否则使用Long格式;
3.block data:full-write-block数据,如启用了压缩,则压缩存储,相关元数据存储在XLogRecordBlockHeader中的XLogRecordBlockCompressHeader中.
4.main data:(tuple) data/checkpoint等日志数据.

二、样例说明

使用linux下的hexdump工具查看WAL文件中的内容,可以直观的感知上述内部结构
测试机的WAL segmengt file:

[xdb@localhost pg_wal]$ ll
total 32796
-rw-------. 1 xdb xdb 16777216 Dec 18 10:52 000000010000000100000042
...

XLogPageHeaderData
uint16 xlp_magic

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 0 -n 2
00000000  98 d0                                             |..|
00000002

magic value为0xD098.
注意:X86 CPU使用小端模式(Little-Endian),如数据占用超过1个字节,则高位字节在内存高位地址,低位字节在内存低位地址,写入到文件时直接从内存flush到磁盘上,磁盘文件上的字节顺序与内存保持一致.

uint16 xlp_info

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 2 -n 2 
00000002  07 00                                             |..|
00000004

xlp_info标志为0x0007,即XLP_FIRST_IS_CONTRECORD | XLP_LONG_HEADER | XLP_BKP_REMOVABLE
标明:
1.XLOG Record跨越page边界;
2.这个page的header是XLogLongPageHeaderData
3.从该页起始的backup blocks是可选的(不一定存在)

TimeLineID(uint32) xlp_tli

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 4 -n 4
00000004  01 00 00 00                                       |....|
00000008

TimeLineID为0x00000001,即十进制数值1

XLogRecPtr(uint64) xlp_pageaddr

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 8 -n 8
00000008  00 00 00 42 01 00 00 00                           |...B....|
00000010

XLog Record在事务日志指针(偏移)为0x00000001 42000000

uint32 xlp_rem_len

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 16 -n 4
00000010  0f 00 00 00                                       |....|
00000014

上一页空间不足以存储XLOG Record,该Record在本页继续存储占用的空间大小:0x0000000F

XLogLongPageHeaderData
XLogLongPageHeaderData的第一个域字段是XLogPageHeaderData,相关数据参见以上XLogPageHeaderData描述.
注意:XLogPageHeaderData结构体按最大基本类型对齐,会扩充为24Bytes(原为20Bytes),因此XLogLongPageHeaderData的内容从24开始起算.

uint64 xlp_sysid

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 24 -n 8
00000018  42 72 7f 55 41 76 ee 5b                           |Br.UAv.[|
00000020

系统标识码0x5BEE7641557F7242

[xdb@localhost ~]$ echo $((0x5BEE7641557F7242))
6624362124887945794

使用pg_controldata查看Database system identifier-->6624362124887945794

[xdb@localhost ~]$ pg_controldata
pg_control version number:            1100
Catalog version number:               201809051
Database system identifier:           6624362124887945794
...

uint32 xlp_seg_size

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 32 -n 4
00000020  00 00 00 01                                       |....|
00000024

值为0x01000000,即16M

[xdb@localhost ~]$ echo $((0x01000000))
16777216

uint32 xlp_xlog_blcksz

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 36 -n 4
00000024  00 20 00 00                                       |. ..|
00000028

值为0x00002000,即8K

[xdb@localhost ~]$ echo $((0x00002000))
8192

上一page XLOG Record的数据
由于空间不足,上一page的XLOG Record在本页继续存储占用的数据(xlp_rem_len=0x0F,补齐为16B)

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 40 -n 16
00000028  31 00 00 00 00 00 00 00  00 69 b8 40 25 00 00 00  |1........i.@%...|
00000038

XLogRecord
接下来是XLogRecord
uint32 xl_tot_len

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 56 -n 4
00000038  4f 00 00 00                                       |O...|
0000003c

XLOG Record长度为0x0000004F
TransactionId(uint32) xl_xid

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 60 -n 4
0000003c  6b 07 00 00                                       |k...|
00000040

事务ID为0x0000076B,即十进制的1899
XLogRecPtr(uint64) xl_prev

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 64 -n 8
00000040  c0 ff ff 41 01 00 00 00                           |...A....|
00000048

上一个XLOG Record的偏移,即0x00000001 41FFFFC0
unit8 xl_info

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 72 -n 1
00000048  00                                                |.|
00000049

标志位为0x00
unit8 xl_rmid

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 73 -n 1
00000049  0a                                                |.|
0000004a

该记录的资源管理器,即0x0A
2 bytes of padding

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 74 -n 2
0000004a  00 00                                             |..|
0000004c

pg_crc32c(uint32) xl_crc

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 76 -n 4
0000004c  ea 21 d2 50                                       |.!.P|
00000050

CRC校验位,即0x50D221EA

XLOG Record data下节再行介绍

三、参考资料

WAL Internals Of PostgreSQL
PostgreSQL 源码解读(109)- WAL#5(相关数据结构)
关于结构体占用空间大小总结

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容