PostgreSQL数据目录深度揭秘

是这样的,想请分析下,PostgreSQL数据目录深度揭秘
最新回答
如啼眼

2024-10-14 08:04:35

PostgreSQL是一个功能强大且开源的客户/服务器关系型数据库管理系统,支持NoSQL数据类型,并主要服务于企业复杂查询SQL的OLTP业务场景,提供PostGIS地理信息引擎、阿里云自研的多维多模时空信息引擎等。数据目录是其核心组成部分,保存配置文件、数据文件、事务日志和WAL日志等重要信息,所有客户创建的数据文件和初始配置文件均存于此,因此数据目录是客户价值的集中体现。

数据目录默认位于/var/lib/pgsql/data,并支持使用环境变量$PG_DATA管理。下图展示了数据目录的一级结构,接下来将重点介绍具有代表性的文件和目录,如base、pg_xact等。

数据目录结构概述

数据目录由base目录和global目录组成。base目录存储用户创建的数据库文件及关系(如表、索引等),而global目录则存储pg_control及数据库集群维度的数据库及其关系(非客户维度的数据,如pg_database、pg_class等)。目录结构与base目录保持一致。

base目录

base目录存储用户创建的数据文件和隶属于用户数据库的所有关系,包括表、索引等。

一级目录

base目录结构分为两级,第一级结构如下图所示,一级目录名是用户数据库对象的OID。1代表的是postgres数据库,一级目录内的二级子文件都是隶属于该数据库对象的关系,包括表、索引、视图等。

二级文件

二级子文件存储着某个数据库内的所有关系,包括表、索引、视图等。以postgres数据库目录为例,二级子文件分为三类:第一类是以关系OID命名的主数据文件;第二类是文件名以_fsm结尾的空闲空间映射文件;第三类是文件名以_vm结尾的可见性映射文件。

主数据文件

主数据文件存储隶属于对应数据库下的数据库关系文件,包括数据、索引等。客户最重要的业务数据存储在主数据文件中。

主数据文件根据大小切分为单文件或多个文件,并以默认8K固定大小的多个page存储在磁盘上。主数据文件写入时,元组数据从行指针数组的底部开始堆叠。MVCC机制确保元组可见性,查询引擎通过索引或顺序扫描读取元组。

global目录

global目录存储pg_control及数据库集群维度的数据库及其关系,非客户维度的数据。目录内的文件结构与base目录一致。

pg_control

pg_control文件记录数据库集群控制信息,包括初始化、WAL和checkpoint的相关信息。

pg_wal目录

pg_wal目录存储WAL机制中的wal日志。PG10及以上版本改名为pg_wal,10以下版本目录为pg_xlog。

WAL机制概述

Write-Ahead-Logging(日志先行)机制确保数据变更优先写入日志文件,事务成功后再选择合适时机写入数据文件。数据库崩溃后,引擎从上一次成功的checkpoint点重放wal记录,确保数据恢复到崩溃前状态。

文件结构与wal segment

wal段文件存储数据库行记录明细,每条记录明细服务于数据库恢复操作。wal段文件命名包含timeline、logid和logseg,文件名共24位,用于记录wal记录的LSN。wal记录根据LSN分别记录在不同的wal段文件中。

.history文件

.history文件记录时间线切换信息和原因,用于数据库的时间点恢复。

.ready和.done文件

.ready文件标记wal段文件可被归档,.done文件标记wal段文件已归档,可以被清理。

pg_xact目录

pg_xact目录存储事务提交日志,事务提交日志默认大小为256KB,文件名形如NNNN,系统初始化后从0000开始递增至FFFF。PG10及以上版本改名为pg_xact,10以下版本目录为pg_clog。

配置文件

配置文件包括postgresql.conf、postgresql.auto.conf和pg_hba.conf。其中postgresql.conf存储配置文件的位置、资源限制等参数,postgresql.auto.conf文件存储全局配置参数,pg_hba.conf文件负责客户端的连接和认证。

总结

通过深入理解数据目录及其子文件的结构与作用,用户能对PostgreSQL数据库有全面的了解。无论是日常运维、内核研发还是业务开发,掌握这些基础知识都是必要的。同时,了解配置文件的管理对于优化数据库性能至关重要。如有兴趣参与社区活动,欢迎加入阿里云开发者社区“乘风者计划”,获得更多技术资源和支持。