2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

66.1. 資料庫檔案佈局 #

本節介紹檔案和目錄級別的儲存格式。

傳統上,資料庫叢集使用的配置檔案和資料檔案儲存在叢集的資料目錄中,通常稱為 PGDATA(源自可用於定義它的環境變數的名稱)。PGDATA 的一個常見位置是 /var/lib/pgsql/data。同一臺機器上可以存在由不同伺服器例項管理的多個叢集。

PGDATA 目錄包含幾個子目錄和控制檔案,如表 66.1所示。除了這些必需項之外,叢集配置檔案 postgresql.confpg_hba.confpg_ident.conf 傳統上儲存在 PGDATA 中,儘管也可以將它們放在其他位置。

表 66.1. PGDATA 的內容

描述
PG_VERSION 一個包含 PostgreSQL 主版本號的檔案
base 包含每個資料庫子目錄的子目錄
current_logfiles 記錄日誌收集器當前寫入的日誌檔案的檔案
global 包含叢集範圍表的子目錄,例如 pg_database
pg_commit_ts 包含事務提交時間戳資料的子目錄
pg_dynshmem 包含動態共享記憶體子系統使用的檔案的子目錄
pg_logical 包含邏輯解碼狀態資料的子目錄
pg_multixact 包含多事務狀態資料(用於共享行鎖)的子目錄
pg_notify 包含 LISTEN/NOTIFY 狀態資料的子目錄
pg_replslot 包含複製槽資料的子目錄
pg_serial 包含已提交的序列化事務資訊的子目錄
pg_snapshots 包含匯出快照的子目錄
pg_stat 包含統計子系統的永久檔案的子目錄
pg_stat_tmp 包含統計子系統的臨時檔案的子目錄
pg_subtrans 包含子事務狀態資料的子目錄
pg_tblspc 包含指向表空間的符號連結的子目錄
pg_twophase 包含已準備事務狀態檔案的子目錄
pg_wal 包含 WAL(預寫日誌)檔案的子目錄
pg_xact 包含事務提交狀態資料的子目錄
postgresql.auto.conf 一個用於儲存由 ALTER SYSTEM 設定的配置引數的檔案
postmaster.opts 一個記錄伺服器上次啟動時使用的命令列選項的檔案
postmaster.pid 一個鎖定檔案,記錄當前 postmaster 程序 ID (PID)、叢集資料目錄路徑、postmaster 啟動時間戳、埠號、Unix 域套接字目錄路徑(可能為空)、第一個有效的 listen_address(IP 地址或 *,如果未監聽 TCP 則為空)以及共享記憶體段 ID(伺服器關閉後此檔案不存在)

叢集中的每個資料庫在 PGDATA/base 目錄下都有一個子目錄,該子目錄以資料庫在 pg_database 中的 OID 命名。此子目錄是資料庫檔案的預設位置;特別是,其系統目錄儲存在此處。

請注意,以下章節描述了內建 heap 表訪問方法 和內建 索引訪問方法 的行為。由於 PostgreSQL 的可擴充套件性,其他訪問方法可能行為不同。

每個表和索引都儲存在單獨的檔案中。對於普通關係,這些檔案以表或索引的 filenode 號命名,可以在 pg_class.relfilenode 中找到。但對於臨時關係,檔名形式為 tBBB_FFF,其中 BBB 是建立檔案的後端程序號,FFF 是 filenode 號。無論哪種情況,除了主檔案(又名主分支)之外,每個表和索引都有一個 空閒空間對映(參見 66.3 節),其中儲存有關關係可用空閒空間的資訊。空閒空間對映儲存在一個以 filenode 號加上 _fsm 字尾命名的檔案中。表還有一個 可見性對映,儲存在帶有 _vm 字尾的分支中,用於跟蹤已知沒有死元組的頁面。可見性對映在 66.4 節 中有更詳細的描述。未記錄的表和索引有一個第三個分支,稱為初始化分支,它儲存在帶有 _init 字尾的分支中(參見 66.5 節)。

注意

請注意,雖然表的 filenode 通常與其 OID 匹配,但情況 並非 如此;某些操作,如 TRUNCATEREINDEXCLUSTER 和某些形式的 ALTER TABLE,可以在保留 OID 的同時更改 filenode。避免假定 filenode 和表 OID 相同。此外,對於某些系統目錄(包括 pg_class 本身),pg_class.relfilenode 包含零。這些目錄的實際 filenode 號儲存在更低級別的結構中,可以使用 pg_relation_filenode() 函式獲取。

當表或索引的大小超過 1 GB 時,它將被分成 1 GB 大小的 。第一個段的檔名與 filenode 相同;後續段命名為 filenode.1、filenode.2 等。這種安排可以避免在檔案大小有限制的情況下出現問題。(實際上,1 GB 只是預設段大小。段大小可以在構建 PostgreSQL 時使用配置選項 --with-segsize 進行調整。)原則上,空閒空間對映和可見性對映分支也可能需要多個段,儘管在實踐中這種情況不太可能發生。

包含可能包含大條目的列的表將有一個關聯的 TOAST 表,用於對無法保留在錶行中的欄位值進行行外儲存。pg_class.reltoastrelid 從錶鏈接到其TOAST表(如果存在)。有關更多資訊,請參見 66.2 節

表和索引的內容將在 66.6 節 中進一步討論。

表空間使情況更加複雜。每個使用者定義的表空間在 PGDATA/pg_tblspc 目錄內都有一個符號連結,該連結指向物理表空間目錄(即,在 CREATE TABLESPACE 命令中指定的目錄)。此符號連結以表空間的 OID 命名。在物理表空間目錄內有一個子目錄,其名稱取決於 PostgreSQL 伺服器版本,例如 PG_9.0_201008051。(使用此子目錄的原因是,連續版本的資料庫可以使用相同的 CREATE TABLESPACE 位置值而不會發生衝突。)在版本特定的子目錄中,有一個目錄用於在表空間中有元素的每個資料庫,該目錄以資料庫的 OID 命名。表和索引在此目錄記憶體儲,使用 filenode 命名方案。pg_default 表空間不透過 pg_tblspc 訪問,而是對應於 PGDATA/base。類似地,pg_global 表空間不透過 pg_tblspc 訪問,而是對應於 PGDATA/global

函式 pg_relation_filepath() 顯示任何關係的完整路徑(相對於 PGDATA)。它通常用作記憶上述許多規則的替代方法。但請記住,此函式僅提供關係的第一個主分支段的名稱 — 您可能需要附加段號和/或 _fsm_vm_init 來查詢與該關係關聯的所有檔案。

臨時檔案(用於排序超過記憶體容量的資料等操作)在 PGDATA/base/pgsql_tmp 中建立,或者如果在它們上指定了非 pg_default 的表空間,則在表空間目錄的 pgsql_tmp 子目錄中建立。臨時檔案的名稱形式為 pgsql_tmpPPP.NNN,其中 PPP 是擁有後端的 PID,NNN 用於區分該後端的不同臨時檔案。

提交更正

如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符之處或需要進一步說明之處,請使用 此表單 報告文件問題。