1. 程式人生 > 實用技巧 >超詳細的PostgreSQL體系結構總結

超詳細的PostgreSQL體系結構總結

概述

今天本文主要從日誌檔案、引數檔案、控制檔案、資料檔案、redo日誌(WAL)、後臺程序這六個方面來介紹一下PostgreSQL的架構。


架構

PostgreSQL的主要架構如下:


一、日誌檔案

1、日誌檔案種類

1)$PGDATA/log 執行日誌(pg10之前為$PGDATA/pg_log)

2)$PGDATA/pg_wal 重做日誌(pg10之前為$PGDATA/pg_xlog)

3)$PGDATA/pg_xact 事務提交日誌(pg10之前為$PGDATA/pg_clog)

4)伺服器日誌,可以在啟動的時候指定,比如pg_ctl start -l ./alert.log

2、 執行日誌

執行日誌主要相關的引數如下,預設沒有開啟的話沒有log目錄,開啟後會自動生成。

3、事務日誌pg_xact

pg_xact是事務提交日誌,記錄了事務的元資料。預設開啟。內容一般不能直接讀。

4、 伺服器日誌

如果用pg_ctl啟動的時候沒有指定-l引數來指定伺服器日誌,錯誤可能會輸出到cmd前臺。伺服器日誌記錄了資料庫的重要資訊。

lsof或許可以過濾出在寫的日誌檔案

$lsof -c postgres| grep REG | grep -v /usr | grep -v /dev | grep -v /SYS

二、引數檔案

1、 postgresql.conf

pg的主要引數檔案,有很詳細的說明和註釋,和Oracle的pfile,MySQL的my.cnf類似。預設在$PGDATA下。很多引數修改後都需要重啟。9.6之後支援了alter system來修改,修改後的會存在$PGDATA/postgresql.auto.conf下,可以reload或者 restart來使之生效。

主要的引數如下:

2、pg_hba.conf

這個是黑白名單的設定。檔案裡有詳細的引數說明,預設引數如下:

type列有local,host,hostssl,hostnossl四種。local是本地認證

database可以是all,或者指定的資料庫

user列可以是all,或者具體的使用者

address可以是ip或者網段

method比較重要,有"trust", "reject", "md5", "password", "scram-sha-256", "gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert"這麼多可選。trust是免密登入;reject是黑名單拒絕;md5是加密的密碼;password是沒有加密的密碼;ident是Linux下PostgreSQL預設的local認證方式,凡是能正確登入伺服器的作業系統使用者(注:不是資料庫使用者)就能使用本使用者對映的資料庫使用者不需密碼登入資料庫

3、 pg_ident.conf

pg_ident.con是使用者對映配置檔案。結合pg_hba.connf中,method為ident可以用特定的作業系統使用者和指定的資料庫使用者登入資料庫。如下:

pg_ident.conf如下:

pg_hba.conf如下:


三、控制檔案

1、 控制檔案位置

$PGDATA/global/pg_control

控制檔案在資料庫目錄的global目錄下。控制檔案記錄了資料庫的重要資訊。

2、 檢視控制檔案

pg_controldata可以檢視控制檔案的內容

$ pg_controldata $PGDATA
pg_control version number: 1100
Catalog version number: 201809051
Database system identifier: 6684270596680436587 #dbid
Database cluster state: in production # primary
pg_control last modified: Thu 16 May 2019 02:26:37 PM CST
Latest checkpoint location: 0/48812A0
Latest checkpoint's REDO location: 0/4881268 #redo 位置
Latest checkpoint's REDO WAL file: 000000010000000000000001 #wal檔案號
Latest checkpoint's TimeLineID: 1
Latest checkpoint's PrevTimeLineID: 1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID: 0:572 #下一個事務id
Latest checkpoint's NextOID: 16388 #下一個OID
.....

controlfile記錄了資料庫執行的一些資訊,比如資料庫id,是否open,wal的位置,checkpoint的位置,等等。controlfile是很重要的檔案,資料庫部署和調整。


四、資料檔案

1、page

pg中,每個索引和表都是一個單獨的檔案,pg中叫做page。預設是每個大於1G的page會被分割pg_class.relfilenode.1這樣的檔案。

Page預設大小為8KB,最大32KB,一個數據塊中可存放多行的資料。塊中的結構如下圖:

塊頭記錄瞭如下資訊:

  • 塊的checksum值
  • 空閒空間的起始位置和結束位置
  • 特殊資料的起始位置
  • 其他一些資訊
  • 行指標是一個32bit的數字,具體結構如下:
  • 行內容的偏移量,佔15bit;
  • 指標的標記,佔2bit;
  • 行內容的長度,佔15bit。

行指標中表示行內容的偏移量是15bit,能表示的最大偏移量是2^15=32768,因此塊的最大大小是32768,即32KB。

2、page物理位置

page的物理位置在$PGDATA/BASE/DATABASE_OID/PG_CLASS.RELFILENODE

需要注意的是,pg_class.relfilenode類似dba_objects.data_object_id,truncate表之後relfilenode會變。對應的物理檔名字也會變。


五、WAL日誌

1、wal位置

wal在$PGDATA/pg_wal下。10之前為pg_xlog

2、wal命名格式

檔名稱為16進位制的24個字元組成,每8個字元一組,每組的意義如下

3、手動切換WAL日誌的命令

在PG10之前:

highgo=# select pg_switch_xlog();
pg_switch_xlog
----------------
0/B000C48
(1 row)

在PG10之後:

highgo=# select pg_switch_wal();
pg_switch_wal
----------------
0/B000C48
(1 row)

六、後臺程序

pg後臺程序說明如下:


篇幅有限,關於PG的一些體系結構內容就介紹到這了,下週會介紹一下怎麼去部署PG,然後開始我們的PG學習了,感興趣的朋友可以關注一下~

https://www.toutiao.com/i6715390855772897800/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1597746231&app=news_article&utm_source=weixin&utm_medium=toutiao_android&use_new_style=1&req_id=202008181823510101310751665508D570&group_id=6715390855772897800