根目錄介紹
data
├── base # use to store database file(SELECT oid, datname FROM pg_database;)
├── global # under global, all the filenode is hard-code(select oid,relname,relfilenode from pg_class where relfilenode=0 order by oid;)
├── pg_clog # dir of transaction commit log
│ └── 0000
├── pg_commit_ts
├── pg_dynshmem
├── pg_hba.conf # client authentication config file
├── pg_ident.conf # user ident map file
├── pg_logical
│ ├── mappings
│ └── snapshots
├── pg_multixact
│ ├── members
│ │ └── 0000
│ └── offsets
│ └── 0000
├── pg_notify
│ └── 0000
├── pg_replslot
├── pg_serial
├── pg_snapshots # dir of snapshot file
├── pg_stat
├── pg_stat_tmp # dir of tmp stat file
│ ├── db_0.stat
│ ├── db_12407.stat
│ ├── db_16384.stat
│ └── global.stat
├── pg_subtrans
│ └── 0000
├── pg_tblspc
├── pg_twophase
├── PG_VERSION # version file
├── pg_xlog # dir of xlog file
│ ├── 000000010000000000000001
│ └── archive_status # status info of xlog archive
├── postgresql.auto.conf
├── postgresql.conf # config file of postmaster progress
├── postmaster.opts
└── postmaster.pid # pid file of postmaster progress
global目錄介紹
global名如其意,存放的文件用于存儲全局的系統(tǒng)表信息和全局控制信息肛度。
global下有四種文件:
- pg_control
用于存儲全局控制信息 - pg_filenode.map
用于將當前目錄下系統(tǒng)表的OID與具體文件名進行硬編碼映射(每個用戶創(chuàng)建的數據庫目錄下也有同名文件)傻唾。 - pg_internal.init
用于緩存系統(tǒng)表,加快系統(tǒng)表讀取速度(每個用戶創(chuàng)建的數據庫目錄下也有同名文件)承耿。 - 全局系統(tǒng)表文件
數字命名的文件冠骄,用于存儲系統(tǒng)表的內容。它們在pg_class里的relfilenode都為0加袋,是靠pg_filenode.map將OID與文件硬編碼映射凛辣。(注:不是所有的系統(tǒng)表的relfilenode都為0)
data
├── global # under global, all the filenode is hard-code(select oid,relname,relfilenode from pg_class where relfilenode=0 order by 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.
base目錄介紹
base目錄用于存放數據庫的所有實體文件。例如职烧,我們創(chuàng)建的第一個庫testdb的OID為16384扁誓,那么在data/base下就會產生一個名為16384的目錄防泵,用于存儲testdb的數據文件。
testdb=# select oid,datname from pg_database;
oid | datname
-------+-----------
12407 | postgres
16384 | testdb
1 | template1
12406 | template0
(4 rows)
base目錄結構
data
├── base # use to store database file(SELECT oid, datname FROM pg_database;)
│ ├── 1 # template database
│ ├── 12406 # template0 database
│ ├── 12407 # postgres database
│ └── 16384 # testdb, first user database
│ │ ├── 3600
│ │ ├── 3600_fsm
│ │ ├── 3600_vm
│ │ ├── 16385
│ │ ├── pg_filenode.map
│ │ ├── pg_internal.init
│ │ └── PG_VERSION
- pg_filenode.map 是pg_class里relfilenode為0的系統(tǒng)表蝗敢,OID與文件的硬編碼映射择克。
- pg_internal.init 是系統(tǒng)表的cache文件,用于加快讀取前普。默認不存在,查詢系統(tǒng)表后自動產生壹堰。
- PG_VERSION 是當前數據庫數據格式對應的版本號
- 其它文件是需要到pg_class里根據OID查到對應的relfilenode來與文件名匹配的拭卿。
例如:tab1的relfilenode是16385,那么16385這個文件就是tab1的數據文件
testdb=# select oid,relfilenode,relname from pg_class where relname='tab1';
oid | relfilenode | relname
-------+-------------+---------
16385 | 16385 | tab1
(1 row)
- 空閑空間映射表
名字以_fsm結尾的文件是數據文件對應的FSM(free space map)文件贱纠,用map方式來標識哪些block是空閑的峻厚。用一個Byte而不是bit來標識一個block。對于一個有N個字節(jié)的block谆焊,它在_fsm文件中第blknum個字節(jié)中記錄的值是(31+N)/32惠桃。通過這種方式標識一個block空閑字節(jié)數。FSM中不是簡單的數組辖试,而是一個三層的樹形結構辜王。FSM文件是在需要用到它時才自動產生的。 - 可見性映射表文件
名字以_vm結尾的文件是數據文件對應的VM(visibility map)罐孝。PostgreSQL中在做多版本并發(fā)控制時是通過在元組頭上標識“已無效”來實現(xiàn)刪除或更新的呐馆,最后通過VACUUM功能來清理無效數據回收空閑空間。在做VACUUM時就使用VM開快速查找包含無效元組的block莲兢。VM僅是個簡單的bitmap,一個bit對應一個block汹来。
注:系統(tǒng)表分為全局系統(tǒng)表和庫級系統(tǒng)表。
全局系統(tǒng)表位于global下改艇,例如:pg_database,pg_tablespace,pg_auth_members這種存儲系統(tǒng)級對象的表收班。
庫級系統(tǒng)表位于數據庫目錄下,例如:pg_type,pg_proc,pg_attribute這種存儲庫級對象的表谒兄。
值得注意的是pg_class位于庫級目錄的里摔桦,但也包含全局系統(tǒng)表信息,因此研發(fā)或運維人員在改動全局系統(tǒng)表信息時需要注意舵变。
表空間目錄介紹
testdb=# select oid,* from pg_tablespace;
oid | spcname | spcowner | spcacl | spcoptions
-------+------------+----------+--------+------------
1663 | pg_default | 10 | |
1664 | pg_global | 10 | |
49162 | dbspace | 10 | |
(3 rows)
每一個Oid都在data/pg_tblspc下對應一個名為Oid的軟鏈接文件酣溃,指向真正的space目錄。
tree ../data/pg_tblspc/
../data/pg_tblspc/
└── 49162 -> /home/postgres/postgresql-9.6.6/postgres/data/dbspace
在space目錄是如何組織的呢纪隙?
testdb=# create table tab3(a int) tablespace dbspace;
CREATE TABLE
testdb=# select oid,relname,relfilenode from pg_class where relname='tab3';
oid | relname | relfilenode
-------+---------+-------------
57351 | tab3 | 57351
(1 row)
tree ../data/pg_tblspc/49162
../data/pg_tblspc/49162
└── PG_9.6_201608131
└── 16384
└── 57351