PostgreSQL數(shù)據(jù)目錄文件結(jié)構(gòu)

Postgresql數(shù)據(jù)庫(kù)集蔟的數(shù)據(jù)目錄

文件 用途
手工配置文件
postgresql.conf 參數(shù)文件
pg_hba.conf 客戶端認(rèn)證控制文件(host-based access control )
pg_ident.conf 用來(lái)配置哪些操作系統(tǒng)用戶可以映射為哪個(gè)數(shù)據(jù)庫(kù)用戶轧钓。
自動(dòng)配置文件
postgresql.auto.conf 參數(shù)文件光酣,只保存alter system命令修改的參數(shù)
postmaster.opts 記錄服務(wù)器最后一次啟動(dòng)時(shí)使用的命令行參數(shù)
postmaster.pid 記錄進(jìn)程的信息
pg_version pg數(shù)據(jù)庫(kù)主版本號(hào)文件
目錄 用途
base 每個(gè)數(shù)據(jù)庫(kù)對(duì)于的子目錄的子目錄
global 包含集簇范圍的表的文件和全局控制信息等抹镊。
pg_commit_ts 包含事務(wù)提交時(shí)間戳數(shù)據(jù)的子目錄
pg_dynshmem 包含被動(dòng)態(tài)共享內(nèi)存子系統(tǒng)所使用文件的子目錄
pg_logical 包含用于邏輯復(fù)制的狀態(tài)數(shù)據(jù)的子目錄
pg_multixact 包含多事務(wù)狀態(tài)數(shù)據(jù)的子目錄(用戶共享的行鎖)
pg_notify 包含LISTEN/NOTIFY狀態(tài)數(shù)據(jù)的子目錄
pg_repslot 包含復(fù)制槽數(shù)據(jù)的子目錄
pg_serial 包含已提交的可序列化事務(wù)信息的子目錄
pg_snapshots 包含到處的快照的子目錄
pg_stat 包含用于統(tǒng)計(jì)子系統(tǒng)的永久文件的子目錄
pg_stat_tmp 包含用于統(tǒng)計(jì)信息子系統(tǒng)臨時(shí)文件的子目錄
pg_subtrans 包含子事務(wù)狀態(tài)數(shù)據(jù)的子目錄
pg_tblspc 包含指向表空間的符號(hào)鏈接的子目錄
pg_twophase 用于預(yù)備事務(wù)狀態(tài)文件的子目錄
pg_wal 保存預(yù)寫(xiě)日志
pg_xact 包含事務(wù)提交狀態(tài)數(shù)據(jù)的子目錄, 記錄事務(wù)提交狀態(tài)數(shù)據(jù)

文件說(shuō)明

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

當(dāng)pg_hba.conf使用ident認(rèn)證方式時(shí)知给,需要建立映射用戶或具備同名用戶辈灼。

ident是Linux下PostgreSQL默認(rèn)的local認(rèn)證方式帽蝶,
凡是能正確登錄服務(wù)器的操作系統(tǒng)用戶(注:不是數(shù)據(jù)庫(kù)用戶)就能使用本用戶映射的數(shù)據(jù)庫(kù)用戶不需密碼登錄數(shù)據(jù)庫(kù)则拷。

pg_ident.conf就是用來(lái)配置哪些操作系統(tǒng)用戶映射為哪些數(shù)據(jù)庫(kù)用戶的。

如果某操作系統(tǒng)用戶在本文件中沒(méi)有映射用戶甩牺,則默認(rèn)的映射數(shù)據(jù)庫(kù)用戶與操作系統(tǒng)用戶同名蘑志。

pg_hba.conf的格式如下:

# MAPNAME    SYSTEM-USERNAME    PG-USERNAME
usermap      username           dbuser
  • usermap為映射名,要在pg_hba.conf中用到,多個(gè)映射可以共用同一個(gè)映射名急但,
  • username為操作系統(tǒng)用戶名澎媒,
  • dbuser為映射到的數(shù)據(jù)庫(kù)用戶。

pg_hba.conf如下:

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

mappg_hba.confauth-options選項(xiàng)波桩,map=mapzy指示該認(rèn)證條件使用mapzy映射戒努。
指定映射后原本的同名操作系統(tǒng)用戶就不能連接數(shù)據(jù)庫(kù)了。

postgresql.auto.conf

postgresql.auto.conf的優(yōu)先級(jí)高于postgresql.conf镐躲,
如果一個(gè)參數(shù)同時(shí)存在postgresql.auto.confpostgresql.conf里面储玫,系統(tǒng)會(huì)先讀postgresql.auto.conf的參數(shù)配置。
使用alter system set修改的是postgresql.auto.conf文件的內(nèi)容萤皂,postgresql.conf則是通過(guò)文本編輯方式修改撒穷。

比如執(zhí)行alter system set max_wal_size=default將參數(shù)設(shè)回 default 時(shí),postgresql.auto.conf文件里的max_wal_size這項(xiàng)配置會(huì)被刪除裆熙,重新用回postgresql.conf文件的設(shè)置端礼。

一些案例

postgresql.conf

postgresql.conf文件內(nèi)容太多, 詳細(xì)內(nèi)容另開(kāi)一篇文件來(lái)講。
postgresql.conf文件的參數(shù)后面有# (change requires restart)入录,表示必須重啟才能生效蛤奥,使用select pg_reload_conf()pg_ctl reload不行。

GUC - Grand Unified Configuration

直接理解為配置參數(shù)或者GUC變量就可以了, 大部分參數(shù)都可以在不同級(jí)別里設(shè)置, 低級(jí)別的優(yōu)先生效僚稿。

