PostgreSQL数据目录文件结构

Postgresql数据库集蔟的数据目录

文件 用途
手工配置文件
postgresql.conf 参数文件
pg_hba.conf 客户端认证控制文件(host-based access control )
pg_ident.conf 用来配置哪些操作系统用户可以映射为哪个数据库用户。
自动配置文件
postgresql.auto.conf 参数文件,只保存alter system命令修改的参数
postmaster.opts 记录服务器最后一次启动时使用的命令行参数
postmaster.pid 记录进程的信息
pg_version pg数据库主版本号文件
目录 用途
base 每个数据库对于的子目录的子目录
global 包含集簇范围的表的文件和全局控制信息等。
pg_commit_ts 包含事务提交时间戳数据的子目录
pg_dynshmem 包含被动态共享内存子系统所使用文件的子目录
pg_logical 包含用于逻辑复制的状态数据的子目录
pg_multixact 包含多事务状态数据的子目录(用户共享的行锁)
pg_notify 包含LISTEN/NOTIFY状态数据的子目录
pg_repslot 包含复制槽数据的子目录
pg_serial 包含已提交的可序列化事务信息的子目录
pg_snapshots 包含到处的快照的子目录
pg_stat 包含用于统计子系统的永久文件的子目录
pg_stat_tmp 包含用于统计信息子系统临时文件的子目录
pg_subtrans 包含子事务状态数据的子目录
pg_tblspc 包含指向表空间的符号链接的子目录
pg_twophase 用于预备事务状态文件的子目录
pg_wal 保存预写日志
pg_xact 包含事务提交状态数据的子目录, 记录事务提交状态数据

文件说明

pg_ident.conf - 用户映射配置文件

pg_hba.conf使用ident认证方式时,需要建立映射用户或具备同名用户。

ident是Linux下PostgreSQL默认的local认证方式,
凡是能正确登录服务器的操作系统用户(注:不是数据库用户)就能使用本用户映射的数据库用户不需密码登录数据库。

pg_ident.conf就是用来配置哪些操作系统用户映射为哪些数据库用户的。

如果某操作系统用户在本文件中没有映射用户,则默认的映射数据库用户与操作系统用户同名。

pg_hba.conf的格式如下:

# MAPNAME    SYSTEM-USERNAME    PG-USERNAME
usermap      username           dbuser
  • usermap为映射名,要在pg_hba.conf中用到,多个映射可以共用同一个映射名,
  • username为操作系统用户名,
  • dbuser为映射到的数据库用户。

pg_hba.conf如下:

# TYPE  DATABASE  USER  CIDR-ADDRESS  METHOD
local    all      all                 ident  map=mapzy

mappg_hba.confauth-options选项,map=mapzy指示该认证条件使用mapzy映射。
指定映射后原本的同名操作系统用户就不能连接数据库了。

postgresql.auto.conf

postgresql.auto.conf的优先级高于postgresql.conf
如果一个参数同时存在postgresql.auto.confpostgresql.conf里面,系统会先读postgresql.auto.conf的参数配置。
使用alter system set修改的是postgresql.auto.conf文件的内容,postgresql.conf则是通过文本编辑方式修改。

比如执行alter system set max_wal_size=default将参数设回 default 时,postgresql.auto.conf文件里的max_wal_size这项配置会被删除,重新用回postgresql.conf文件的设置。

一些案例

postgresql.conf

postgresql.conf文件内容太多, 详细内容另开一篇文件来讲。
postgresql.conf文件的参数后面有# (change requires restart),表示必须重启才能生效,使用select pg_reload_conf()pg_ctl reload不行。

GUC - Grand Unified Configuration

直接理解为配置参数或者GUC变量就可以了, 大部分参数都可以在不同级别里设置, 低级别的优先生效。

postmaster.pid

postgres@f91183551f40:~/data$ cat postmaster.pid
1                          # 主进程的PID。
/var/lib/postgresql/data   # 数据目录
1613284289
5432
/var/run/postgresql
*
  5432001         0
ready

通过ipcs命令查看共享内存的地址信息
可以看到shared memory segments中的key是0x0052e2c1
0x0052e2c1十六进制转换为十进制为5432001,正好等于第一个数字,即为共享内存的key。
第二个数字为shmid的值,即为共享内存的id。

postmaster.opts

postgres@f91183551f40:~/data$ cat postmaster.opts
/usr/lib/postgresql/12/bin/postgres

