PG体系结构之物理结构

0    1132    3

Tags:

👉 本文共约5958个字,系统预计阅读时间或需23分钟。

PG内存结构请参考:https://www.dbaup.com/pgtixijiegouzhineicunjiegou.html

简介

  • PostgreSQL由一系列数据库组成。
  • 一套PostgreSQL程序称之为一个数据库群集。PG中的集群,也即database cluster,是由PostgreSQL服务端来管理的一组数据库(database)的集合。注意这里是数据库(database)的集合,不是数据库服务(database servers)的集合。一个PostgreSQL服务器运行在单个主机上,管理单个数据库集群。
  • 当initdb命令执行初始化数据库后,template0 , template1,和postgres数据库被创建。
  • template0和template1数据库是创建用户数据库时使用的模版数据库,他们包含系统元数据表。
  • initdb()刚完成后,template0和template1数据库中的表是一样的。但是template1数据库可以根据用户需要创建对象。用户数据库是通过克隆template1数据库来创建的
  • initdb()后马上创建pg_default和pg_global表空间
  • 建表时如果没有指定特定的表空间,表默认被存在pg_default表空间中。
  • 用于管理整个数据库集群的表默认被存储在pg_global表空间中。
  • pg_default表空间的物理位置为$PGDATA\base目录。
  • pg_global表空间的物理位置为$PGDATA\global目录。
  • 一个表空间可以被多个数据库同时使用。此时,每一个数据库都会在表空间路径下创建为一个新的子路径。
  • 创建一个用户表空间会在$PGDATA\pg_tblspc目录下面创建一个软连接,连接到表空间制定的目录位置。
  • 在PG中,当应用连接到一个数据库时,一般只能访问这个数据库中的数据,而不能访问其他数据库中的数据(除非使用dblink等其他手段)
  • 在PG中,表的术语称为“Relation”,而在其他数据库中叫“Table”
  • 在PG中,行的术语为“Tuple”,而在其他数据库中叫“Row”
  • 在PG中,服务端不支持汉字字符集GBK和GB18030

物理结构

实际上,pg的数据库集群本质上是一个目录。目录中包含一些子目录和很多的文件。在我们安装pg时,我们一般使用initdb的命令去初始化一个新的数据库集群。initdb 有个-D参数,通过它来指定应该存储数据库集群的目录。而集群中的database对应$PGDATA/base目录下的一个文件夹,文件夹的名称即oid。

$PGDATA目录下的文件和子目录的布局:

物理文件或文件夹名解释
PG_VERSION包含PG大版本号的文件
postgresql.auto.conf用于存储由ALTER SYSTEM设置的配置参数
postmaster.opts记录服务器上次启动时使用的命令行参数的文件
postmaster.pid一个锁文件,记录当前postmaster进程的pid,cluster data目录路径,postmaster进程启动时的时间戳,端口号,Unix-domain socket目录路径,有效的listen_address(ip地址或者*,如果为空表示server不基于tcp),共享内存端id。
current_logfiles记录日志采集器当前写入的日志文件的文件
base包含每个数据库的子目录,为默认表空间
global包含集群范围表的子目录,作为共享系统表目录,例如pg_database
pg_commit_ts包含事务提交时间戳数据的子目录
pg_dynshmem包含动态共享内存子系统使用的文件的子目录
pg_logical包含用于逻辑解码的状态数据的子目录
pg_multixact包含多事务状态数据的子目录(用于共享行锁)
pg_notify包含监听/通知状态数据的子目录
pg_replslot包含复制槽位数据的子目录
pg_serial包含关于已提交的可序列化事务信息的子目录
pg_snapshots导出快照的子目录
pg_stat包含统计子系统永久文件的子目录
pg_stat_tmp包含统计子系统临时文件的子目录
pg_subtrans包含子事务状态数据的子目录
pg_tblspc包含到表空间的符号链接的子目录
pg_twophase包含已准备事务状态文件的子目录
pg_wal包含WAL (Write Ahead Log)文件的子目录
pg_xact包含事务提交状态数据的子目录

数据库包含的文件种类:
√数据库文件:位置在$PGDATA/base目录下,数据库对象,如:数据库、表,索引,序列等对象。
√控制文件:用来记录数据库集群的状态信息,如:版本信息、集群所管理的各种文件信息、检查点信息、事务状态信息等
√参数文件:位置在$PGDATA目录下
√日志文件:记录数据修改操作的日志,用于系统发生故障时进行数据恢复。
√临时文件:存放数据库进行计算的过程中,生成的各种中间对象,如排序运算的外存归并单元。

相关物理文件

postmaster.pid :这个文件存在于数据目录中是为了帮助pg_ctl判断服务器当前是否在运行。

控制文件

PostgreSQL 控制文件在$PGDATA/global目录下名为pg_control

PG控制文件pg_control里存储的数据是一个ControlFileData结构。控制文件尽量保持小于512个字节以使其适合一个典型的磁盘驱动的物理簇的大小。这会减少由于电源故障而写控制文件直接失败的可能性。但控制文件的物理大小是8K,远大于512个字节。这样做是为了控制文件格式变化时保持物理大小不变,如果正在读一个不兼容文件,以使ReadControlFile能传递一个合适的错误版本控制文件信息而代替一个读错误。系统里定义了和自己匹配的控制文件版本变量PG_CONTROL_VERSION,启动时会做系统和控制文件的匹配校验

pg_controldata命令可以显示出控制文件中内容:

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复