暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL 学习笔记017 —— PostgreSQL 存储结构

心有阳光 2023-01-12
2100

Postgresql 存储结构

存储系统是 PostgreSQL 的最底层模块,它向下通过操作系统接口访问物理数据,向上为上层模块提供存储操作的接口和函数。本文目的是了解和掌握postgresql的存储结构。

PG数据存储结构分为:逻辑结构和物理存储。
其中逻辑存储结构是内部的组织和管理数据的方式。
物理存储结构是操作系统中组织和管理数据的方式。
逻辑存储结构适用于不同的操作系统和硬件平台。

数据目录

postgresql安装完成后必须先使用Initdb程序初始化磁盘上的数据存储区,生成模板数据库和相应的目录、文件信息。

初始化目录中包含数据文件、参数文件、控制文件、运行日志及wal日志文件等。

[postgres@192 data]$ pwd /opt/pgsql/postgresql/data [postgres@192 data]$ ll 总用量 92 drwx------. 6 postgres postgres 54 1月 2 19:43 base drwx------. 2 postgres postgres 4096 1月 11 20:10 global drwx------. 2 postgres postgres 6 12月 27 22:41 pg_commit_ts drwx------. 2 postgres postgres 6 12月 27 22:41 pg_dynshmem -rw-------. 1 postgres postgres 4859 12月 27 22:57 pg_hba.conf -rw-------. 1 postgres postgres 1636 12月 27 22:41 pg_ident.conf drwx------. 4 postgres postgres 68 1月 11 20:03 pg_logical drwx------. 4 postgres postgres 36 12月 27 22:41 pg_multixact drwx------. 2 postgres postgres 6 12月 27 22:41 pg_notify drwx------. 2 postgres postgres 6 12月 27 22:41 pg_replslot drwx------. 2 postgres postgres 6 12月 27 22:41 pg_serial drwx------. 2 postgres postgres 6 12月 27 22:41 pg_snapshots drwx------. 2 postgres postgres 6 12月 30 20:15 pg_stat drwx------. 2 postgres postgres 63 1月 11 20:13 pg_stat_tmp drwx------. 2 postgres postgres 18 12月 27 22:41 pg_subtrans drwx------. 2 postgres postgres 6 12月 27 22:41 pg_tblspc drwx------. 2 postgres postgres 6 12月 27 22:41 pg_twophase -rw-------. 1 postgres postgres 3 12月 27 22:41 PG_VERSION drwx------. 3 postgres postgres 60 12月 27 22:41 pg_wal drwx------. 2 postgres postgres 18 12月 27 22:41 pg_xact -rw-------. 1 postgres postgres 88 12月 27 22:41 postgresql.auto.conf -rw-------. 1 postgres postgres 28762 12月 27 22:52 postgresql.conf -rw-------. 1 postgres postgres 69 1月 11 20:03 postmaster.opts -rw-------. 1 postgres postgres 84 1月 11 20:03 postmaster.pid -rw-rw-r--. 1 postgres postgres 26585 1月 11 20:03 serverlog
描述
base 包含每个数据库对应的子目录
global 包含集簇范围的表的子目录,比如pg_database
pg_commit_ts 包含事务提交时间戳数据的子目录
pg_dynshmem 包含被动态共享内存子系统所使用的文件的子目录
pg_hba.conf 客户端网络访问控制配置文件
pg_ident.conf 配置哪些操作系统用户可以映射为数据库用户
pg_logical 包含用于逻辑复制的状态数据的子目录
pg_multixact 包含多事务(multi-transaction)状态数据的子目录(用于共享的行锁)
pg_notify 包含LISTEN/NOTIFY状态数据的子目录
pg_replslot 包含复制槽数据的子目录
pg_serial 包含已提交的可序列化事务信息的子目录
pg_snapshots 包含导出的快照的子目录
pg_stat 包含用于统计子系统的永久文件的子目录
pg_stat_tmp 包含用于统计信息子系统的临时文件的子目录
pg_subtrans 包含子事务状态数据的子目录
pg_tblspc 包含指向表空间的符号链接的子目录
pg_twophase 包含用于预备事务状态文件的子目录
PG_VERSION 一个包含PostgreSQL主版本号的文件
pg_wal 包含 WAL (预写日志)文件的子目录
pg_xact 包含事务提交状态数据的子目录
postgresql.auto.conf 一个用于存储由ALTER SYSTEM 设置的配置参数的文件
postgresql.conf 参数文件
postmaster.opts 一个记录服务器最后一次启动时使用的命令行参数的文件
postmaster.pid 一个锁文件,记录着当前的 postmaster 进程ID(PID)、集簇数据目录路径、postmaster启动时间戳、端口号、Unix域套接字目录路径(Windows上为空)、第一个可用的listen_address(IP地址或者*,或者为空表示不在TCP上监听)以及共享内存段ID(服务器关闭后该文件不存在)

默认情况下,postgresql中的所有数据都存储在其数据目录里。$PGDATA/base里存储了名为对应数据库oid的子目录。每个数据库的表数据都存储其所属的独立文件里,文件以该表的filenode号命名,为了避免有些文件系统不支持大文件,postgresql限制了表文件大小不能超过1GB,当表文件超过1GB时,会另外创建一个有尾缀的文件,relfilenode.1,relfilenode.2…

-- 数据库中存储的位置 [root@192 base]# pwd /opt/pgsql/postgresql/data/base [root@192 base]# ll 总用量 48 drwx------. 2 postgres postgres 8192 12月 27 22:41 1 drwx------. 2 postgres postgres 8192 12月 27 22:41 13891 drwx------. 2 postgres postgres 8192 1月 11 20:03 13892 drwx------. 2 postgres postgres 8192 1月 9 19:59 24616 -- 查看数据库oid postgres=# select datname,oid from pg_database; datname | oid -----------+------- postgres | 13892 template1 | 1 template0 | 13891 testdb | 24616 (4 rows) -- 查看表的filenode postgres=# select pg_relation_filepath('test1'); pg_relation_filepath ---------------------- base/13892/24617 (1 row)

数据文件结构

在postgresql中,磁盘存储和内存中的最小管理单位都是块。
保存在磁盘中的数据块成为page,默认大小 8k;
内存中的数据块称为buffer;
表和索引称为relation;
行称为tuple。
数据的读写是以page为最小单位,每个page默认大小为8kb。
每个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值位图和用户存储的数据。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论