千家信息网

PostgreSQL DBA(17) - XLOG Record data内部结构

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,XLOG Record data for DML下面逐一介绍上述几个部分,通过使用hexdump工具查看相关数据。1、XLogRecordBlockHeaderuint8 id[xdb@localho
千家信息网最后更新 2026年11月01日PostgreSQL DBA(17) - XLOG Record data内部结构 XLOG Record data for DML

下面逐一介绍上述几个部分,通过使用hexdump工具查看相关数据。

1、XLogRecordBlockHeader

uint8 id

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 80 -n 100000050  00                                                |.|00000051

块引用ID为0x00,即0号Block.

uint8 fork_flags

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 81 -n 100000051  20                                                | |00000052

值为0x20,高4位用于标记,即BKPBLOCK_HAS_DATA

uint16 data_length

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 82 -n 200000052  1e 00                                             |..|00000054

payload bytes = 0x001E,十进制数值为30.
接下来是RelFileNode

RelFileNode
tablespace/database/relation,均为Oid类型(unsigned int)
1.tablespace

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 84 -n 400000054  7f 06 00 00                                       |....|00000058

值为0x0000067F,十进制值为1663
表空间为default

testdb=# select * from pg_tablespace where oid=1663;  spcname   | spcowner | spcacl | spcoptions ------------+----------+--------+------------ pg_default |       10 |        | (1 row)

2.database

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 88 -n 400000058  12 40 00 00                                       |.@..|0000005c

值为0x00004012,十进制值为16402,数据库为testdb

testdb=# select * from pg_database where oid=16402; datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace | datacl ---------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+------------+---------------+-------- testdb  |     10 |        6 | C          | C        | f             | t            |           -1 |         13284 |          561 |          1 |          1663 | (1 row)

3.relation

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 92 -n 40000005c  56 42 00 00                                       |VB..|00000060

值为0x00004256,十进制值为16982

testdb=# select oid,relfilenode,relname from pg_class where relfilenode = 16982;  oid  | relfilenode | relname -------+-------------+--------- 16982 |       16982 | t_jfxx(1 row)

相应的关系为t_jfxx

BlockNumber

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 96 -n 400000060  85 00 00 00                                       |....|00000064

值为0x00000085,十进制值为133,这是对应的数据块号.

2、XLogRecordDataHeaderShort

接下来是XLogRecordDataHeaderShort/Long,由于数据小于256B,使用XLogRecordDataHeaderShort结构
unit8 id

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 100 -n 100000064  ff                                                |.|00000065

值为0xFF --> XLR_BLOCK_ID_DATA_SHORT 255
uint8 data_length

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 101 -n 100000065  03                                                |.|00000066

值为0x03,3个字节,指的是main data的大小,3个字节是xl_heap_insert结构体的大小.

3、block data

XLogRecordDataHeaderShort之后是block data,由两部分组成:
1.xl_heap_header
2.Tuple data

xl_heap_header
1.uint16 t_infomask2

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 102 -n 200000066  03 00                                             |..|00000068

t_infomask2值为0x03,二进制值为00000000 00000011

2.uint16 t_infomask

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 104 -n 200000068  02 08                                             |..|0000006a

t_infomask值为0x0802,二进制值为00001000 00000010

3.uint8 t_hoff

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 106 -n 10000006a  18                                                |.|0000006b

t_hoff值(偏移)为0x18,十进制值为24

Tuple data
XLOG Record的大小是0x4F,即79B,减去头部数据XLogRecord(24B) + XLogRecordBlockHeader(20B) + XLogRecordDataHeaderShort(2B) + xl_heap_header(5B) + main data(3B),剩余25B

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 107 -n 250000006b  00 0d 32 30 39 31 39 0f  32 30 31 33 30 37 00 00  |..20919.201307..|0000007b  00 00 00 00 00 00 03 b3  40                       |........@|00000084
4、main data

这是xl_heap_insert结构体
uint16 OffsetNumber

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 132 -n 200000084  26 00                                             |&.|00000086

插入的tuple的偏移为0x0026,十进制为38

uint8 flags

[xdb@localhost pg_wal]$ hexdump -C 000000010000000100000042 -s 134 -n 100000086  00                                                |.|00000087

标志位为0x00

二、参考资料

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

十进制 十进 结构 数据 大小 接下来 二进制 字节 空间 这是 偏移 个部 参考资料 头部 工具 数值 数据库 数据结构 标志 标记 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 北京路客互联网科技有限公司 中国互联网科技工作委员会毛军 互联网科技保险 互联网科技公司税收优惠 科技互联网技术 期待互联网科技 菲比寻常互联网科技 万达互联网科技 科技类的互联网平台 哈尔滨新华互联网科技 互联网科技创新企业排名 宁夏众和广鑫互联网科技有限公司 语蝶互联网科技有限公司 知域互联网科技有限公司大骗子 威龙国际互联网科技公司 中和天地互联网科技有限公司 上海乐五互联网科技有限公司 悟空问答互联网科技 互联网金融金融科技 北京品多多互联网科技有限公司 科技股互联网 互联网科技革命 苏州大垚互联网科技 广州紫鲸互联网科技 湖南诚度互联网科技有限公司 受益于互联网科技的高速发展 崇明区互联网教育科技诚信经营 元气玛特互联网科技公司是外包吗 新氧科技和美国互联网有关系吗 科技互联网专业工作会议发言稿
0