当前位置:网站首页>PostgreSQL存储结构浅析
PostgreSQL存储结构浅析
2022-06-30 21:53:00 【PostgreSQLChina】

PostgreSQL数据库是功能强大的开源数据库,越来越多的公司开始使用PostgreSQL。存储系统是PostgreSQL的最底层模块,它向下通过操作系统接口访问物理数据,向上为上层模块提供存储操作的接口和函数。本文通过对PostgreSQL的存储结构进行浅析,帮助大家了解这一强大的关系型数据库是如何存储数据的。


PostgreSQL安装完成后必须先使用initdb程序初始化磁盘上的数据存储区,生成模板数据库和相应的目录、文件信息。
initdb -D /usr/local/pgsql/data
初始化目录中包含数据文件、参数文件、控制文件、数据库运行日志及WAL日志文件等,下图各目录和子文件的用途在此不做赘述。
默认情况下,PostgreSQL中的所有数据都存储在其数据目录里,这个数据目录通常会用环境变量PGDATA来引用,对于某个具体的数据库,在 PGDATA/base 里都对应有一个子目录,子目录的名字是该数据库在系统表pg_database里的OID,每个表的数据都存在其所属数据库目录下的独立文件里,文件以该表的filenode号命名,为了避免有些文件系统不支持大文件,PostgreSQL限制表文件大小不能超过 1GB(默认1GB,编译时可通过./configure --with-segsize= x修改)因此,当表文件超过 1GB 时,会另建一个有尾缀的文件 relfilenode.1,relfilenode.2……以此类推。
表文件的物理位置为:
$PGDATA/BASE/DATABASE_OID/PG_CLASS.RELFILENODE

#select oid,datname from pg_database where datname='test'


#select pg_relation_filepath('t1');


在PG中,磁盘存储和内存中的最小管理单位都是块,保存在磁盘中的数据块称为Page,内存中的数据块称为 Buffer,表和索引称为 Relation,行称为 Tuple。数据的读写是以Page 为最小单位,每个Page 默认大小为 8kB,在源码编译时可通过 ./configure --with-blocksize=BLOCKSIZE 设置其他大小,此后都不可更改。每个表文件由多个BLCKSZ字节大小的Page组成,每个Page 包含若干Tuple。
内存中的共享缓冲池缓存了block块(默认1000个),若缓冲池中的block块为脏,需要刷回磁盘,缓冲池细节在此不做赘述,需要时可另起一文解析。
Page结构

Page结构包括五部分:
PageHeaderData --在page头部,24个字节长度,记录page的元数据信息。
pg_lsn,存储page最新更改时,WAL日志的lsn信息。
pg_checksum,存储page的校验值。
pd_flags,标志位
pg_lower,到空闲空间开头的偏移量。
pg_upper,到空闲空间结尾的偏移量。
pd_pagesize_version,页面大小和布局版本号信息
pd_prune_xid,页面上最早未删除XMAX,如果没有则为0。
ItemIdData --在page header之后,一个记录(偏移量,长度)对的数组,指向实际tuple项,每个4 字节。

Free space --未分配的空间(空闲空间)。新项指针从这个区域的开头开始分配,新项从其结尾开始分配。
Items --用来存放行数据Tuple。
Special space--索引访问模式相关的数据。不同的索引访问方式存放不同的数据。在普通表中为空。
Tuple
页中的元组可细分为“普通数据元组和TOAST元组”。
TOAST(The Oversized-Attribute Storage Technique,超大属性存储技术)主要用于存储变长数据,当待插入元组的数据大小大于约为2KB(即页的1/4)时候,会自动启动TOAST技术来存储该元组。TOAST较普通元组稍加复杂些,这里主要针对普通元组文件进行说明。

元组内部可以分为三部分,分别是:堆元组头部(23字节)、NULL值位图和用户存储的数据。


PostgreSQL在源码目录contrib下提供了许多扩展的功能,pageinspect扩展模块提供的函数让你从低层次观察数据库页面的内容,这对于调试目的很有用。
安装
#cd $PGSRC/contrib/pageinspect
#make
#sudo make install
简单使用
#psql -d test
test=#create extension pageinspect;
创建测试表
drop table if exists t1;
create table t1 (id int, name varchar(20));
insert into t1 values(1,'aaa');
查看page header&item
SELECT * FROM page_header(get_raw_page('t1', 0));

select * from heap_page_items(get_raw_page('t1',0));

更新一行数据
update t1 set name='bbb' where id=1;

查看heap_page_items(),发现多了一条item,原因是PG更新数据时并不修改原tuple,而是插入一条新的tuple,并标记原tuple.t_xmax=新tuple的事务id。


本文分享自微信公众号 - 开源软件联盟PostgreSQL分会(kaiyuanlianmeng)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
边栏推荐
- Clickhouse distributed table engine
- Document Layout Analysis: A Comprehensive Survey 2019论文学习总结
- 根据肠道微生物组重新思考健康饮食
- FreeRTOS record (IX. an example of a bare metal project transferring to FreeRTOS)
- Microservice link risk analysis
- 激发新动能 多地发力数字经济
- ML&DL:機器學習和深度學習中超參數優化的簡介、評估指標、過擬合現象、常用的調參優化方法之詳細攻略
- Sqlserver gets the data of numbers, Chinese and characters in the string
- 1-3 使用SQL管理数据库
- CA I ah, how many times Oh, ah sentence IU home Oh 11111
猜你喜欢

Five years after graduation, I wondered if I would still be so anxious if I hadn't taken the test

Excitatory neurotransmitter glutamate and brain health

Clickhouse native monitoring item, system table description

Prediction and regression of stacking integrated model

Stinky tofu made by Grandma

On several key issues of digital transformation

【MySQL入门】第一话 · 初入“数据库”大陆

Multi table operation - foreign key constraint

Zhoushaojian, rare

看阿里云 CIPU 的 10 大能力
随机推荐
1-14 express托管静态资源
做一个 Scrollbar 的思考
The programmer's girlfriend gave me a fatigue driving test
Some problems when SSH default port is not 22
ssh 默认端口不是22时的一些问题
1-19 using CORS to solve interface cross domain problems
【回溯】全排列 II leetcode47
Clickhouse native monitoring item, system table description
Excuse me, can I open an account for the company? Is it safe? All the answers you want are here
程序员女友给我做了一个疲劳驾驶检测
Jupyter notebook/lab switch CONDA environment
Export El table as is to excel table
全面认识痛风:症状、风险因素、发病机理及管理
Who are you and I
Go Web 编程入门: 一探优秀测试库 GoConvey
Side sleep ha ha ha
Inventory the six second level capabilities of Huawei cloud gaussdb (for redis)
Zaah Sultan looks at the old driver
Random talk about Clickhouse join
twelve thousand three hundred and forty-five

