PostgreSQL Page中页头和行数据指针分析

分类:编程技术 时间:2024-02-20 15:57 浏览:0 评论:0
0
本文介绍《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 2

00000012 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))

39

表示第一个Item的大小(元组) 为 39

lp_flags

取第 17-16 位,01,即 1

至此,《分析》的介绍就结束了PostgreSQL 页面中的页面标题和行数据指针”。感谢您的阅读。如果您想了解更多行业资讯,可以关注网站,小编将为大家输出更多优质实用文章!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > PostgreSQL Page中页头和行数据指针分析

用户评论