PostgreSQL是一种功能强大且广泛使用的开源关系数据库管理系统。为了充分利用PostgreSQL,必须对其基本组成部分有深入的了解。在本文中,我们将深入研究数据库群集的逻辑和物理结构,以及堆表文件的内部布局。这些知识将成为理解PostgreSQL的基础,并帮助您更熟练地与PostgreSQL合作。
数据库群集的逻辑结构
PostgreSQL中的数据库群集是指由PostgreSQL Server管理的数据库集合。重要的是要注意,数据库群集并不参考一组数据库服务器。相反,PostgreSQL Server在单个主机上运行并管理单个数据库群集。在数据库群集中,数据库本身被视为数据库对象,它们在逻辑上彼此分开。表,索引和视图等其他数据库对象属于其各自的数据库。
为了管理数据库对象之间的关系,PostgreSQL内部使用对象标识符(OID),该对象标识符(OID)是未签名的4字节整数。对象及其各自的OID之间的映射存储在PG_DATABASE和PG_CLASS等系统目录中。这使您可以通过针对这些系统目录执行查询来检索所需的OID。
要管理数据库对象之间的关系,PostgreSQL内部使用对象标识符(OID),它们是无符号的4字节整数。对象及其各自的OID之间的映射存储在系统目录中,例如 pg_database 和 pg_class 。这使您可以通过针对这些系统目录执行查询来检索所需的OID。
数据库群集的物理结构
PostgreSQL中的数据库群集由目录结构表示,通常称为基本目录。当您使用 initdb 实用程序初始化新数据库群集时,将在指定位置(通常设置为 pgdata 环境变量)下创建基本目录。基本目录包含子目录和许多文件,这些文件集体代表数据库群集的物理结构。
这些子目录包括 base/,其中包含每个数据库子目录和 global/,它具有 pg_database 和 pg_control 。此外,还有其他用于特定目的的子目录,例如存储事务提交时间戳数据,动态共享内存子系统文件,逻辑解码状态数据,复制插槽数据等。 PostgreSQL还支持表空间,这些目录是用于存储其他数据的基本目录之外的目录。
数据库的布局
在基本目录下,每个数据库由一个子目录表示,其名称对应于数据库的OID。例如,如果名为 sampledB 的数据库的OID为16384,则其子目录将为 base/16384 。该目录用作属于该特定数据库的表,索引和关联文件的容器。
与表和索引关联的文件的布局
在PostgreSQL中,每个表或索引在基本目录中的相应数据库的子目录下存储为单独的文件。这些文件由 relfilenode 变量管理,并且与对象标识符(OID)内部关联。 Relfilenode值通常与相应的OID匹配,但是由于某些命令,例如 Truncate , Reindex 或 cluster 。
表和索引文件伴随着其他文件,称为“自由空间图”(FSM)和可见度图(VM)。 FSM存储有关文件中每个页面上的自由空间容量的信息,而VM存储可见性信息。索引有自己的FSM,但没有可见性图。 PostgreSQL支持表空间的概念,该概念在基本目录之外提供了附加的数据区域。创建表空间时,将在指定的位置下创建目录,并在其中创建特定于版本的子目录。特定于版本的子目录名称遵循格式pg_'major版本'_'目录版本编号'。然后将表空间目录从基本目录象征性地链接。这允许PostgreSQL作为整体数据库集群的一部分管理存储在表空间中的数据文件。 要将表或索引与特定的表空间相关联,您可以在创建表或索引期间指定表空间名称。默认情况下,如果未指定表空间,则在位于基本目录中的默认表空间中创建对象。 在数据库的子目录中,每个表由称为HEAP表文件的文件表示。该文件存储表的实际数据行。堆表文件由表的OID识别,该文件与前面提到的Relfilenode值匹配。 在每个页面中,数据行以特定格式存储。每个数据行都包含一个标题,其中包含诸如行的长度,可见性状态和其他元数据之类的信息。实际的行数据遵循标题。 当更新或删除表行时,PostgreSQL不会立即从堆表文件中删除该行。取而代之的是,它将行标记为“死”,后来插入新行时被死行所占据的空间。这种方法通过减少磁盘I/O。
表空间
堆表文件布局
堆表文件由称为页面的多个固定尺寸块组成。每个页面通常包含多个数据行和关联的元数据。页面的大小是在数据库群集初始化期间确定的,并设置为固定值,通常为8 kb。
综上所述
了解PostgreSQL数据库群集的基础知识对于有效地使用此功能强大的关系数据库管理系统至关重要。通过理解集群的逻辑和物理结构,以及数据库对象和关联文件的布局,您可以更有效地导航和管理PostgreSQL数据库。此知识构成了高级主题的基础,例如postgresql中的性能调整,复制和高可用性。