本節介紹檔案和目錄級別的儲存格式。
傳統上,資料庫叢集使用的配置檔案和資料檔案儲存在叢集的資料目錄中,通常稱為 PGDATA
(源自可用於定義它的環境變數的名稱)。PGDATA
的一個常見位置是 /var/lib/pgsql/data
。同一臺機器上可以存在由不同伺服器例項管理的多個叢集。
PGDATA
目錄包含幾個子目錄和控制檔案,如表 66.1所示。除了這些必需項之外,叢集配置檔案 postgresql.conf
、pg_hba.conf
和 pg_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
中找到。但對於臨時關係,檔名形式為 t
,其中 BBB
_FFF
BBB
是建立檔案的後端程序號,FFF
是 filenode 號。無論哪種情況,除了主檔案(又名主分支)之外,每個表和索引都有一個 空閒空間對映(參見 66.3 節),其中儲存有關關係可用空閒空間的資訊。空閒空間對映儲存在一個以 filenode 號加上 _fsm
字尾命名的檔案中。表還有一個 可見性對映,儲存在帶有 _vm
字尾的分支中,用於跟蹤已知沒有死元組的頁面。可見性對映在 66.4 節 中有更詳細的描述。未記錄的表和索引有一個第三個分支,稱為初始化分支,它儲存在帶有 _init
字尾的分支中(參見 66.5 節)。
請注意,雖然表的 filenode 通常與其 OID 匹配,但情況 並非 如此;某些操作,如 TRUNCATE
、REINDEX
、CLUSTER
和某些形式的 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_tmp
,其中 PPP
.NNN
PPP
是擁有後端的 PID,NNN
用於區分該後端的不同臨時檔案。
如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符之處或需要進一步說明之處,請使用 此表單 報告文件問題。