当前位置:网站首页>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源创计划”,欢迎正在阅读的你也加入,一起分享。
边栏推荐
- Can flinksql two Kafka streams join?
- Zaah Sultan looks at the old driver
- 做一个 Scrollbar 的思考
- 本地浏览器打开远程服务器上的Jupyter Notebook/Lab以及常见问题&设置
- Qsort function and Simulation Implementation of qsort function
- 1-15 nodemon
- [backtracking] full arrangement II leetcode47
- Clickhouse distributed table engine
- 【MySQL入门】第一话 · 初入“数据库”大陆
- Is Wu Enda's machine learning suitable for entry?
猜你喜欢

Best wishes for Lao Wu's party

Deployment and use of Nacos

看阿里云 CIPU 的 10 大能力

周少剑,很少见

Excitatory neurotransmitter glutamate and brain health

Pytorch quantitative practice (1)
Notes [introduction to JUC package and future]

USBCAN分析仪的配套CAN和CANFD综合测试软件LKMaster软件解决工程师CAN总线测试难题

Nacos部署及使用

Is Wu Enda's machine learning suitable for entry?
随机推荐
将el-table原样导出为excel表格
Excitatory neurotransmitter glutamate and brain health
1-7 Path路径模块
Pytorch quantitative practice (2)
Is it safe to open an account for stock trading on mobile phones?
1-3 使用SQL管理数据库
Is machine learning suitable for girls?
SQL server extracts pure numbers from strings
《ClickHouse原理解析与应用实践》读书笔记(2)
《Dynamic Routing Between Capsules》论文学习总结
jenkins下载插件下载不了,解决办法
全面认识痛风:症状、风险因素、发病机理及管理
1-19 using CORS to solve interface cross domain problems
1-13 express监听GET和POST请求&处理请求
Microservice link risk analysis
【回溯】全排列 leetcode46
Document layout analysis: a comprehensive survey 2019 paper learning summary
盘点华为云GaussDB(for Redis)六大秒级能力
Side sleep ha ha ha
JD and Tencent renewed the three-year strategic cooperation agreement; The starting salary rose to 260000 yuan, and Samsung sk of South Korea scrambled for a raise to retain semiconductor talents; Fir

