体系架构
前言
在PostgreSQL的体系架构中,最重要的组成部分是数据的存储结构,而数据的存储结构分为以下两种:
- 逻辑存储结构:数据库内部组织和管理数据的方式。
- 物理存储结构:操作系统中组织的管理数据的方式。
逻辑存储结构
逻辑存储结构主要是指数据库中的各种数据库对象,包括数据库集群、数据库、表、索引、视图等。 所有数据库对象都有各自的对象标识符(Object Identifier, OID)。OID是一个无符号的4字节整数。相关对象的OID都存储在相关的系统目录表中。
数据库集群(Database Cluster)
数据库集群是指由单个PostgreSQL 服务器端实例管理的所有数据库集合。组成数据库集群的所有数据库使用相同的全局配置文件和监听端口,公用数据库的后台进程和内存结构。
一个数据库集群可以包括多个数据库、多个用户,以及数据库中的所有对象。
在文件系统中,一个数据库集群是一个单一目录,该目录被称为数据目录或数据区域,所有数据都被存储在该目录中。
数据库(Database)
在pg中,数据库本身也是数据库对象。不同的数据库在逻辑上彼此分离。处理数据库,其他数据库对象都属于它们各自的数据库。
表空间(Tablespace)
在逻辑上可以将数据库分为多个存储单元,这些存储单元被称作表空间。表空间用来把逻辑上相关的数据结构放在一起。从逻辑上来看,数据库是由一个或多个表空间组成的。
初始化数据库时会自动创建两个表空间,分别为 pg_dfault
和 pg_global
。
模式(Schema)
再创建一个数据库时,会为其自动创建一个名为 public
的默认模式。模式是数据库中的命名空间,在数据库中创建的所有其它数据对象(如表、视图和序列等)都是在模式中创建的。
一个用户可以在同一个客户端连接中访问不同的模式 。而在不同的模式中可以有多个同名的表、索引、视图、序列和函数等不同的数据库对象。
段(Segment)
段时分配给一个数据对象的逻辑存储结构,由一组区间组成。段是数据库对象使用空间的集合。段分为表段、索引段、回滚段、临时段和告诉缓存段等,最常用的是表段和索引段。
区(Extent)
区是数据库存储空间分配的一个逻辑单位,由连续的块组成。如果一个段的所有空间已被占用,那么pg会自动为该段分配一个新的区。
块(Block)
块是pg管理数据文件中存储空间的单位,是数据库使用的IO的最小单位,是最小的逻辑存储单位,默认值为 8KB。
物理存储结构
在初始化数据库完成后,数据目录下会有以下目录和文件。这里以15.3版本为例
-rw------- 1 postgres postgres 3 Jan 18 22:00 PG_VERSION
drwx------ 1 postgres postgres 6 Jan 18 22:00 base
drwx------ 1 postgres postgres 616 Jan 19 20:36 global
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_commit_ts
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_dynshmem
-rw------- 1 postgres postgres 4.8K Jan 18 22:00 pg_hba.conf
-rw------- 1 postgres postgres 1.6K Jan 18 22:00 pg_ident.conf
drwx------ 1 postgres postgres 76 Jan 19 20:40 pg_logical
drwx------ 1 postgres postgres 28 Jan 18 22:00 pg_multixact
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_notify
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_replslot
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_serial
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_snapshots
drwx------ 1 postgres postgres 0 Jan 19 20:35 pg_stat
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_stat_tmp
drwx------ 1 postgres postgres 8 Jan 18 22:00 pg_subtrans
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_tblspc
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_twophase
drwx------ 1 postgres postgres 76 Jan 18 22:00 pg_wal
drwx------ 1 postgres postgres 8 Jan 18 22:00 pg_xact
-rw------- 1 postgres postgres 88 Jan 18 22:00 postgresql.auto.conf
-rw------- 1 postgres postgres 29K Jan 18 22:00 postgresql.conf
-rw------- 1 postgres postgres 36 Jan 19 20:35 postmaster.opts
-rw------- 1 postgres postgres 94 Jan 19 20:35 postmaster.pid
文件和目录说明
文件或目录 | 说明 |
---|---|
PG_VERSION | 版本信息 |
base | 各个数据库文件 |
global | 集群范围的各个表和相关视图 |
pg_commit_ts | 已提交事务的时间 |
pg_dynshmem | 动态共享内存子系统使用的文件 |
pg_hba.conf | 客户端认证控制文件,用于黑白名单的设置 |
pg_ident.conf | 用来配置哪些操作系统用户可以映射为数据库用户 |
pg_logical | 逻辑解码的状态数据 |
pg_multixact | 多事务的状态数据,比如等待锁定的并发事务 |
pg_notify | 包含LISTEN/NOTIFY 状态数据 |
pg_replslot | 复制槽数据 |
pg_serial | 已经提交的序列化事务的有关信息 |
pg_snapshots | 导出的快照 |
pg_stat | 统计子系统的永久文件 |
pg_stat_tmp | 统计子系统的临时文件 |
pg_subtrans | 子事务的状态数据 |
pg_tblspc | 表空间的符号链接信息 |
pg_twophase | 预备事务的状态文件 |
pg_wal | 数据库的预写日志 |
pg_xact | 事务提交的状态数据 |
postgresql.auto.conf | 参数文件,只保留 alter system 命令修改的参数 |
postgresql.conf | 主参数文件 |
postmaster.opts | 记录服务器最后一次启动时使用的命令行参数 |
postmaster.pid | pid文件 |
日志文件
postgresql的日志分为运行日志、预写日志、事务日志和服务器日志。
运行日志
默认情况下,运行日志不开启。postgresql.conf 中相关配置参数有:log_destination
、logging_collector
、log_directory
、log_filename
。
预写日志
pgsql在对数据文件进行修改时,必须先写入预写日志,才能更改数据文件。当数据库因宕机发生数据丢失时,可以根据预写日志来恢复数据。