数据库物理存储

数据库文件布局

本节描述文件和目录级别的存储格式。

传统上,数据库集群使用的配置和数据文件一起存储在集群的数据目录中,通常称为PGDATA(以可用于定义它的环境变量的名称命名)。PGDATA的常见位置是/var/lib/pgsql/data。 由不同服务器实例管理的多个集群可以存在于同一台计算机上。

PGD​​ATA目录包含几个子目录和控制文件,如表 65-1所示。除了这些必需的项目之外,集群配置文件postgresql.confpg_hba.confpg_ident.conf传统上也存储在PGDATA中,尽管也可以将它们放在其他地方。

PGDATA的内容

ItemDescription
PG_VERSION 包含PostgreSQL主版本号的文件
base 包含每个数据库子目录的子目录
global 包含集群范围表的子目录,例如pg_database
pg_commit_ts 包含事务提交时间戳数据的子目录
pg_clog 包含事务提交状态数据的子目录
pg_dynshmem 包含动态共享内存子系统使用的文件的子目录
pg_logical 包含逻辑解码状态数据的子目录
pg_multixact 包含多事务状态数据的子目录(用于共享行锁)
pg_notify 包含 LISTEN/NOTIFY 状态数据的子目录
pg_replslot 包含复制槽数据的子目录
pg_serial 包含已提交的可序列化事务信息的子目录
pg_snapshots 包含导出快照的子目录
pg_stat 包含统计子系统永久文件的子目录
pg_stat_tmp 包含统计子系统临时文件的子目录
pg_subtrans Subdirectory containing subtransaction status data
pg_tblspc Subdirectory containing symbolic links to tablespaces
pg_twophase Subdirectory containing state files for prepared transactions
pg_xlog 包含 WAL(预写日志)文件的子目录
postgresql.auto.conf 用于存储由ALTER SYSTEM设置的配置参数的文件
postmaster.opts A file recording the command-line options the server was last started with
postmaster.pid 一个锁定文件,记录当前 postmaster 进程 ID (PID)、集群数据目录路径、postmaster 启动时间戳、端口号、Unix 域套接字目录路径(Windows 上为空)、第一个有效的 listen_address(IP 地址或*,如果不在 TCP 上监听则为空)和共享内存段 ID(服务器关闭后此文件不存在)

对于集群中的每个数据库,在PGDATA /base中都有一个子目录,以pg_database中数据库的 OID 命名。此子目录是数据库文件的默认位置;特别是,它的系统目录存储在那里。

每个表和索引都存储在单独的文件中。对于普通关系,这些文件以表或索引的文件节点号命名,可以在pg_class . relfilenode中找到。但对于临时关系,文件名的形式为BBB _ FFF,其中BBB是创建该文件的后端的后端 ID,FFF是文件节点号。在任一情况下,除了主文件(又名主分支)之外,每个表和索引都有一个空闲空间图(参见第 65.3 节),其中存储了有关关系中可用空闲空间的信息。空闲空间图存储在以文件节点号加上后缀_fsm命名的文件中。表还有一个可见性图,存储在以后缀_vm结尾的分支中,以跟踪已知哪些页面没有死元组。可见性图在第 65.4 节中进一步描述。未记录的表和索引有第三个分支,称为初始化分支,它存储在带有后缀_init的分支中

警告

请注意,虽然表的文件节点通常与其 OID 匹配,但情况并不一定如此;某些操作(如TRUNCATEREINDEXCLUSTER和某些形式的ALTER TABLE)可以在保留 OID 的同时更改文件节点。避免假设文件节点和表 OID 相同。此外,对于某些系统目录(包括pg_class本身),pg_class . relfilenode包含零。这些目录的实际文件节点号存储在较低级别的数据结构中,可以使用函数获取pg_relation_filenode()

当表或索引超过 1 GB 时,它将被划分为千兆字节大小的。第一个段的文件名与文件节点相同;后续段名为 filenode.1、filenode.2 等。这种安排避免了在具有文件大小限制的平台上出现问题。(实际上,1 GB 只是默认的段大小。可以在构建PostgreSQL时使用配置选项--with-segsize调整段大小。)原则上,空闲空间图和可见性图分叉也可能需要多个段,尽管在实践中这种情况不太可能发生。

如果一个表的列中可能包含较大的条目,则该表将具有一个关联的TOAST表,该表用于线外存储太大而无法正确保存在表行中的字段值。pg_class . reltoastrelid从一个表链接到其TOAST表(如果有)。

 

posted @ 2024-05-31 17:39  wongchaofan  阅读(3)  评论(0编辑  收藏  举报