关于sql:PostgreSQL数据目录深度揭秘

21次阅读

共计 4802 个字符,预计需要花费 13 分钟才能阅读完成。

简介:PostgreSQL 是一个性能十分弱小的、源代码凋谢的客户 / 服务器关系型数据库管理系统(RDBMS),被业界誉为“先进的开源数据库”,反对 NoSQL 数据类型,次要面向企业简单查问 SQL 的 OLTP 业务场景,提供 PostGIS 地理信息引擎、阿里云自研多维多模时空信息引擎等。本文着重介绍 PostgreSQL 的数据目录,其中保留着配置文件、数据文件、事务日志和 WAL 日志等重要文件,所有客户创立的数据文件和初始配置文件都能够在数据目录中找到,因而数据目录是重要的客户价值所在。

作者 | 市隐
起源 | 阿里技术公众号

一 概述

PostgreSQL 是一个性能十分弱小的、源代码凋谢的客户 / 服务器关系型数据库管理系统(RDBMS),PostgreSQL 被业界誉为“先进的开源数据库”,反对 NoSQL 数据类型(JSON/XML/hstore),次要面向企业简单查问 SQL 的 OLTP 业务场景,提供 PostGIS 地理信息引擎、阿里云自研多维多模时空信息引擎等。

本文着重介绍 PostgreSQL 的数据目录,其中保留着配置文件、数据文件、事务日志和 WAL 日志等重要文件,所有客户创立的数据文件和初始配置文件都能够在数据目录中找到,因而数据目录是重要的客户价值所在。

二 名词

1 OID

数据库对象是数据库存储或援用的数据结构体,数据库自身也是数据库对象,同时包含表、索引、视图、序列和函数等。Object ID 是数据库对象的惟一标识符,保留在无符号四字节的整形变量中,所有数据库对象各自对应一个 OID。PostgreSQL 有两个视图各司其职,别离保留着不同类别的 OID,其中 pg_database 保留数据库自身对象的 OID,pg_class 保留表、索引和序列等对象的 OID。

2 Relation

关系代表非数据库自身的数据库对象,包含表、视图、索引和 toast 等,不包含数据库自身。

3 MVCC

Multi-Version-Concurrency-Control 是一种并发管制机制,数据库引擎依据不同的事务隔离级别,通过查问事务快照和事务提交日志来实现元组的可见性查看。如果心愿了解数据库机制原理,MVCC 是必不可少的学习常识。

4 Page

数据库文件在 Linux 平台被划分为默认 8K 固定长度的 page 进行治理,通过启动参数 BLCKSZ 能够预设 page 的大小。如果 page 设低了,雷同数据量的文件须要决裂成更多的 page,IO 次数和索引决裂次数都会减少,性能会升高较多;如果 page 设高了,page 外部的数据检索效率会升高,性能一样会升高不少,一般来说 8K 和 16K 对于数据库系统来说是最优解。

三 数据目录

数据目录默认在 /var/lib/pgsql/data 下,反对应用环境变量 $PG_DATA 治理。下图所示是数据目录的一级构造,后续会重点介绍具备代表性的重要文件和目录,比方 base、pg_xact 等。

四 base

1 概述

base 目录存储用户创立的数据库文件,及隶属于用户数据库的所有关系,比方表、索引等。

2 一级目录

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

3 二级文件

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

4 主数据文件

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

当关系文件大小低于 RELSEG_SIZE × BLCKSZ 时,数据库引擎创立名称为 pg_class.relfilenode 的单文件,反之会切分为名称如 pg_class.relfilenode.segno 的多个文件。单个关系文件外部被划分为默认 8K 固定大小的多个 page 并存储在磁盘上,8K 能够在 initdb 时通过 BLCKSZ 参数批改配置。主数据文件写入时,会先将元组数据从行指针数组的底部开始重叠,直到空间耗尽。

用户通过 SQL 查问到的单行数据记录对应单个元组(tuple),因为 MVCC 机制的起因,元组可能是无奈查问到旧版本数据,也可能是沉闷的新版本数据,旧版本数据会在将来的某个时刻被清理。当查问没有命中索引触发程序扫描时,数据库引擎程序扫描 page 的行指针读取到元组,反之如果命中 B 树索引,引擎会通过索引文件的元组,通过索引键的 TID 值读取到元组。

下图是主数据文件的层级构造。

下表格是上图所示 page 内部结构的元数据信息。

下表格是上图所示 tuple 内部结构的元数据信息。

5 FSM

FSM 是闲暇空间映射文件,记录着 heap 和 index 的每个 page 的闲暇空间信息,有利于疾速定位到有短缺闲暇空间的 page 以便存储 tuple,如果没有定位到则须要扩大新 page。除了 Hash Index 文件没有 FSM 文件,其余 heap 和 index 都须要 FSM 文件。

总体上,FSM 采纳 3 - 4 级多叉树的构造组织 FSM page,单个 FSM page 外部采纳齐全二叉树的构造进行治理,高级别 FSM page 的叶子节点关联低级别的 FSM page,低级别 FSM Page 的叶子节点存储着 heap、index page 的可用空间数目,而非叶子结点顺次存储叶子节点的最大可用空间数目,每个节点占用 1 个字节。

6 VM

VM 是可见性映射文件,记录着每个 heap page 的可见性信息,因而 index page 并没有 vm 文件。一方面它能够进步 vacumn 的执行效率,另一方面通过 vm 文件能够感知到 page 内的元组是否全副可见,如果全副可见的话,查问引擎查问索引元组间接获取到数据即可,不用再拜访数据元组查看可见性,缩小了回表次数,极大晋升了查问的效率。

