当前位置: 首页 > article >正文

PostreSQL指南-内幕探索-学习笔记-01-数据库集簇的逻辑与物理结构

目录

一、环境信息

二、参考内容

三、逻辑结构概念

四、物理结构概念

五、逻辑映射关系

1、数据库与oid映射关系

2、堆表对象与oid映射关系

五、物理映射关系

1、数据库与oid映射关系

2、堆表对象与oid映射关系

六、数据库文件布局

1、表格

2、postmaster.pid文件解析

(1)样例文件

(2)进程号和数据文件目录

(3)端口号

(4)共享内存

七、表和索引相关文件的布局

1、relfilenode与oid的关系

2、pg_relation_filepath

3、--with-segsize

4、空闲空间映射和可见性映射文件

5、相应关系分支

八、表空间布局

1、创建表空间

2、查看表空间

3、物理文件

4、映射基目录

5、基于新表空间创建表


一、环境信息

名称
CPU12th Gen Intel(R) Core(TM) i7-12700H
操作系统CentOS Linux release 7.9.2009 (Core)
内存3G
逻辑核数2
PG版本9.6.24

二、参考内容

参考内容
《PostreSQL指南:内幕探索》
《PostgreSQL: Documentation: 9.6: PostgreSQL 9.6.24 Documentation》

三、逻辑结构概念

名称描述
数据库集簇一组数据库的集合,由一个PG服务器管理。
数据库数据库对象的集合。
数据库对象表、索引、序列、视图、函数。
对象标识符(object identifier,oid)所有数据库对象都通过相应的对象标识符进行管理。
数据库对象与相应oid之间的关系存储在对应的系统目录中。

四、物理结构概念

名称描述
数据库集簇一组数据库的集合,由一个PG服务器管理。
数据库数据库对象的集合。
数据库对象表、索引、序列、视图、函数。
对象标识符(object identifier,oid)所有数据库对象都通过相应的对象标识符进行管理。
数据库对象与相应oid之间的关系存储在对应的系统目录中。
基础目录数据文件目录,通常记录到环境变量PGDATA中。

五、逻辑映射关系

1、数据库与oid映射关系

postgres=# SELECT DATNAME,OID FROM PG_DATABASE WHERE DATNAME = 'czg';
 datname |  oid  
---------+-------
 czg     | 16384
(1 row)

2、堆表对象与oid映射关系

czg=# SELECT RELNAME, OID FROM PG_CLASS WHERE RELNAME = 'sun';
 relname |  oid  
---------+-------
 sun     | 16385
(1 row)

五、物理映射关系

1、数据库与oid映射关系

映射为一个目录。

[czg@localhost 16384]$ ll $PGDATA/base/
总用量 48
drwx------. 2 czg czg 8192 2月  20 09:41 1
drwx------. 2 czg czg 8192 2月  20 09:41 13324
drwx------. 2 czg czg 8192 3月   8 17:32 13325
drwx------. 2 czg czg 8192 3月  11 10:07 16384

2、堆表对象与oid映射关系

映射为一个文件。

[czg@localhost 16384]$ ll $PGDATA/base/16384/16385 
-rw-------. 1 czg czg 8192 3月  11 10:08 /opt/Pg9-6/Data/base/16384/16385

六、数据库文件布局

1、表格

名称描述
base存储每个数据库对应的子目录。
global数据库集簇范畴的表(例如pg_database)以及pg_control文件
pg_clog事务提交状态数据。9.6以上的版本改名为pg_xact。
pg_commit_ts事务提交的时间戳数据。
pg_dynshmem动态共享内存子系统中使用的文件。
pg_hba.conf控制PG客户端认证。
pg_ident.conf控制PG用户名映射。
pg_logical逻辑解码的状态数据。
pg_multixact多事务状态数据。
pg_notifyLISTEN/NOTIFY状态数据。
pg_replslot复制槽数据。
pg_serial已提交的可串行化事务相关信息。
pg_snapshots导出快照PG函数pg_export_snashot在此子目录创建快照信息文件。
pg_stat统计子系统的永久文件。
pg_stat_tmp统计子系统的临时文件。
pg_subtrans子事务状态数据。
pg_tblspc指向表空间的符号链接。
pg_twophase两阶段事务的状态文件。
PG_VERSIONPG主版本号信息。
pg_xlogWAL段文件。10版本之后命名为pg_wal。
postgresql.auto.conf存储使用ALTER SYSTEM 修改的配置参数。
postgresql.conf数据库配置参数。
postmaster.opts记录服务器上次启动的命令行选项。
postmaster.pid一个锁定文件,记录:
1、当前postmaster主进程 ID (PID)。
2、群集数据目录路径。
3、postmaster主进程启动时间戳。
4、数据库端口号。
5、Unix 域套接字目录路径(在 Windows 上为空)。
6、第一个有效listen_address(IP 地址或 *,如果不侦听 TCP,则为空)。
7、共享内存段 ID。
服务器关闭后此文件不存在。

