当前位置: 首页 > 科技观察

PostgreSQL数据目录深度揭秘_0

时间:2023-03-12 06:51:28 科技观察

1.概述PostgreSQL是一个非常强大的、开源的客户端/服务器关系数据库管理系统(RDBMS)。PostgreSQL被业界誉为“先进的开源数据库”,支持NoSQL数据。类型(JSON/XML/hstore),主要针对企业查询复杂SQL的OLTP业务场景,提供PostGIS地理信息引擎、阿里云自研多维多模态时空信息引擎等。本文重点介绍PostgreSQL的数据目录,存放配置文件、数据文件、事务日志、WAL日志等重要文件。客户创建的所有数据文件和初始配置文件都可以在数据目录中找到,因此数据目录很重要,客户价值所在。二、名词1.OID数据库对象是数据库存储或引用的数据结构,数据库本身也是数据库对象,包括表、索引、视图、序列和函数。ObjectID是数据库对象的唯一标识,存储在一个无符号的四字节整型变量中。所有数据库对象都对应一个OID。PostgreSQL有两个视图,各司其职,分别存储不同类型的OID。其中pg_database存放的是数据库本身对象的OID,pg_class存放的是表、索引、序列等对象的OID。2、Relation关系表示数据库本身以外的数据库对象,包括表、视图、索引、toasts,不包括数据库本身。3、MVCCMulti-Version-Concurrency-Control是一种并发控制机制。数据库引擎根据不同的事务隔离级别,通过查询事务快照和事务提交日志来完成元组的可见性检查。如果你想了解数据库机制的原理,MVCC是必不可少的学习知识。4、页面数据库文件在Linux平台默认分为8K定长页面进行管理,页面大小可通过启动参数BLCKSZ预设。如果page设置的低,同样数据量的文件需要拆分成更多的page,IO和indexsplit的次数会增加,性能下降更多;如果页面设置的高,页面内部的数据检索效率会降低,性能也会下降。也会减少很多。一般来说,8K和16K是数据库系统的最优方案。3.数据目录数据目录默认在/var/lib/pgsql/data下,支持使用环境变量$PG_DATA进行管理。下图显示了数据目录的一级结构。下面将重点介绍具有代表性的重要文件和目录,如base、pg_xact等。4.base1。概述基目录存放用户创建的数据库文件和属于用户数据库的所有关系,如表、索引等。2、一级目录的目录结构分为两级。一级结构如下图所示。一级目录名称为用户数据库对象的OID,1代表postgres数据库。一级目录下的二级子文件是属于这个数据库对象的Relationships,包括表、索引、视图等。3.二级文件二级子文件,如下图所示,将所有的关系存储在一个数据库中,包括表、索引、视图等。这里以postgres数据库目录为例。二级子文件分为三类。第一类是以关系OID命名的主数据文件。第二类是文件名以_fsm结尾的空闲空间映射文件。第三类是以_vm结尾的文件名。可见性地图文件。4、主数据文件主数据文件存放在对应数据库下的数据库关系文件中,包括数据、索引等,客户最重要的业务数据存放在主数据文件中。当关系文件大小小于RELSEG_SIZE×BLCKSZ时,数据库引擎创建一个名为pg_class.relfilenode的单个文件,否则它将被分成多个名为pg_class.relfilenode.segno的文件。单个关系文件在内部被分成多个页面,默认大小固定为8K,存储在磁盘上。8K可以通过修改initdb时的BLCKSZ参数来配置。当写入主数据文件时,元组数据将从行指针数组的底部开始堆叠,直到空间耗尽。用户通过SQL查询到的单行数据记录对应一个元组。由于MVCC机制,元组可能无法查询到旧版本的数据,也可能是活跃的新版本数据。旧版本的数据会在未来发布的时候被清理干净。当查询没有命中索引触发顺序扫描时,数据库引擎顺序扫描页面的行指针来读取元组。反之,如果命中了B树索引,则引擎通过索引文件的元组和索引键的TID值来读取元组。团体。下图显示了主数据文件的层次结构。下表是上图页面内部结构的元数据信息。下表是上图所示元组内部结构的元数据信息。5、FSMFSM是一个空闲空间映射文件,记录了heap和index的每个page的空闲空间信息,有利于快速定位到一个空闲空间充足的page来存放tuples。如果没有找到,需要展开一个新的页面。除了HashIndex文件没有FSM文件外,其他堆和索引都需要FSM文件。一般来说,FSM采用3-4级的多叉树结构来组织FSM页面。单个FSM页面在内部使用完整的二叉树结构进行管理。高层FSM页的叶子节点与低层FSM页相关联,低层FSM页的叶子节点存储堆和索引页的可用空间数,而非叶子节点存储最大数目依次计算叶节点的可用空间,每个节点占用1个字节。6.VMVM是一个可见性映射文件,记录了每个heappage的可见性信息,所以indexpage没有vm文件。一方面可以提高vacuum的执行效率。另一方面,通过vm文件可以感知页面中的元组是否全部可见。如果它们都是可见的,则查询引擎可以通过查询索引元组直接获取数据,而无需访问数据。元组检查的可见性减少了表的返回次数,大大提高了查询效率。VM使用位图结构来存储可见性信息。每个堆页在vm文件中只存储2位。第一位表示是否所有的元组都可见,第二位表示是否所有的元组都被冻结。#defineVISIBILITYMAP_ALL_VISIBLE0x01#defineVISIBILITYMAP_ALL_FROZEN0x02五、global1。概述global目录存放pg_control和database集群维度数据库及其关系,以及非客户维度数据,如pg_database、pg_class等,目录下的文件结构与base一致。全局目录文件结构如下图所示。2、pg_controlpg_control文件记录了数据库集群控制信息,包括initdb初始化、WAL和checkpoint信息。6.pg_wal1。概述pg_wal是WAL机制中的wal日志存放目录。PG10及以后的高版本将目录名改为pg_wal,PG10之前的目录名为pg_xlog。2.WAL机制Write-Ahead-Logging:日志优先机制。数据更改首先写入日志文件。如果事务失败,更改记录将被忽略。如果事务成功,它会在适当的时候写入数据文件。数据刷新速度比日志刷新速度慢。当数据库系统崩溃时,引擎会从最后一个成功的checkpoint点开始依次重放wal记录。如果LSN>pd_lsn,将重放wal记录,否则跳过,保证数据记录恢复到崩溃前的状态。3.文件结构4.walsegmentwal段文件存储数据库行记录明细,每条记录明细服务于数据库恢复操作,保证前后数据一致。首先,任何数据修改操作都记录在wal段文件中,包括insert、update、delete。其次,系统的一些管理行为也记录在wal段文件中,比如交易提交、vacuum等。wal段文件命名为000000010000000100000092,文件名一共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_statusarchive_status是wal段文件的备份目录,包括.ready和.done文件。超过wal_keep_segments限制的wal日志会在archive_status目录中进行标记,在归档操作完成后进一步清除。7.ready.ready是archive_status目录下同名wal段文件的标记文件,表示wal段文件可以归档了。data目录下存放的wal段文件数量有上限,一般受wal_keep_segments参数约束,所以数据库引擎会在wal段文件数量达到上限后在archive_status目录下添加可移除的wal段文件标记limit文件,文件名是原wal段文件名加上.ready后缀,等待归档工具归档。8.done.done是archive_status目录下同名wal段文件的标记文件,表示wal段文件已经归档,可以清理了。数据库引擎默认通过archive_command命令对.ready文件进行归档。归档是否成功取决于archive_command命令返回true还是false。当archive_command返回true时,表示与.ready文件同名的wal段文件已经归档。文件的扩展名改名为.done,等待数据库引擎在下一个检查点进一步清理原来的wal段文件。7.pg_xact1。概述pg_xact是事务提交日志(CommitLog)的存放目录。事务提交日志的默认大小为256KB,文件名格式为NNNN。PG10及以后的高版本将目录名改为pg_xact,PG10之前的目录名为pg_clog。下图是pg_xact目录下的clog文件。027E之前的文件已经被vacuum清理掉了,因为事务已经被冻结了。2.CommitLog事务提交日志存储了数据库中单个事务的运行状态。CommitLog由共享内存中的一组8KB的页面组成,每个页面包含一个数组,每个数组元素包含XID和事物的实时状态。当页面不足时,创建一个新的页面来存储新的交易。八、配置文件1.postgresql.confpostgresql.conf文件存放配置文件的位置、资源限制、集群复制等参数数据,是数据库运行时最重要的配置文件。2.postgresql.auto.confpostgresql.auto.conf文件存放了数据库的全局配置参数。数据库引擎在启动时加载postgresql.auto.conf文件后,会覆盖postgresql.conf文件中已有的配置,形成最终的数据库启动配置。3.pg_hba.confpg_hba.conf文件负责客户端连接和认证,起到防火墙的作用。格式为:TYPE/DATABASE/USER/ADDRESS/METHOD。9.总结本文从肉眼可见的数据目录及其子文件入手,由浅入深到不可见的源码结构维度,介绍数据目录及其子文件的结构和作用-文件详细。通过了解数据目录的文件结构,可以对PostgreSQL数据库有一个整体的了解。无论是日常运维、内核研发,还是业务开发,这些都是必须要掌握的基础知识。