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

news2025/3/18 18:57:43

目录

一、环境信息

二、参考内容

三、逻辑结构概念

四、物理结构概念

五、逻辑映射关系

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.coloradmin.cn/o/2317374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker入门篇

使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台,它可以让开发者将应用程序及其依赖打包到一个容器中,然后在任何环境中运行这个容器&#xff0…

Unity Shader - UI Sprite Shader之简单抠图效果

Sprite抠图效果: 前言 在PhotoShop中我们经常会用到抠图操作,现在就用Shader实现一个简单的抠图效果。 实现原理: 使用当前像素颜色与需要抠掉的颜色相减作比较,然后与一个指定的阈值比较以决定是否将其显示出来; U…

vllm-openai多服务器集群部署AI模型

服务器配置是两台ubantu系统电脑,每台电脑安装两张4090-48G显存的显卡,共计192G显存。 服务器1 服务器2 准备工作: 1.两台电脑都已经安装了docker 2.两台电脑都已经安装了nvidia驱动 参考vllm官方资料 https://docs.vllm.ai/en/latest/serving/distributed_serving.html…

在Spring Boot项目中接入DeepSeek深度求索,感觉笨笨的呢

文章目录 引言1. 什么是DeepSeek?2. 准备工作2.1 注册DeepSeek账号 3.实战演示3.1 application增加DS配置3.2 编写service3.3 编写controller3.4 编写前端界面chat.html3.5 测试 总结 引言 在当今快速发展的数据驱动时代,企业越来越重视数据的价值。为了…

STM32---FreeRTOS事件标志组

一、简介 事件标志位:用一个位,来表示事件是否发生 事件标志组:一组事件标志位的集合,可以简单的理解时间标志组,就是一个整体。 事件标志租的特点: 它的每一个位表示一个时间(高8位不算&…

Word 小黑第40套

对应大猫43 主题 -浏览主题 -选择W样式标准文件就行 1级段落和2级段落(用项目符号不影响原本段落文字符号 颜色修改为自动) 整段变红的 不是把光标定位到红色字体那里 要选择几个红色字体 再创建样式 插入的空白页一定要是下一页,不能插空白…

【Linux我做主】浅谈Shell及其原理

浅谈Linux中的Shell及其原理 Linux中Shell的运行原理github地址前言一、Linux内核与Shell的关系1.1 操作系统核心1.2 用户与内核的隔离 二、Shell的演进与核心机制2.1 发展历程2.2 核心功能解析2.3 shell的工作流程1. 用户输入命令2. 解析器拆分指令3. 扩展器处理动态内容变量替…

数据结构篇——二叉树的存储与遍历

一、引入 书接上文,文于此续。上文我们学到了树的存储结构,那么今天,我们来学习下几种特殊的二叉树以及关于它的各种遍历,让我们一起加油吧。 二、特殊的二叉树 二叉树的特殊形式这里介绍3种,其中需要着重记忆的有…

分而治之:用于 RGB-T 显著目标检测的 Confluent Triple-Flow 网络(问题)

摘要 问题一:RGB-thermal显著对象检测这是什么? RGB图像是可见光的三通道图像,而thermal是热红外图像,通常为单通道,记录物体的热辐射信息。结合RGB和thermal两种模态的数据,可以利用两者的互补信息&…

求职招聘网站源码,找工作招工系统,支持H5和各种小程序

招聘找活招工平台系统源码 招聘求职找工作软件 发布信息积分充值招聘系统,里面带纤细教程 功能介绍: 招工小程序主要针对工地招工工人找工作,工地可以发布招工信息,工人可以发布找活信息,招工信息可以置顶,置顶需要积分,积分可以通过签到、分享邀请好友、充值获取,后…

企业微信群聊机器人开发

拿到机器人hook 机器人开发文档 https://developer.work.weixin.qq.com/document/path/91770

基于Python的tkinter开发的一个工具,解析图片文件名并将数据自动化导出为Excel文件

文章目录 一、开发背景与业务价值二、系统架构设计1. 分层架构图解2. 核心类结构3. 文件解析流程 三、关键技术实现详解1. 高性能文件名解析引擎2. 可视化数据展示3. 智能Excel导出模块 四、完整代码五、行业应用展望 一、开发背景与业务价值 在零售行业会员管理场景中&#x…

Flutter_学习记录_状态管理之GetX

1. 状态管理、Flutter Getx介绍 1.1 状态管理 通俗的讲:当我们想在多个页面(组件/Widget)之间共享状态(数据),或者一个页面(组件/Widget)中的多个子组件之间共享状态(数…

【网络】数据流(Data Workflow)Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件)

在图片中,数据流(Data Workflow)描述了应用程序中数据的流动过程,涉及 Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件&…

Git下载安装(保姆教程)

目录 1、Git下载 2、Git安装(windows版) (1)启动安装程序 (2)阅读许可协议 (3)选择安装路径 (4)选择组件 (5)选择开始菜单文件夹…

Blender-MCP服务源码2-依赖分析

Blender-MCP服务源码2-依赖分析 有个大佬做了一个Blender-MCP源码,第一次提交代码是【2025年3月7号】今天是【2025年月15日】也就是刚过去一周的时间,所以想从0开始学习这个代码,了解一下大佬们的开发思路 1-核心知识点 from mcp.server.fas…

LabVIEW压比调节器动态试验台

本案介绍了一种基于LabVIEW的压比调节器动态试验台的设计,通过实用的LabVIEW图形化编程语言,优化了数据采集与处理的整个流程。案例通过实际应用展示了设计的专业性与高效性,以及如何通过系统化的方法实现精确的动态测试和结果分析。 ​ 项目…

2025-03-17 Unity 网络基础1——网络基本概念

文章目录 1 网络1.1 局域网1.2 以太网1.3 城域网1.4 广域网1.5 互联网(因特网)1.6 万维网1.7 小结 2 IP 地址2.1 IP 地址2.2 端口号2.3 Mac 地址2.4 小结 3 客户端与服务端3.1 客户端3.2 服务端3.3 网络游戏中的客户端与服务端 1 网络 ​ 在没有网络之前…

springboot441-基于SpringBoot的校园自助交易系统(源码+数据库+纯前后端分离+部署讲解等)

💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm&#xf…

浅谈数据分析及数据思维

目录 一、数据分析及数据分析思维?1.1 数据分析的本质1.2 数据分析思维的本质1.2.1 拥有数据思维的具体表现1.2.2 如何培养自己的数据思维1.2.2.1 书籍1.2.2.2 借助工具1.2.2.3 刻意练习 二、数据分析的价值及必备能力?2.1 数据分析的价值2.1.1 现状分析…