postmaster.pid

postgres@f91183551f40:~/data$ cat postmaster.pid
1                          # 主進(jìn)程的PID凡桥。
/var/lib/postgresql/data   # 數(shù)據(jù)目錄
1613284289
5432
/var/run/postgresql
*
  5432001         0
ready

通過(guò)ipcs命令查看共享內(nèi)存的地址信息
可以看到shared memory segments中的key是0x0052e2c1
0x0052e2c1十六進(jìn)制轉(zhuǎn)換為十進(jìn)制為5432001,正好等于第一個(gè)數(shù)字蚀同,即為共享內(nèi)存的key缅刽。
第二個(gè)數(shù)字為shmid的值,即為共享內(nèi)存的id唤崭。

postmaster.opts

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

可以看出來(lái)拷恨,這個(gè)是啟動(dòng)命令脖律。

global目錄

存儲(chǔ)全局的系統(tǒng)表信息和全局控制信息谢肾。

  1. pg_control
    用于存儲(chǔ)全局控制信息
  2. pg_filenode.map
    用于將當(dāng)前目錄下系統(tǒng)表的OID與具體文件名進(jìn)行硬編碼映射(每個(gè)用戶創(chuàng)建的數(shù)據(jù)庫(kù)目錄下也有同名文件)。
  3. pg_internal.init
    用于緩存系統(tǒng)表小泉,加快系統(tǒng)表讀取速度(每個(gè)用戶創(chuàng)建的數(shù)據(jù)庫(kù)目錄下也有同名文件)芦疏。
  4. 全局系統(tǒng)表文件
    數(shù)字命名的文件,用于存儲(chǔ)系統(tǒng)表的內(nèi)容微姊。
    它們?cè)趐g_class里的relfilenode都為0酸茴,是靠pg_filenode.map將OID與文件硬編碼映射。
    (注:不是所有的系統(tǒng)表的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.

用以下語(yǔ)句可以查詢OID對(duì)應(yīng)的表名/物理文件名


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

select pg_relation_filenode(:oid);

pg_control

對(duì)應(yīng)的是ControlFileData結(jié)構(gòu)體

pg_control控制文件

pg_filenode.map - 數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)集蔟里的一個(gè)數(shù)據(jù)庫(kù))的系統(tǒng)表

PostgreSQL 物理文件映射解析

對(duì)應(yīng)RelMapFile結(jié)構(gòu)體, 結(jié)構(gòu)體大小為:62*8+4*4=496+16=512兢交。也就是說(shuō)這個(gè)文件最多存放62條系統(tǒng)catalog表的記錄薪捍。

hexdump pg_filenode.map

系統(tǒng)表文件 - 數(shù)據(jù)庫(kù)集蔟的硬編碼的系統(tǒng)表

  • 純數(shù)字的是主表數(shù)據(jù)文件索引數(shù)據(jù)文件
  • 以“_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`創(chuàng)建的數(shù)據(jù)庫(kù)
│   ├── 3600
│   ├── 3600_fsm
│   ├── 3600_vm
│   ├── 16385
│   ├── pg_filenode.map  # 
│   ├── pg_internal.init #
│   └── PG_VERSION       #
  1. pg_filenode.map 是pg_class里relfilenode為0的系統(tǒng)表凳干,OID與文件的硬編碼映射。
  2. pg_internal.init 是系統(tǒng)表的cache文件被济,用于加快讀取救赐。默認(rèn)不存在,查詢系統(tǒng)表后自動(dòng)產(chǎn)生只磷。
  3. PG_VERSION 是當(dāng)前數(shù)據(jù)庫(kù)數(shù)據(jù)格式對(duì)應(yīng)的版本號(hào)
  4. 其它文件是需要到pg_class里根據(jù)OID查到對(duì)應(yīng)的relfilenode來(lái)與文件名匹配的经磅。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钮追,隨后出現(xiàn)的幾起案子预厌,更是在濱河造成了極大的恐慌,老刑警劉巖畏陕,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件配乓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡惠毁,警方通過(guò)查閱死者的電腦和手機(jī)犹芹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鞠绰,“玉大人腰埂,你說(shuō)我怎么就攤上這事◎谂颍” “怎么了屿笼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)翁巍。 經(jīng)常有香客問(wèn)我驴一,道長(zhǎng),這世上最難降的妖魔是什么灶壶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任肝断,我火速辦了婚禮,結(jié)果婚禮上驰凛,老公的妹妹穿的比我還像新娘胸懈。我一直安慰自己,他們只是感情好恰响,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布趣钱。 她就那樣靜靜地躺著,像睡著了一般胚宦。 火紅的嫁衣襯著肌膚如雪首有。 梳的紋絲不亂的頭發(fā)上燕垃,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音井联,去河邊找鬼利术。 笑死,一個(gè)胖子當(dāng)著我的面吹牛低矮,可吹牛的內(nèi)容都是我干的印叁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼军掂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼轮蜕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蝗锥,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤跃洛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后终议,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體汇竭,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年穴张,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了细燎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡皂甘,死狀恐怖玻驻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情偿枕,我是刑警寧澤璧瞬,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站渐夸,受9級(jí)特大地震影響嗤锉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜墓塌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一瘟忱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桃纯,春花似錦酷誓、人聲如沸披坏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棒拂。三九已至伞梯,卻和暖如春玫氢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谜诫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工漾峡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喻旷。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓生逸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親且预。 傳聞我的和親對(duì)象是個(gè)殘疾皇子槽袄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容