2、postmaster.pid文件解析

(1)样例文件

[czg@localhost Data]$ cat postmaster.pid 
92660
/opt/Pg9-6/Data
1741661703
5433
/tmp
*
  5433001         9

(2)进程号和数据文件目录

[root@localhost ~]# ps -ef|grep postmaster
czg       92660      1  0 10:55 ?        00:00:00 /opt/Pg9-6/bin/postmaster -D /opt/Pg9-6/Data
root      94185 130347  0 11:04 pts/3    00:00:00 grep --color=auto postmaster

(3)端口号

[czg@localhost Data]$ lsof -i:5433
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
postmaste 92660  czg    3u  IPv4 4778366      0t0  TCP *:pyrrho (LISTEN)
postmaste 92660  czg    4u  IPv6 4778367      0t0  TCP *:pyrrho (LISTEN)

(4)共享内存

PG使用POSIX-IPC-共享内存进行各个进程之间的通信,通过命令可以看出共享内存段的键:0x0052e6a9,其实一个16进制数,转换后为postmaster.pid中记录的5433001。

[czg@localhost Data]$ ipcs -a

--------- 消息队列 -----------
键        msqid      拥有者  权限     已用字节数 消息      

------------ 共享内存段 --------------
键        shmid      拥有者  权限     字节     nattch     状态      
0x00000000 3          gdm        777        16384      1          目标       
0x00000000 6          gdm        777        2129920    2          目标       
0x0052e6a9 9          czg        600        56         5                       

--------- 信号量数组 -----------
键        semid      拥有者  权限     nsems     
0x0052e6a9 16         czg        600        17        
0x0052e6aa 17         czg        600        17        
0x0052e6ab 18         czg        600        17        
0x0052e6ac 19         czg        600        17        
0x0052e6ad 20         czg        600        17        
0x0052e6ae 21         czg        600        17        
0x0052e6af 22         czg        600        17        
0x0052e6b0 23         czg        600        17        

[czg@localhost Data]$ python
Python 2.7.5 (default, Jun 28 2022, 15:30:04) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> int('0x0052e6a9',16)
5433001

七、表和索引相关文件的布局

1、relfilenode与oid的关系

每个小于1GB的表或索引都在相应的数据库目录中存储为单个文件。数据库内部表和索引是通过oid来管理的,而数据文件由变量relfilenode管理。一般情况下oid和relfilenode是一致的。

czg=# SELECT RELNAME, OID, RELFILENODE FROM PG_CLASS WHERE RELNAME = 'sun';
 relname |  oid  | relfilenode 
---------+-------+-------------
 sun     | 16385 |       16385
(1 row)

表和索引的relfilenode值会被一些命令:TRUNCATE、REINDEX、CLUSTER等命令所改变。

czg=# TRUNCATE TABLE SUN;
TRUNCATE TABLE
czg=# SELECT RELNAME, OID, RELFILENODE FROM PG_CLASS WHERE RELNAME = 'sun';
 relname |  oid  | relfilenode 
---------+-------+-------------
 sun     | 16385 |       16388
(1 row)

对应的文件也会改变。

[czg@localhost Data]$ ll base/16384/16388
-rw-------. 1 czg czg 0 3月  11 15:34 base/16384/16388

2、pg_relation_filepath

czg=# SELECT PG_RELATION_FILEPATH(16385);
 pg_relation_filepath 
----------------------
 base/16384/16388
(1 row)

czg=# SELECT PG_RELATION_FILEPATH('sun');
 pg_relation_filepath 
----------------------
 base/16384/16388
(1 row)

此函数支持通过oid或名称来返回对应的文件路径。

3、--with-segsize

在编译PG时,是通过编译选项--with-segsize来决定表和索引的最大文件大小,如我这边是默认设置是1G,当单个文件大小大于1G时,会生成一个新的文件(名字:relfilenode.1),如果这个文件又满了,则创建另一个新文件(名字:relfilenode.2),以此类推。

