iT邦幫忙

2022 iThome 鐵人賽

DAY 4
2
自我挑戰組

三十天,PG與我系列 第 4

PostgreSQL物理檔案架構

  • 分享至 

  • xImage
  •  

PostgreSQL將其啟動所需的資料儲存在檔案系統的$PGDATA目錄裡面,這個目錄在PostgreSQL安裝的時候會被初始化。PGDATA內部的結構如下:
https://ithelp.ithome.com.tw/upload/images/20220904/20114934bx4YHBWQ76.png

其中
postgresql.conf是主要的Postgres設定檔
postgresql.auto.conf紀錄透過指令來調整Postgres設定時所作的變更(例如 ALTER SYSTEM...)
PG_VERSION紀錄建立該目錄的Postgres版本號
postmaster.pid紀錄正在執行的Postmaster process ID(Postgres的模式是Postmaster在建立連線之後,會fork一個新的process來處理該連線)
base目錄儲存使用者建立的table與database等資料
pg_wal紀錄write_ahead log
pg_stat以及pg_stat_temp儲存關於資料庫永久性/暫時性的統計資訊

(pg_tblspc裡面存放的是針對各個tablespace的symbolic link,讓Postgres可以從這個目錄連結到其他的tablespace。在Postgres裡面我們除了使用預設的tablespace以外,也可以設定多個tablespace在不同的位置,以將不同的資料以table為單位分散在不同的儲存裝置上。)

在Postgres裡面,每個table跟database都有一個OID,可以透過oid2name來查詢,並瀏覽目錄'${tablespace}/${database_oid}/${table_oid}'來看到裡面的資料檔案。為了避免某些作業系統的檔案大小限制,PostgreSQL會將檔案分割成特定大小的segments(預設為1GB),所以有時候可能會看到檔案名稱後面有.1, .2這樣的後綴。
fsm檔名後綴的為該table的free space map,紀錄檔案中每個page的可用空間,以便在做資料插入時快速找到可用的page。vm檔名後綴的則是visibility map,紀錄檔案中哪些page內資料的可見性狀態是在做一般VACUUM的時候可以跳過的。
https://ithelp.ithome.com.tw/upload/images/20220904/201149343r8dfx3jzP.png

PostgreSQL預設的儲存引擎實作會把檔案切割成8kb為大小的page,每次要進行讀寫的時候會將一塊page讀進shared buffer(每個backend process之間共用記憶體的緩衝區)的一個slot裡面,然後對shared buffer內的頁面進行操作,每個page由header起頭,header後面連續放置指向資料行的item id,然後從page可用空間的後方塞入實際的資料行。
https://ithelp.ithome.com.tw/upload/images/20220905/201149349p8Yj6gAvo.png
(來源:https://www.postgresql.org/docs/current/storage-page-layout.html)


上一篇
PostgreSQL特性介紹-MVCC
下一篇
PostgreSQL特性介紹- WAL & checkpoint
系列文
三十天,PG與我30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言