PostgreSQL如何存储数据?存储结构简析
PostgreSQL数据库是一个功能强大的开源数据库,越来越多的公司开始使用PostgreSQL。存储系统是PostgreSQL最底层的模块。向下通过操作系统接口接收物理数据,向上为上层模块提供存储操作接口和功能。本文对PostgreSQL的存储结构进行简要分析,帮助大家了解这个强大的关系数据库是如何存储数据的。
-数据目录-
PostgreSQL安装完成后,首先要使用initdb程序初始化磁盘上的数据存储区域,创建模板数据库并生成相应的目录和文件信息
initdb -D /usr/local/pgsql/data
初始化目录包含数据文件、参数文件、控制文件、数据库操作日志和WAL日志文件等。下图中各个目录和子文件的用途没有解释。锻炼。
默认情况下,PostgreSQL中的所有数据都存储在其数据目录中。该数据目录通常由环境变量 PGDATA 引用。对于特定数据库,它位于 PGDATA/base 有一个与其对应的子目录。子目录的名称是系统表pg_database中数据库的OID。每个表的数据都存储在所属数据库目录下的独立文件中。该文件以表的文件节点号命名。避免某些文件系统不支持大文件。 PostgreSQL限制表文件的大小不超过1GB(默认1GB,可以在编译时通过./configure --with-segsize= x 更改)。因此,如果表文件超过1GB,则会创建另一个表文件。后缀为 relfilenode.1、relfilenode.2 ... 等的文件。
表文件的物理位置为:$PGDATA/BASE/DATABASE_OID/PG_CLASS.RELFILENODE
--查看数据库test的OID
dat testen'; ?是一个块,存储在磁盘上的数据块称为 Page,内存中的数据块称为 Buffer,表和索引称为 ❀♿❀ ♿❀ ♿ ,以及 元组 的行名称。数据的读写以Page为最小单位。每页默认大小为 8kB。其他大小可以在编译源码时通过 ./configure --with-blocksize=BLOCKSIZE 设置,之后无法更改。每个表文件由多个BLCKSZ字节页组成,每个页包含多个元组。
通用缓冲池和内存缓存块(标准1000个)。如果缓冲池中的块是脏的,则必须将它们刷新回磁盘。缓冲池的细节这里不再赘述。如果有需要,可以在另一篇文章中分析。 。
页面结构
页面结构由五个部分组成:
PageHeaderData --
pg_lsn,存储WAL日志的LSN信息. 页面最后一次修改的时间。
pg_checksum,存储页面的校验和值。
pd_flags,标志位
pg_lower,空闲空间起始处的偏移量。
pg_upper,偏移到可用空间末尾。
pd_pagesize_version,页面大小和布局版本号信息
pd_prune_xid,页面上最早的XMAX未被删除,如果没有则为0。
ItemIdData --
页头之后,指向实际元组元素的记录(偏移量、长度)对数组,每个 4 字节。
可用空间--
未分配的空间(可用空间)。新元素指针从该区域的开头分配,新元素从其末尾分配。
Items --
用于存储行数据元组。
特殊空间
--
索引访问模式相关数据。不同的索引访问方式存储不同的数据。在普通表中它是空的。
Tuple
页面上的元组可以分为“普通数据元组和TOAST元组”。
TOAST(超大属性存储技术)主要用于存储变长数据。如果正在插入的元组的数据大小大于约2KB(即页面的1/4),则自动启动。 TOAST技术就是用来存储这个元组的。 TOAST 比普通元组稍微复杂一些。本说明主要关注普通元组文件。
元组内部可分为三部分,即: PostgreSQL 在源代码目录贡献下提供了很多扩展功能。 pageinspect扩展模块的功能允许您从低级别观察数据库页面的内容,这对于调试目的很有用。 。 #cd $PGSRC/contrib/pageinspect #make #sudo make install -- 创建测试表 如果t1存在则删除表; 创建表t1 (id int, name varchar(20)); 值插入t1 (1 ,'aaa'); --查看页眉&item SELECT * FROM page_header(get_raw_page('t1', 0)); select * from heap_page_items('t1_',0 ) ); --更新一行数据原因是更新数据时PG并没有改变原来的tuple。相反,创建一个新元组并标记原始 tuple.t_xmax= 新元组的事务 ID。堆元组头(
23
字节)
、❓❓❀NULL♿和 NULL
用户存储的数据
。
Pageinspect Extension
安装
易于使用lpslps test=#创建扩展 pageinspect ; -- 第一次使用需要创建扩展
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。