postgresql

postgresql

一 概述

PostgreSQL是一个客户机/服务器关系数据库管理系统(RDBMS ),具有非常强大的功能和开放源代码。PostgreSQL被业界誉为“高级开源数据库”,支持NoSQL数据类型(JSON/XML/hstore),主要针对企业复杂查询SQL的OLTP业务场景,提供了PostGIS地理信息引擎、阿里云开发的多维多模块time 空信息引擎等

本文重点研究PostgreSQL的数据目录,其中存放着配置文件、数据文件、事务日志和WAL日志等重要文件。客户创建的所有数据文件和初始配置文件都可以在数据目录中找到,因此数据目录是一个重要的客户价值。

二 名词

1 OID

数据库对象是数据库存储或引用的数据结构,数据库本身也是数据库对象,包括表、索引、视图、序列和函数。对象ID是数据库对象的唯一标识符,它存储在一个无符号的四字节整数变量中,所有数据库对象都对应一个OID。PostgreSQL有两个视图,每个视图保存不同类型的oid,其中pg_database保存数据库本身对象的oid,pg_class保存表、索引、序列等对象的oid。

2关系

关系表示不是数据库本身的数据库对象,包括表、视图、索引、toast等。,不包括数据库本身。

3 MVCC

多版本并发控制是一种并发控制机制。根据不同的事务隔离级别,数据库引擎通过查询事务快照和事务提交日志来检查元组的可见性。如果想了解数据库机制的原理,MVCC是必不可少的学习知识。

4页

数据库文件在Linux平台上默认8K定长页面管理,页面大小可以通过启动参数BLCKSZ预置。如果page设置得低,同样数据量的文件需要拆分成更多的页面,IO和索引拆分的数量会增加,性能降低的更多。如果页面设置高了,页面内的数据检索效率会降低,性能会降低很多。一般来说,8K和16K是数据库系统的最佳解决方案。

三 数据目录

默认情况下,数据目录位于/var/lib/pgsql/data下,支持使用环境变量$PG_DATA进行管理。下图显示了数据目录的一级结构,以及重要的代表文件和目录,如base、pg_xact等。,后面会重点介绍。

四 base

1概述

基本目录存储用户创建的数据库文件,以及属于用户数据库的所有关系,如表和索引。

2一级目录

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

3二级文件

如下图所示,二级子文件存储了数据库中的所有关系,包括表、索引、视图等。这里以postgres数据库目录为例。二级子文件分为三类。第一类是以关系OID命名的主数据文件,第二类是文件名以_f结尾的空 free 空映射文件,第三类是文件名以_vm结尾的可见性映射文件。

4主数据文件

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

当关系文件大小小于RELSEG_SIZE × BLCKSZ时,数据库引擎会创建一个名为pg_class.relfilenode的单个文件,否则它会被分成多个文件名为pg_class.relfilenode.segno的文件,一个单个关系文件会被分成几个缺省固定大小为8K的页面并存储在磁盘上。8K可以在initdb通过BLCKSZ参数修改配置。当主数据文件被写入时,元组数据将从行指针数组的底部开始堆叠,直到在空之间用尽。

用户通过SQL查询的单行数据记录对应单个元组。由于MVCC机制,元组可能无法查询旧版本数据,也可能是活动的新版本数据,旧版本数据将在未来的某个时间点被清理。当查询没有命中索引并触发顺序扫描时,数据库引擎顺序扫描页面的行指针并读取元组;否则,如果它命中B树索引,引擎将通过索引文件的元组和索引键的TID值读取元组。

下图显示了主数据文件的层次结构。

下表是上图页面内部结构的元数据信息。

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

5 F

F是空 leisure 空之间的映射文件,记录了堆和索引每个页面的空 leisure 空之间的信息,有利于快速定位空 leisure足够的页面用于存储元组。除了哈希索引文件没有F文件,所有堆和索引都需要F文件。

一般来说,F采用3-4级多叉树结构组织F页面,单个F页面由一个完整的二叉树结构管理。高级F页的叶节点与低级F页相关联,低级F页的叶节点存储堆和索引页的可用空个数,非叶节点依次存储叶节点的最大可用空个数。

6台虚拟机

Vm是一个可见性映射文件,记录了每个堆页的可见性信息,所以索引页中没有VM文件。一方面可以提高vacumn的执行效率;另一方面,它可以通过vm文件感知页面中的元组是否都可见。如果都是可见的,查询引擎可以查询索引元组,直接获取数据,不需要访问数据元组检查可见性,减少了表返回次数,大大提高了查询效率。