4、空闲空间映射和可见性映射文件

每个表都会有对应的两个关联文件,分别是空闲空间映射文件(_fsm结尾)和可见性映射文件

(_vm结尾),如果你的表没有这两个文件就多增删改几次就会出现,可以通过vacuum full命令整理碎片,这两个文件就会消失。

索引是没有可见性映射文件(_vm结尾)。

场景FSM 文件作用VM 文件作用
插入数据快速定位空闲块,减少文件扫描无直接作用
查询数据无直接作用跳过不可见的块,减少 I/O 开销
VACUUM 操作更新空闲空间信息跳过可见的块,减少清理范围

5、相应关系分支

数据库内部,主体数据文件、空闲空间映射文件、可见性文件等都被称为相应关系的分支。

分支编号对应关系如下:

分支编号文件名
0关系数据文件本体
1空闲空间信息文件
2可见性信息文件
3特殊分支init,通常表示表或索引不记录日志(unlogged)

八、表空间布局

表空间是基础目录之外的附加数据目录。

1、创建表空间

czg=# \h create tablespace
Command:     CREATE TABLESPACE
Description: define a new tablespace
Syntax:
CREATE TABLESPACE tablespace_name
    [ OWNER { new_owner | CURRENT_USER | SESSION_USER } ]
    LOCATION 'directory'
    [ WITH ( tablespace_option = value [, ... ] ) ]

czg=# CREATE TABLESPACE SUN_TBS LOCATION '/opt/Pg9-6/Tbs';
CREATE TABLESPACE

2、查看表空间

czg=# \db
          List of tablespaces
    Name    |  Owner   |    Location    
------------+----------+----------------
 pg_default | postgres | 
 pg_global  | postgres | 
 sun_tbs    | postgres | /opt/Pg9-6/Tbs
(3 rows)

3、物理文件

[czg@localhost ~]$ tree /opt/Pg9-6/Tbs/
/opt/Pg9-6/Tbs/
└── PG_9.6_201608131

在指定表空间目录下会生成一个目录,命名规则为:PG_主版本号_目录版本号。

4、映射基目录

[czg@localhost ~]$ tree /opt/Pg9-6/Data/pg_tblspc/
/opt/Pg9-6/Data/pg_tblspc/
└── 16394 -> /opt/Pg9-6/Tbs

pg_tblspc目录下创建了软连接,映射到上面我们指定的目录。

5、基于新表空间创建表

czg=# CREATE TABLE MOON (A INT) TABLESPACE SUN_TBS;
CREATE TABLE

czg=# INSERT INTO MOON VALUES(1);
INSERT 0 1

czg=# SELECT PG_RELATION_FILEPATH('moon');
             pg_relation_filepath             
----------------------------------------------
 pg_tblspc/16394/PG_9.6_201608131/16384/16395
(1 row)

16384数据库在base目录下有一个,如果在新表空间中创建一张16384数据库中的新表,在新表空间目录下也会创建16384这个目录。


http://www.kler.cn/a/588122.html

相关文章:

  • 【Linux】五种 IO 模型与非阻塞 IO
  • cursor使用
  • MyBatis相关的面试题
  • 【Qt】qrc机制介绍
  • 记一次小程序爬虫(反编译-自动化字体映射生成)
  • ctf-web: 简单java反序列化示例
  • FakeApp 技术浅析(四):卷积神经网络
  • 线程-进阶
  • C语言之共用体
  • ETL与ELT核心技术解析:如何选择最优数据集成方案
  • 树莓科技(成都)集团:如何铸就第五代产业园标杆
  • BUG日志:Maven项目启动报错(文件名或者文件扩展名过长)
  • 2.2[frontEnd]ESLint
  • android 通过action启动Activity拦截,Activity应用组件添加intent-filter priority(优先级)不生效
  • AF3 make_pseudo_beta函数解读
  • 【菜鸟飞】Conda安装部署与vscode的结合使用
  • 技术解析:基于AI+云计算的智能呼叫中心系统如何重构零售行业服务生态?
  • 数据结构与算法-图论-欧拉路径和欧拉回路(有向图和无向图,骑马修栅栏,单词游戏 play on words)详细代码注解
  • 实践 PyTorch 手写数字识别
  • 查看debian的版本信息