PostgreSQL Page中页头和行数据指针分析
1.测试数据
--创建表,插入几行数据
drop table ifexists t_page;
create table t_page(id int,c1 char (8),c2 varchar(16));
插入 t_page 值(1,'1','a');
插入 t_page 值(2,'2 ','b');
插入 t_page 值(3,'3','c');
插入 t_page 值(4,'4','d ');
--获取表对应的数据文件
testdb=# select pg_relation_filepath('t_page');
pg_relation_filepath
--------------------
base/16477/24801
(1行)
--Dump数据文件中的数据
[xdb@localhost utf8db]$ hexdump -C $PGDATA/base/16477/24801
< p>00000000 01 00 00 00 8820 2a 12 00 00 00 00 28 00 60 1f |..... *.....(.`.|00000010 00 20 04 20 00 00 00 00 d8 9f 4e 00 b0 9f 4e 00 |. ......N...N.|
00000020 88 9f 4e 00 60 9f 4e 00 0000 00 00 00 00 00 00 |..N.`.N. ..| ............|
*
00001f60 e5 1b 18 00 00 00 00 00 00 00 00 00 00 00 00 00 | . ......|
00001f70 04 00 03 00 02 08 18 00 04 00 00 00 13 34 20 20 |.............. 4 |
00001f80 20 20 20 20 20 05 64 00 e4 1b 18 00 00 00 00 00 | .d.........|
00001f90 00 00 00 00 00 00 00 00 03 00 03 00 02 08 18 00 |......................|
00001fa0 03 00 00 00 13 33 20 20 20 20 20 20 20 05 63 00 |.....3 .c.|
00001fb0 e3 1b 18 00 00 00 00 00 00 00 00 00 00 00 00 00 |........................ ....|
00001fc0 02 00 03 00 02 08 18 00 02 00 00 00 13 32 20 20 |............ .2 |
< p>00001fd0 20 20 20 20 20 05 62 00 e2 1b 18 00 00 00 00 00 |;.b.........|00001fe0 00 00 00 00 00 00 00 00 01 00 03 00 02 08 18 00 |............ ....|
00001ff0 01 00 00 00 13 31 20 20 20 20 2020 20 05 61 00 |.....1 .a.|
00002000
2. PageHeader
上一节提到,PageHeaderData具有以下数据结构:
typedef struct PageHeaderData
{
/* XXX LSN 是 *任何* 块的成员,而不仅仅是页面组织的块 */
PageXLogRecPtr pd_lsn;/* LSN: xlog 最后一个字节之后的下一个字节
* 记录最后一次更改到此页 */
uint16pd_checksum;/* 校验和 */
uint16pd_flags;/* 标志位,见下文 */
LocationIndex pd_lower;/* 偏移量到空闲空间的开始 */
LocationIndex pd_upper;/* 到空闲空间末尾的偏移 */
LocationIndex pd_special;/* 到特殊空间开始的偏移 */
uint16pd_pagesize_version;
TransactionId pd_prune_xid; /* 最旧的可修剪 XID,如果没有则为零 */
ItemIdDatapd_linp[1];/* 行指针数组的开头 */
} PageHeaderData;
下面根据数据文件中的数据,使用hexdump来一一查看和分析数据。
pd_lsn(8bytes)
[xdb@localhost utf8db]$ hexdump -C $PGDATA/base/16477/24801 -s 0 -n 8
00000000 01 00 00 00 88 20 2a 12 是TimelineID,这里是\x0000 0001(也就是数字1),后面的4个字节是\x122a2088,合并后的LSN是1/122A2088
注意:
< p>A, 0000000&0000008 是hexdump工具的输出,不是数据内容B。 > [XDB@LOCALHOST UTF8DB] $ HEXDUMP -C $ PGData/Base/16477/24801 -S 8 -N 2
00000008 00 00 | ..|
校验和为\x0000
pd_flags(2bytes)
[xdb@localhost utf8db]$ hexdump -C $PGDATA/base/16477 /24801 -s 10 -n 2
0000000a 00 00|..|
0000000c
标志为\x0000
pd_lower( 2字节)
[xdb@localhost utf8db]$ hexdump - C $PGDATA/base/16477/24801 -s 12 -n 2
0000000c 28 00x0028,十进制 值为 40
pd_upper(2bytes)
[xdb@localhost utf8db]$ hexdump -C $PGDATA/base/16477/24801 -s 14 -n 2< /p>
0000000e 60 1f 2
大写为\x1f60,小数为8032
pd_special(2bytes)
[xdb@localhost utf8db]$ hexdump -C $PGDATA/base/16477/24801-s 16-n 2
00000010 00 20 00,十进制值为8192
pd_pagesize_version(2bytes)
< p>[xdb@localhost utf8db]$ hexdump -C $PGDATA/base/16477/24801 -s 18 -n 200000012 04 20 。 xid(4bytes)
[xdb@localhost utf8db]$ hexdump -C $PGDATA/base/16477/24801 -s 20 -n 4
00000014 00 00 00 00
00000018
prune_xid为\x0000,即0
3. ItemIds
PageHeaderDa后ta为ItemId数组,每个元素占用4Bytes空间,数据结构:
typedef struct ItemIdData
{
< p>unsigned lp_off:15,/* 到元组的偏移量(从页面开始)*/lp_flags:2,/* 项指针的状态,见下文 */
lp_len :15;/* 元组的字节长度 */
} ItemIdData;
typedef ItemIdData* ItemId;
lp_off
[xdb @localhost utf8db]$ hexdump -C $ PGDATA/base/16477/24801 -s 24 -n 2
00000018 d8 9f
[xdb@localhost utf8db]$ echo $(( 0x9fd8 & ~$((1<<15))))
8152
表示从 8152 开始的第一项(元组)
lp_len
[xdb@localhost utf8db]$ hexdump -C $PGDATA/base/16477/24801 -s 26 -n 2
0000001a 4e00 |名词|
0000001c
取15位
[XDB@LocalHost UTF8DB] $ echo $((0x004e >> 1)) p>
39
表示第一个Item的大小(元组) 为 39
lp_flags
取第 17-16 位,01,即 1
至此,《分析》的介绍就结束了PostgreSQL 页面中的页面标题和行数据指针”。感谢您的阅读。如果您想了解更多行业资讯,可以关注网站,小编将为大家输出更多优质实用文章!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > PostgreSQL Page中页头和行数据指针分析