VM 采纳位图的构造存储可见性信息,每个 heap page 只在 vm 文件中存储 2 位,第一位代表元组是否全副可见,第二位代表元组是否全副被解冻。

#define VISIBILITYMAP_ALL_VISIBLE  0x01
#define VISIBILITYMAP_ALL_FROZEN  0x02

五 global

1 概述

global 目录存储 pg_control 及数据库集群维度的数据库及其关系,非客户维度的数据,例如 pg_database、pg_class 等。目录内的文件构造和 base 是统一的。

global 目录文件构造如下图所示。

2 pg_control

pg_control 文件记录数据库集群管制信息,包含 initdb 初始化、WAL 和 checkpoint 的信息。

六 pg_wal

1 概述

pg_wal 是 WAL 机制中的 wal 日志存储目录。PG10 及之后的高版本改目录名为 pg_wal,10 之前目录名称是 pg_xlog。

2 WAL 机制

Write-Ahead-Logging:日志后行机制。数据变更优先写入日志文件,事务失败则变更记录被疏忽,事务胜利再抉择适合机会写入数据文件,数据的刷盘速度慢于日志刷盘速度。当数据库系统解体后,引擎会从上一次胜利的 checkpoint 点开始顺次重放 wal 记录,如果 LSN>pd_lsn 则重放 wal 记录,反之跳过,确保数据记录复原到解体前的状态。

3 文件构造

4 wal segment

wal 段文件存储着数据库行记录明细,每一条记录明细都是服务于数据库复原操作的,确保前后数据统一。首先针对数据的任意一次批改操作均被记录在 wal 段文件中,包含 insert、update 和 delete,其次零碎的一些治理行为也会被记录在 wal 段文件中,例如事务提交和 vacuum 等行为。

wal 段文件命名形如 00000001 00000001 00000092,文件名共 24 位,前 8 位是 timeline,两头 8 位是 logid,后 8 位是 logseg,logseg 的前 6 位始终是 0,后 2 位是 lsn 的前 2 位。依据 wal 段文件名的最初 2 位,wal 记录依据对应的 LSN 别离记录在不同的 wal 段文件中。

5 history

.history 文件内容包含原.history 文件,以后工夫线切换记录和切换起因,作用于数据库的工夫点复原行为。当数据库引擎从多个工夫线的备份中复原时,数据库从.history 文件中找到从 pg_control 的 start_timeline 到指定的 recovery_target_timeline 间的所有 wal 段文件进行复原。

6 archive_status

archive_status 是 wal 段文件的备份目录,包含.ready 和.done 文件。超出 wal_keep_segments 数目限度的 wal 日志会在 archive_status 目录内被打标,归档操作实现后被进一步移除。

7 .ready

.ready 是同名 wal 段文件在 archive_status 目录内的标记文件,代表该 wal 段文件可被归档。wal 段文件在数据目录中的存储文件数量是有下限的,个别通过 wal_keep_segments 参数来束缚,因而数据库引擎在 wal 段文件个数达到下限后会在 archive_status 目录内减少可移除的 wal 段文件的标记文件,文件名是原 wal 段文件名后减少.ready 后缀,期待归档工具进行归档。

8 .done

.done 是同名 wal 段文件在 archive_status 目录内的标记文件,代表该 wal 段文件已被归档,能够被清理。数据库引擎默认通过 archive_command 命令对.ready 文件进行归档,归档胜利与否取决于 archive_command 命令返回 true 还是 false,当 archive_command 返回 true 时,代表与.ready 文件同名的 wal 段文件已被归档,引擎再将该文件的扩展名重命名为.done,期待数据库引擎在下一次的 checkpoint 时进一步清理原 wal 段文件。

七 pg_xact

1 概述

pg_xact 是事务提交日志(Commit Log)的存储目录,事务提交日志默认 256KB,文件名形如 NNNN,零碎初始化后从 0000 开始递增至 FFFF。PG 10 及之后的高版本改目录名为 pg_xact,10 之前目录名称是 pg_clog。

下图是 pg_xact 目录下的 clog 文件,027E 前的文件因为事务已被解冻,所以被 vacuum 清理结束。

2 Commit Log

事务提交日志存储数据库的单个事务运行状态。Commit Log 由共享内存中一组 8KB 的 page 组成,每个 page 蕴含一列数组,每个数组元素蕴含 XID 和该事物的实时状态。当 page 有余时,创立新的 page 来存储新的事务。

八 配置文件

1 postgresql.conf

postgresql.conf 文件存储着配置文件的地位、资源限度、集群复制等参数数据,是数据库运行时最重要的配置文件。

2 postgresql.auto.conf

postgresql.auto.conf 文件存储着数据库的全局配置参数,数据库引擎在启动时加载 postgresql.auto.conf 文件后,笼罩 postgresql.conf 文件中已有的配置,造成最终的数据库启动配置。

3 pg_hba.conf

pg_hba.conf 文件负责客户端的连贯和认证,起到防火墙的作用,格局是:TYPE / DATABASE / USER / ADDRESS / METHOD。

九 总结

本文从肉眼可见的数据目录及其子文件开始开展,由浅入深直到不可见的源码构造体维度,具体介绍了数据目录及其子文件的构造和作用。大家通过理解数据目录的文件体系结构,可能对 PostgreSQL 数据库全貌有个总体概览,无论是日常运维、内核研发,还是业务开发,这些都是必须把握的基础知识。

原文链接
本文为阿里云原创内容,未经容许不得转载。

正文完
 0