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
map
是pg_hba.conf
的auth-options
选项,map=mapzy
指示该认证条件使用mapzy
映射。
指定映射后原本的同名操作系统用户就不能连接数据库了。
postgresql.auto.conf
postgresql.auto.conf
的优先级高于postgresql.conf
,
如果一个参数同时存在postgresql.auto.conf
和postgresql.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目录
存储全局的系统表信息和全局控制信息。
- pg_control
用于存储全局控制信息 - pg_filenode.map
用于将当前目录下系统表的OID与具体文件名进行硬编码映射(每个用户创建的数据库目录下也有同名文件)。 - pg_internal.init
用于缓存系统表,加快系统表读取速度(每个用户创建的数据库目录下也有同名文件)。 - 全局系统表文件
数字命名的文件,用于存储系统表的内容。
它们在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_filenode.map - 数据库(数据库集蔟里的一个数据库)的系统表
对应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 #
- pg_filenode.map 是pg_class里relfilenode为0的系统表,OID与文件的硬编码映射。
- pg_internal.init 是系统表的cache文件,用于加快读取。默认不存在,查询系统表后自动产生。
- PG_VERSION 是当前数据库数据格式对应的版本号
- 其它文件是需要到pg_class里根据OID查到对应的relfilenode来与文件名匹配的。