可以看出来,这个是启动命令。

global目录

存储全局的系统表信息和全局控制信息。

  1. pg_control
    用于存储全局控制信息
  2. pg_filenode.map
    用于将当前目录下系统表的OID与具体文件名进行硬编码映射(每个用户创建的数据库目录下也有同名文件)。
  3. pg_internal.init
    用于缓存系统表,加快系统表读取速度(每个用户创建的数据库目录下也有同名文件)。
  4. 全局系统表文件
    数字命名的文件,用于存储系统表的内容。
    它们在pg_class里的relfilenode都为0,是靠pg_filenode.map将OID与文件硬编码映射。
    (注:不是所有的系统表的relfilenode都为0)
data
├── global                # under global, all the filenode is hard-code(pg_class.oid)
│   ├── 1136              # pg_pltemplate
│   ├── 1137              # pg_pltemplate_name_index
│   ├── 1213              # pg_tablespace
│   ├── 1214              # pg_shdepend
│   ├── 1232              # pg_shdepend_depender_index
│   ├── 1233              # pg_shdepend_reference_index
│   ├── 1260              # pg_authid
│   ├── 1261              # pg_auth_members
│   ├── 1262              # pg_database
│   ├── 2396              # pg_shdescription
│   ├── 2397              # pg_shdescription_o_c_index
│   ├── 2671              # pg_database_datname_index
│   ├── 2672              # pg_database_oid_index
│   ├── 2676              # pg_authid_rolname_index
│   ├── 2677              # pg_authid_oid_index
│   ├── 2694              # pg_auth_members_role_member_index
│   ├── 2695              # pg_auth_members_member_role_index
│   ├── 2697              # pg_tablespace_oid_index
│   ├── 2698              # pg_tablespace_spcname_index
│   ├── 2846              # pg_toast_2396
│   ├── 2847              # pg_toast_2396_index
│   ├── 2964              # pg_db_role_setting
│   ├── 2965              # pg_db_role_setting_databaseid_rol_index
│   ├── 2966              # pg_toast_2964
│   ├── 2967              # pg_toast_2964_index
│   ├── 3592              # pg_shseclabel
│   ├── 3593              # pg_shseclabel_object_index
│   ├── 4060              # pg_toast_3592x
│   ├── 4061              # pg_toast_3592_index
│   ├── 6000              # pg_replication_origin
│   ├── 6001              # pg_replication_origin_roiident_index
│   ├── 6002              # pg_replication_origin_roname_index
│   ├── pg_control        # global control file, use pgcheck -pc to see it.
│   ├── pg_filenode.map   # system table (oid -> filenode) mapping file, use pgcheck -pm to see it.
│   └── pg_internal.init  # system table cache file, use pgcheck -pr to see it.

用以下语句可以查询OID对应的表名/物理文件名


select oid, relname from pg_class where relfilenode=0 order by oid;

select pg_relation_filenode(:oid);

pg_control

对应的是ControlFileData结构体

pg_control控制文件

pg_filenode.map - 数据库(数据库集蔟里的一个数据库)的系统表

PostgreSQL 物理文件映射解析

对应RelMapFile结构体, 结构体大小为:62*8+4*4=496+16=512。也就是说这个文件最多存放62条系统catalog表的记录。

hexdump pg_filenode.map

系统表文件 - 数据库集蔟的硬编码的系统表

  • 纯数字的是主表数据文件索引数据文件
  • 以“_fsm”后缀的就是Free Space Mapping文件。
  • 以”vm”后缀的就是visibility map。

base目录

base                  # use to store database file(SELECT oid, datname FROM pg_database;)
├── 1                 # template database
├── 12406             # template0 database
├── 12407             # postgres database
└── 16384             # 用`create database`创建的数据库
│   ├── 3600
│   ├── 3600_fsm
│   ├── 3600_vm
│   ├── 16385
│   ├── pg_filenode.map  # 
│   ├── pg_internal.init #
│   └── PG_VERSION       #
  1. pg_filenode.map 是pg_class里relfilenode为0的系统表,OID与文件的硬编码映射。
  2. pg_internal.init 是系统表的cache文件,用于加快读取。默认不存在,查询系统表后自动产生。
  3. PG_VERSION 是当前数据库数据格式对应的版本号
  4. 其它文件是需要到pg_class里根据OID查到对应的relfilenode来与文件名匹配的。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容