Vm使用位图结构存储可见性信息,每个堆页在VM文件中只存储2位。第一位表示所有元组是否可见,第二位表示所有元组是否冻结。

# define visibility Map _ All _ Visible 0x 01 # define visibility Map _ All _ Frozen 0x 02五个全局概述1

全局目录存储pg_control和数据库集群维度及其关系的数据库,以及非客户维度的数据,如pg_database和pg_class。目录中的文件结构与base一致。

全局目录文件结构如下图所示。

2pg _控制

pg_control文件记录数据库集群控制信息,包括initdb初始化、WAL和检查点信息。

六 pg_wal

1概述

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

2沃尔机制

预写日志:日志优先机制。数据更改首先被写入日志文件,如果事务失败,更改记录将被忽略。当事务成功后,在合适的时间写入数据文件,数据刷的速度比日志慢。当数据库系统崩溃时,引擎将从最后一个成功的检查点开始依次重放wal记录。如果LSN >;Pd_lsn重放wal记录,否则跳过它,以确保数据记录恢复到崩溃前的状态。

3文件结构

4沃尔细分市场

wal段文件存储数据库行记录明细,每个记录明细服务于数据库恢复操作,保证前后数据的一致性。首先,任何数据修改操作都记录在wal段文件中,包括插入、更新和删除。其次,系统的一些管理行为也记录在wal段文件中,比如事务提交、真空等。

wal段的文件名是000000001 00000001 0000092,文件名有24位,前8位是timeline,中间8位是logid,后8位是logseg,logseg的前6位总是0,后2位是lsn的前2位。根据wal段文件名的后两位数字,将wal记录按照对应的LSN记录在不同的wal段文件中。

5 .历史

的内容。历史文件包括原件。历史文件、当前时间线切换记录和切换原因,以及作用于数据库的时间点恢复行为。当数据库引擎从多个时间线的备份中恢复时,数据库会查找从pg_control的start_timeline到中指定的recovery_target_timeline的所有wal段文件。用于恢复的历史文件。

6存档_状态

Archive_status是wal段文件的备份目录,包括。准备好了。完成文件。超过Wal_keep_segments数量限制的wal日志将在archive_status目录中进行标记,并在归档操作完成后进一步删除。

7 .准备好的

。ready是archive_status目录中同名的wal段文件的标记文件,表示wal段文件可以归档了。wal_keep_segments参数对数据目录中存储的文件数有上限,所以数据库引擎会在wal段文件数达到上限后,在archive_status目录中添加一个wal段文件的可移除标记文件,文件名会在原wal段文件名后添加一个. ready后缀,等待归档工具归档。

8 .完成的

。done是archive_status目录下同名的wal段文件的标记文件,表示wal段文件已经归档,可以清理了。默认情况下,数据库引擎将。ready文件,而存档成功与否取决于archive_command返回true还是false。当archive_command返回true时,意味着与。ready文件已存档,引擎将该文件的扩展名重命名为。done,等待数据库引擎在下一个检查点进一步清理原始wal段文件。

七 pg_xact

1概述

Pg_xact是事务提交日志的存储目录。事务提交日志的缺省值是256KB,文件名是NNNN,在系统初始化后从0000递增到FFFF。PG 10及以后版本的目录名改为pg_xact,10之前的目录名为pg_clog。

下图是pg_xact目录下的clog文件。027E之前的文件已被真空清理,因为事务已被冻结。

2提交日志

事务提交日志将单个事务的运行状态存储在数据库中。提交日志由共享内存中的一组8KB的页面组成,每个页面包含一列数组,每个数组元素包含XID和事情的实时状态。当页面不足时,创建一个新页面来存储新事务。

八 配置文件

1 postgresql.conf

Postgresql.conf文件是数据库运行时最重要的配置文件,存储了配置文件的位置、资源约束、集群复制等参数数据。

2 postgresql.auto.conf

postgresql.auto.conf文件存储数据库的全局配置参数。数据库引擎在启动时加载postgresql.auto.conf文件后,会覆盖postgresql.conf文件中的现有配置,以形成最终的数据库启动配置。

3 pg_hba.conf

pg_hba.conf文件负责客户端的连接和身份验证,并充当防火墙。格式为:类型/数据库/用户/地址/方法。

九 总结

本文详细介绍了数据目录及其子文件的结构和功能,从可见的数据目录及其子文件入手,从浅层到不可见的源代码结构维度。通过了解数据目录的文件系统结构,可以对PostgreSQL数据库有一个整体的概述,无论是日常运维,内核研发,还是业务开发,这些都是必须掌握的基础知识。

作者|印石

原文链接:http://click.aliyun.com/m/1000292761/

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论