合 PG体系结构之物理结构
Tags: PG体系结构密码文件控制文件口令文件日志文件物理文件物理结构
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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | lhrdb=# SELECT datname, oid FROM pg_database; datname | oid -----------+------- postgres | 12661 lhrdb | 16384 template1 | 1 template0 | 12660 repmgr | 16386 (5 rows) [root@lhrrepmgr64361 base]# ll total 28 drwx------ 2 pg13 pg13 4096 Apr 26 17:02 1 drwx------ 2 pg13 pg13 4096 Apr 26 17:02 12660 drwx------ 1 pg13 pg13 4096 Apr 29 11:10 12661 drwx------ 2 pg13 pg13 4096 Apr 28 19:04 16384 drwx------ 2 pg13 pg13 4096 Apr 28 18:52 16386 drwx------ 2 pg13 pg13 4096 Apr 28 17:36 pgsql_tmp [root@lhrrepmgr64361 base]# pwd /pg13/pgdata/base |
$PGDATA
目录下的文件和子目录的布局:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | [root@lhrrepmgr64361 pgdata]# ll total 156 drwx------ 1 pg13 pg13 4096 Apr 28 17:35 base -rw------- 1 pg13 pg13 33 Apr 29 00:00 current_logfiles drwx------ 1 pg13 pg13 4096 Apr 29 11:10 global drwx------ 2 pg13 pg13 4096 Apr 26 17:02 pg_commit_ts drwx------ 2 pg13 pg13 4096 Apr 26 17:02 pg_dynshmem -rw------- 1 pg13 pg13 455 Apr 28 17:29 pg_hba.conf -rw------- 1 pg13 pg13 1636 Apr 26 17:02 pg_ident.conf drwx------ 1 pg13 pg13 4096 Apr 29 00:00 pg_log drwx------ 1 pg13 pg13 4096 Apr 28 19:12 pg_logical drwx------ 1 pg13 pg13 4096 Apr 26 17:02 pg_multixact drwx------ 2 pg13 pg13 4096 Apr 26 17:02 pg_notify drwx------ 1 pg13 pg13 4096 Apr 28 17:36 pg_replslot drwx------ 2 pg13 pg13 4096 Apr 26 17:02 pg_serial drwx------ 2 pg13 pg13 4096 Apr 26 17:02 pg_snapshots drwx------ 1 pg13 pg13 4096 Apr 28 18:52 pg_stat drwx------ 1 pg13 pg13 4096 Apr 29 11:28 pg_stat_tmp drwx------ 1 pg13 pg13 4096 Apr 26 17:02 pg_subtrans drwx------ 2 pg13 pg13 4096 Apr 26 17:02 pg_tblspc drwx------ 2 pg13 pg13 4096 Apr 26 17:02 pg_twophase -rw------- 1 pg13 pg13 3 Apr 26 17:02 PG_VERSION drwx------ 1 pg13 pg13 4096 Apr 28 19:07 pg_wal drwx------ 1 pg13 pg13 4096 Apr 26 17:02 pg_xact -rw------- 1 pg13 pg13 201 Apr 28 18:52 postgresql.auto.conf -rw------- 1 pg13 pg13 28588 Apr 28 17:27 postgresql.conf -rw------- 1 pg13 pg13 44 Apr 28 18:52 postmaster.opts -rw------- 1 pg13 pg13 78 Apr 28 19:07 postmaster.pid |
物理文件或文件夹名 | 解释 |
---|---|
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命令可以显示出控制文件中内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | [root@lhrrepmgr64361 /]# su - pg13 Last login: Fri Apr 30 15:36:24 CST 2021 on pts/4 [pg13@lhrrepmgr64361 ~]$ cd $PGDATA [pg13@lhrrepmgr64361 pgdata]$ cd global/ [pg13@lhrrepmgr64361 global]$ ll pg_control -rw------- 1 pg13 pg13 8192 May 1 01:07 pg_control [pg13@lhrrepmgr64361 global]$ pg_controldata pg_control version number: 1300 Catalog version number: 202007201 Database system identifier: 6955389182321723814 Database cluster state: in production pg_control last modified: Sat 01 May 2021 01:07:41 AM CST Latest checkpoint location: 1/22A131E8 Latest checkpoint's REDO location: 1/22A131B0 Latest checkpoint's REDO WAL file: 0000000D0000000100000022 Latest checkpoint's TimeLineID: 13 Latest checkpoint's PrevTimeLineID: 13 Latest checkpoint's full_page_writes: on Latest checkpoint's NextXID: 0:47603 Latest checkpoint's NextOID: 16502 Latest checkpoint's NextMultiXactId: 1 Latest checkpoint's NextMultiOffset: 0 Latest checkpoint's oldestXID: 478 Latest checkpoint's oldestXID's DB: 1 Latest checkpoint's oldestActiveXID: 47603 Latest checkpoint's oldestMultiXid: 1 Latest checkpoint's oldestMulti's DB: 1 Latest checkpoint's oldestCommitTsXid:0 Latest checkpoint's newestCommitTsXid:0 Time of latest checkpoint: Sat 01 May 2021 01:07:41 AM CST Fake LSN counter for unlogged rels: 0/3E8 Minimum recovery ending location: 0/0 Min recovery ending loc's timeline: 0 Backup start location: 0/0 Backup end location: 0/0 End-of-backup record required: no wal_level setting: replica wal_log_hints setting: on max_connections setting: 100 max_worker_processes setting: 8 max_wal_senders setting: 10 max_prepared_xacts setting: 0 max_locks_per_xact setting: 64 track_commit_timestamp setting: off Maximum data alignment: 8 Database block size: 8192 Blocks per segment of large relation: 131072 WAL block size: 8192 Bytes per WAL segment: 16777216 Maximum length of identifiers: 64 Maximum columns in an index: 32 Maximum size of a TOAST chunk: 1996 Size of a large-object chunk: 2048 Date/time type storage: 64-bit integers Float8 argument passing: by value Data page checksum version: 0 Mock authentication nonce: f68708343514d8430e9188b5d44be0cd9c90ccbe7fb15a82427dfa8af2c6010e |
pg_control version number:控制文件的版本
Catalog version number:系统表版本号,PG9.4版本为201409291.PG版本由三个数字表示“X.Y.Z”,通常有重大功能变化X才会发生变化,Y变化通常指系统表发生了变化,Z变化系统表不会变化。若只是Z变化,通常只需要把二进制程序升级一个就可以,系统表没有变化,数据文件就是可以兼容
Maximum data alignment:数据结构最大的对齐值
Database block size:数据块的大小
Blocks per segment of large relation:在一些文件系统上,单个文件大小受限制,PG会把一个表的数据分到多个数据文件中存储,此值制定了每个数据文件最多多少个数据块,默认为131072个块,每个块8k,数据文件最大为1G
WAL block size:WAL日志块大小
Bytes per WAL segment:WAL日志块大小
Maximum length of identifiers:“name”类型的长度,实际上指一些数据库对象名称的最大长度,如表名、索引名的最大长度
Maximum columns in an index:一个索引最多多少列,目前为32个
Maximum size of a TOAST chunk:TOAST chunk的长度
本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!