我想做直播网站该怎么做,标识标牌制作,江门网站seo推广,岳阳网络推广公司简介#xff1a; PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统#xff08;RDBMS#xff09;#xff0c;被业界誉为“先进的开源数据库”#xff0c;支持NoSQL数据类型#xff0c;主要面向企业复杂查询SQL的OLTP业务场景#xff0c;提供…简介 PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统RDBMS被业界誉为“先进的开源数据库”支持NoSQL数据类型主要面向企业复杂查询SQL的OLTP业务场景提供PostGIS地理信息引擎、阿里云自研多维多模时空信息引擎等。本文着重介绍PostgreSQL的数据目录其中保存着配置文件、数据文件、事务日志和WAL日志等重要文件所有客户创建的数据文件和初始配置文件都可以在数据目录中找到因此数据目录是重要的客户价值所在。 作者 | 市隐 来源 | 阿里技术公众号
一 概述
PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统RDBMSPostgreSQL被业界誉为“先进的开源数据库”支持NoSQL数据类型JSON/XML/hstore主要面向企业复杂查询SQL的OLTP业务场景提供PostGIS地理信息引擎、阿里云自研多维多模时空信息引擎等。
本文着重介绍PostgreSQL的数据目录其中保存着配置文件、数据文件、事务日志和WAL日志等重要文件所有客户创建的数据文件和初始配置文件都可以在数据目录中找到因此数据目录是重要的客户价值所在。
二 名词
1 OID
数据库对象是数据库存储或引用的数据结构体数据库本身也是数据库对象同时包括表、索引、视图、序列和函数等。Object ID是数据库对象的唯一标识符保存在无符号四字节的整形变量中所有数据库对象各自对应一个OID。PostgreSQL有两个视图各司其职分别保存着不同类别的OID其中pg_database保存数据库本身对象的OIDpg_class保存表、索引和序列等对象的OID。
2 Relation
关系代表非数据库本身的数据库对象包括表、视图、索引和toast等不包括数据库本身。
3 MVCC
Multi-Version-Concurrency-Control是一种并发控制机制数据库引擎根据不同的事务隔离级别通过查询事务快照和事务提交日志来完成元组的可见性检查。如果希望理解数据库机制原理MVCC是必不可少的学习知识。
4 Page
数据库文件在Linux平台被划分为默认8K固定长度的page进行管理通过启动参数BLCKSZ可以预设page的大小。如果page设低了相同数据量的文件需要分裂成更多的pageIO次数和索引分裂次数都会增加性能会降低较多如果page设高了page内部的数据检索效率会降低性能一样会降低不少一般来说8K和16K对于数据库系统来说是最优解。
三 数据目录
数据目录默认在/var/lib/pgsql/data下支持使用环境变量$PG_DATA管理。下图所示是数据目录的一级结构后续会重点介绍具有代表性的重要文件和目录比如base、pg_xact等。 四 base
1 概述
base目录存储用户创建的数据库文件及隶属于用户数据库的所有关系比如表、索引等。
2 一级目录
目录结构分为两级第一级结构如下图所示一级目录名是用户数据库对象的OID1代表的是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_wal10之前目录名称是pg_xlog。
2 WAL机制
Write-Ahead-Logging日志先行机制。数据变更优先写入日志文件事务失败则变更记录被忽略事务成功再选择合适时机写入数据文件数据的刷盘速度慢于日志刷盘速度。当数据库系统崩溃后引擎会从上一次成功的checkpoint点开始依次重放wal记录如果LSNpd_lsn则重放wal记录反之跳过确保数据记录恢复到崩溃前的状态。
3 文件结构 4 wal segment
wal段文件存储着数据库行记录明细每一条记录明细都是服务于数据库恢复操作的确保前后数据一致。首先针对数据的任意一次修改操作均被记录在wal段文件中包括insert、update和delete其次系统的一些管理行为也会被记录在wal段文件中例如事务提交和vacuum等行为。
wal段文件命名形如00000001 00000001 00000092文件名共24位前8位是timeline中间8位是logid后8位是logseglogseg的前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_xact10之前目录名称是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数据库全貌有个总体概览无论是日常运维、内核研发还是业务开发这些都是必须掌握的基础知识。
原文链接 本文为阿里云原创内容未经允许不得转载。