当前位置: 首页 > 科技观察

超详细的PG数据存储结构:逻辑结构和物理存储总结

时间:2023-03-22 13:05:29 科技观察

概述今天主要说说PG的数据结构。PG数据存储结构分为:逻辑结构和物理存储。逻辑存储结构是组织和管理数据的内部方式。物理存储结构是在操作系统中组织和管理数据的方式。逻辑存储结构适用于不同的操作系统和硬件平台。1、逻辑存储结构逻辑结构包括:所有的数据库对象都有自己的oid(对象标识符),oid是一个无符号的四字节整数,相关对象的oid存储在相关的系统目录表中,比如数据库的oid和表的oid分别存放在pg_database和pg_class表中。1、数据库集群-Databasecluster2、数据库-Database3、表空间-tablespace数据库在逻辑上被划分为多个存储单元,称为表空间。表空间用于将逻辑上相关的结构保持在一起。一个数据库在逻辑上由一个或多个表空间组成。新建的数据库默认创建如下表空间:1)Catalog表空间存放系统表信息2)系统表空间存放用户数据3)Temp表空间4、模式-Schema自动创建的系统模式如下:1)PG_CATALOG2)PG_LARGEOBJECT3)PG_TOAST4)PG_PARTITION默认用户模式是PUBLIC。5.Segment-segment6,area-extent7,block-block8,databaseobject-Databaseobject1)Schema对象表、索引、序列、大对象、视图、函数、存储过程、触发器、包...2)非schema对象users,Database9,DataTable-Table10,Index-Index11,Sequence-Sequence12,View-View2.物理存储结构在initdb执行时会初始化一个目录,通常我们会在系统中配置相关的环境变量$PGDATA来表示,初始化完成后,会在该目录下生成相关的子目录和一些文件。在postgresql中,表空间的概念不同于其他关系型数据库。这里,一个表空间对应一个目录。下图是PG的物理结构:1.存储系统主要包括三部分:内存中:buffer,MemoryContext;数据文件、临时文件;日志文件,日志缓存。2、文件和目录相关功能说明:3、数据文件结构3.1.页从逻辑上将数据文件中的空间划分为页(数据块)。页是数据库I/O的基本单位,即数据文件只能整页读写,默认页大小为8K。页面可以分为两种类型:1)数据页:数据页用于存储用户数据。2)控制页:控制页就是用来管理这些数据页的。数据库共享缓存中的空间划分也是以页为基本单位。一个page的大小和数据文件中page的大小是一致的,方便读取整个page的数据文件,放入数据库Buffer,从Buffer写入数据文件在同一个方式,保证缓存和数据文件结构和内容的一致性。3.2、Block(块)在概念上基本等同于Page,但Block在DMS中更多的是用来解释Page在数据文件中的描述。例如:读写文件的操作,文件读写位置的定位,数据文件的空间回收等,都是以块为单位进行的。数据块的大小在系统初始化时指定,默认为8K,取值可以为4K、8K、16K、32K。3.3.Extent(区域)数据文件中由8个连续的Page组成的空间称为一个Extent。Extent是数据库分配/释放数据文件空间的基本单位。每个表、索引和序列对象都由几个区域组成。数据文件创建后,除部分区域自动保留为控制区外,其他区域均处于未分配状态。表、索引和序列对象的所有数据都存储在Extents中。在向这些Extents中插入数据时,如果Extent的所有页都满了,系统会自动在对应的表空间中寻找一个尚未创建的数据文件。分配的范围并将其状态更改为数据范围。3.4.控制页用于空间管理的控制页:PFS/GAM/IAM。增量备份的控制页面:DCM。判断可见性的控制页面:VM。预留控制页:BCM/SGAM。3.5.PFSPageFreeSpace,简称PFS页。用于记录该数据文件中页面的空间使用情况。对于文件中的每一页,在PFS中都有一个与之对应的“字节”,它记录了该页的状态。PFS页的前64bytes被保留作为页头,剩下的81024-64=8128共占81288K=64MB空间。因此,PFS页每8128页出现一次,系统在数据文件的第一页初始化第一个PFS页。两个page位置,即:1号数据页,可见第N个PFS页的位置为8128*N+1.3.6,GAMGlobalAllocationMap,简称GAM页。作用:记录所在数据文件Extent的分配情况。除了GAMheader,GAMpage中剩余空间的每一位(bit)对应一个Extent的分配。如果某位为1,则表示与该位关联的Extent已经分配,??否则没有分配。如果一个GAM页的大小是8K,除去GAM头(64字节),一个GAM页可以覆盖的文件范围是:(81024-64)8(88K),大约4GB的空间。另外,GAM页面每881288页出现一次,而系统要求第一个GAM页面出现在文件的第三页位置(即:第二个索引位置),所以可知第N个GAM页面的出现位置为:881288*N+23.7,IAMIndexAllocationMap,简称IAM页面。作用:每个IAM页面只属于一个数据库对象(例如:表),但是一个数据库对象可以包含多个IAM页面,所以可以看出IAM页面和数据库对象是1对1的关系,并且数据库对象和IAM页面的关系是一对多的关系。IAM的结构类似于GAM页面的结构。除了IAMheader之外,剩余空间中的每一位(bit)都对应一个与IAM相关的Extent。如果某位为1,则表示该位关联的Extent已经分配给IAM,否则没有分配。如果一个IAMpage的大小是8K,除去IAMheader(64字节),一个IAMpage可以覆盖的文件范围是:(81024-64)8(88K),大约4GB的空间。但它与GAM的不同之处还在于:IAM的位置不固定,只有在创建数据库对象时才会分配。三、逻辑和物理存储关系1、表空间存在逻辑关系;2、表空间存在于对应的数据文件中;新建数据库对应的数据文件名:Catalog表空间——databasename.dbf系统表空间——Udatabasename.dbfTemp表空间——Tdatabasename.dbf以“U”为前缀表示用户数据表空间,用于保存用户表的数据。不带U表示是系统表的表空间,用来保存系统表的数据。以U为前缀的数据文件所代表的表空间命名为PG。不带U的数据文件所代表的表空间是CATALOG。四、数据库文件、表空间与其他文件的关系1、关系图如下:说明:1)每个数据库都有一个或多个数据文件,用户存储该数据库的所有数据。2)数据库的数据文件具有以下特点:一个数据库文件只能与一个数据库的一个表空间相连。一个表空间可以包含多个数据文件。3)数据库对象与文件的关系:数据库对象放在表空间中。一个表空间有多个数据文件。表空间中有多个数据库对象。4)数据库对象在逻辑上存储在表空间中,物理上存储在与表空间关联的数据文件中。2、数据库包含的文件类型:1)数据库文件:data/DB数据库对象,如:数据库、表、索引、序列等对象。2)控制文件:data/CTL用于记录数据库集群的状态信息,如:版本信息、集群管理的各种文件信息、检查点信息、事务状态信息等。3)日志文件:data/REDOLOG记录了数据修改操作的日志,用于系统故障时的数据恢复。4)临时文件:data/DB存放的是数据库计算过程中产生的各种中间对象,如排序操作的外存合并单元。5)参数文件:data目录下5.Postgresql底层存储管理方式:Postgresql的每个数据库都存放在一个目录下,以db_oid命名,目录下存放每个表对应的文件,文件名对应数据表以relfilenode_oid命名。当表中的数据量大到导致表文件大小大于1GB时,postgresql会自动新建一个文件来存放新插入的数据。新文件的名称为:relfilenode_iod.1、relfilenode_iod.2等。该策略用于防止某些文件系统中支持的最大文件大小不能大于1GB的情况。db_oid、relfilenode_oid可以从pg_class系统表中查询到。每个表对应的文件以Page的形式组织。每个Page的默认大小为8KB。因此,每个数据库对应的文件的Disk分布如下图所示:每个Page包含PageHeader和Data段,PageHeader中pg_lower指向FreeSpace的起始地址,pg_upper指向FreeSpace的结束地址可用空间。Data部分包括:ItemIdData部分、FreeSpace部分、Items部分和Specialspace部分。ItemIdData部分:指向实际项目的(偏移量,长度)对数组。每个项目4个字节。自由空间部分:未分配的空间。新项目指针从该区域的开始分配,新项目从末尾分配。项目部分:实际项目本身。特殊空间部分:索引访问方法特定的数据。不同的方法存储不同的数据。在普通表中为空。项目存储从pg_upper增长到pg_lower(类似于堆)。ItenIdData的存储从pg_lower增长到pg_upper(类似于堆栈)。