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来与文件名匹配的。

你可能感兴趣的:(PostgreSQL数据目录文件结构)