PG的物理结构
http://ke.sandata.com.cn/course/26/task/379/show
1 数据库的体系架构分解
PostgreSQL体系架构之物理结构
Oracle
mysql
Greenplum
redis
体系架构:
逻辑结构
物理结构
进程结构
内存结构
PG的物理结构:
ORACLE的物理结构:
相关的问题(参数文件 控制文件 密码文件 数据文件|数据 UNDO TEMP REDO)
2 PG的物理结构
本质上都是PG的相关一些文件
- DATABASE CLUSTER 数据库集簇–多个数据库的集合
- BASE目录(包含一系列子目录和文件)

-bash-4.2$ tree -L 1 -d /pgdata/10/data
/pgdata/10/data --数据目录
├── base --表和索引文件存放目录
├── global --影响全局的系统表存放目录
├── pg_commit_ts --事务提交时间戳数据存放目录
├── pg_dynshmem --被动态共享所使用的文件存放目录
├── 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 --日志提交状态的数据存放目录
文件和目录相关作用描述
| files | description |
|---|---|
| PG_VERSION | 包含postgresql主版本号的文件 |
| pg_hba.conf | 控制postgresql客户端验证的文件 |
| pg_ident.conf | 控制postgresql用户名映射的文件 |
| postgresql.conf | 配置参数文件 |
| postgresql.auto.conf | 用于存储在ALTER SYSTEM(版本9.4或更高版本)中设置的配置参数的文件 |
| postmaster.opts | 记录服务端上一次启动的命令行选项 |
| subdirectories | description |
| base/ | 包含每个数据库子目录的子目录 |
| global/ | 包含群集范围表的子目录,例如pg_database和pg_control |
| pg_commit_ts/ | 包含事务提交时间戳数据的子目录。 9.5版本以后 |
| pg_clog/ (Version 9.6 or earlier) | 包含事务提交状态数据的子目录。它在版本10中重命名为pg_xact. CLOG将在5.4章节中详解。. |
| pg_dynshmem/ | 包含动态共享内存子系统使用的文件的子目录。9.4版本以后 |
| pg_logical/ | 包含逻辑解码的状态数据的子目录。9.4版本以后 |
| pg_multixact/ | 包含多事务状态数据的子目录(用于 shared row locks) |
| pg_notify/ | 包含LISTEN / NOTIFY状态数据的子目录 |
| pg_repslot/ | 包含复制槽数据的子目录(9.1版本以后) |
| pg_serial/ | 包含有关已提交的序列化事务(9.1版本以后)信息的子目录 |
| pg_snapshots/ | 包含导出快照的子目录(9.2版本以后)。 PostgreSQL的函数pg_export_snapshot在此子目录中创建快照信息文件 |
| pg_stat/ | 包含统计子系统永久文件的子目录 |
| pg_stat_tmp/ | 包含统计子系统临时文件的子目录 |
| pg_subtrans/ | 包含子事物状态数据的子目录 |
| pg_tblspc/ | 表空间符号链接目录 |
| pg_twophase/ | 包含prepare事务的状态文件 |
| pg_wal/ (Version 10 or later) | 包含WAL(Write Ahead Logging)段文件的子目录。在版本10中从pg_xlog重命名而来. |
| pg_xact/ (Version 10 or later) | 包含事务提交状态数据的子目录。在版本10中从pg_clog重命名而来.CLOG将在5.4章节中详解 |
| pg_xlog/ (Version 9.6 or earlier) | 包含WAL(Write Ahead Logging)段文件的子目录。在版本10中重命名为pg_ |
重要一些文件
pg_hba.conf 控制PG客户端认证文件
主机 数据库 用户 ip地址 认证方式
pg_ident.conf 控制PG用户名映射的文件
配置操作系统用户和数据库服务器上的用户映射
postgresql.conf 控制PG数据库的参数文件
PG_VERSION 存放PG的主版本号的文件
postgresql.auto.conf 存储使用alter system 修改的配置文件(9.4以后)
postmaster.opts 记录服务器上一次启动的命令行选项
postmaster.pid 伴随数据库服务一起启动,数据数据库进程编号,PGDATA端口等

数据库有两个基础的对象 一个是oid,一个是表空间。
oid是数据库对象的标识。
表空间实际上是文件系统中的一个位置链接,即一个目录,它是一个逻辑上的概念,目录是它的物理存在方式。数据库中创建的对象(表、索引、数据库对象)都保存在表空间中。postgresql初始化完成后,会有两个默认的表空间,一个是pg_default,如果用户建表时没有指定表空间,所有新建的表都会放在pg_default中,另一个是pg_global,存放的是整个实例数据库所共享的系统表。

2.1 base的物理布局设计
每个数据库都会在$PGDATA/base下面生成一个子目录,如下图,都会一一对应。
[root@yanwei base]# ls -ltr
total 48
drwx------. 2 postgre postgre 8192 Jan 28 2019 13211
drwx------. 2 postgre postgre 8192 May 12 23:07 13212
drwx------. 2 postgre postgre 8192 May 12 23:07 1
drwx------ 2 postgre postgre 8192 May 12 23:07 16387
postgre=# select datname,oid from pg_database;
datname | oid
-----------+-------
postgres | 13212
postgre | 16387
template1 | 1
template0 | 13211
(4 rows)
表空间跟数据库关系
在Oracle数据库中;一个表空间只属于一个数据库使用;而一个数据库可以拥有多个表空间。属于"一对多"的关系
在PostgreSQL集群中;一个表空间可以让多个数据库使用;而一个数据库可以使用多个表空间。属于"多对多"的关系。
系统自带表空间
表空间pg_default是用来存储系统目录对象、用户表、用户表index、和临时表、临时表index、内部临时表的默认空间。对应存储目录 P A D A T A / b a s e / 表 空 间 p g g l o b a l 用 来 存 放 系 统 字 典 表 ; 对 应 存 储 目 录 PADATA/base/ 表空间pg_global用来存放系统字典表;对应存储目录 PADATA/base/表空间pgglobal用来存放系统字典表;对应存储目录PADATA/global/
2.2 表和索引的物理布局设计
每一个表和索引如果不超过1G大小,都只有一个文件。表和索引也有和数据库一样的OID,另外还有一个relfilenode,这个值不会总是匹配OID,在发生一truncate,reindex,cluster等相关的操作,会发生变化,见如下示例:
可以看到开始oid和relfilenode是一样的,truncate后,relfilenode发生了变化.
[postgre@yanwei 24581

本文深入探讨了PostgreSQL的物理结构,包括数据库集簇、目录结构、文件系统布局、表空间管理、数据文件组织及内部结构。揭示了PG如何高效存储和管理数据,适合数据库管理员和技术爱好者深入了解。
最低0.47元/天 解锁文章
834

被折叠的 条评论
为什么被折叠?



