本節描述檔案和目錄層級的儲存格式。
傳統上,資料庫叢集使用的組態和資料檔案都儲存在叢集的資料目錄中,通常稱為 PGDATA
(以可用於定義它的環境變數名稱命名)。PGDATA
的常見位置是 /var/lib/pgsql/data
。在同一台機器上可以存在由不同伺服器實例管理的多個叢集。
PGDATA
目錄包含多個子目錄和控制檔案,如 表 65.1 所示。除了這些必需項目外,叢集組態檔案 postgresql.conf
、pg_hba.conf
和 pg_ident.conf
通常儲存在 PGDATA
中,儘管也可以將它們放置在其他位置。
表 65.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 |
包含 tablespace 的符號連結的子目錄 |
pg_twophase |
包含已準備交易的狀態檔案的子目錄 |
pg_wal |
包含 WAL(預寫式日誌)檔案的子目錄 |
pg_xact |
包含交易提交狀態資料的子目錄 |
postgresql.auto.conf |
一個用於儲存由 ALTER SYSTEM 設定的組態參數的檔案 |
postmaster.opts |
一個記錄伺服器上次啟動時使用的命令列選項的檔案 |
postmaster.pid |
一個鎖定檔案,記錄目前的 postmaster 處理程序 ID (PID)、叢集資料目錄路徑、postmaster 啟動時間戳記、埠號、Unix 網域 socket 目錄路徑(可能為空)、第一個有效的 listen_address(IP 位址或 * ,如果未監聽 TCP 則為空)和共享記憶體區段 ID(此檔案在伺服器關閉後不存在) |
對於叢集中的每個資料庫,在 PGDATA
/base
中都有一個子目錄,以資料庫在 pg_database
中的 OID 命名。這個子目錄是資料庫檔案的預設位置;特別是,它的系統目錄儲存在那裡。
請注意,以下各節描述了內建 heap
表格存取方法 和內建 索引存取方法 的行為。由於 PostgreSQL 的可擴展性,其他存取方法可能以不同的方式運作。
每個表格和索引都儲存在單獨的檔案中。對於普通關係,這些檔案以表格或索引的 filenode 號命名,該號可以在 pg_class
.relfilenode
中找到。但是對於暫時關係,檔案名稱的形式為 t
,其中 BBB
_FFF
BBB
是建立檔案的後端處理程序的處理程序號,而 FFF
是 filenode 號。無論哪種情況,除了主檔案 (又稱為主分支) 之外,每個表格和索引都有一個 可用空間圖 (請參閱 第 65.3 節),其中儲存有關關係中可用空間的資訊。可用空間圖儲存在以 filenode 號加上後綴 _fsm
命名的檔案中。表格還有一個 可見性圖,儲存在帶有後綴 _vm
的分支中,以追蹤哪些頁面已知沒有已刪除的 tuple。可見性圖在 第 65.4 節 中進一步描述。未記錄的表格和索引有第三個分支,稱為初始化分支,儲存在帶有後綴 _init
的分支中(請參閱 第 65.5 節)。
請注意,雖然資料表的 filenode 通常與其 OID 相符,但這不一定總是如此。有些操作,像是 TRUNCATE
、REINDEX
、CLUSTER
以及某些形式的 ALTER TABLE
,可能會在保留 OID 的同時更改 filenode。請避免假設 filenode 和資料表 OID 相同。此外,對於某些系統目錄,包括 pg_class
本身,pg_class
.relfilenode
包含零。這些目錄的實際 filenode 號碼儲存在更底層的資料結構中,可以使用 pg_relation_filenode()
函式取得。
當資料表或索引超過 1 GB 時,它會被分割成大小為 GB 的 片段(segments)。第一個片段的檔案名稱與 filenode 相同;後續的片段則命名為 filenode.1、filenode.2 等。這種安排避免了在具有檔案大小限制的平台上出現問題。(實際上,1 GB 只是預設的片段大小。可以使用建置 PostgreSQL 時的組態選項 --with-segsize
來調整片段大小。)原則上,可用空間地圖和可見性地圖 fork 也可能需要多個片段,儘管這種情況在實務上不太可能發生。
具有可能包含大型欄位值的資料表將會有一個相關聯的 TOAST 資料表,它用於異地儲存(out-of-line storage)那些過大而無法保留在資料表資料列中的欄位值。pg_class
.reltoastrelid
從資料表連結到其TOAST資料表(如果有的話)。詳情請參閱Section 65.2。
資料表和索引的內容將在Section 65.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
)。它通常可以代替記住上述許多規則。但請記住,此函式僅給出關聯主要 fork 的第一個片段的名稱 — 您可能需要附加片段編號和/或 _fsm
、_vm
或 _init
以找到與該關聯相關的所有檔案。
臨時檔案(用於排序超出記憶體容量的資料等操作)會在 PGDATA
/base/pgsql_tmp
中建立,或者,如果為它們指定了 pg_default
以外的表空間,則會在表空間目錄的 pgsql_tmp
子目錄中建立。臨時檔案的名稱格式為 pgsql_tmp
,其中 PPP
.NNN
PPP
是擁有後端的 PID,而 NNN
區分該後端的不同臨時檔案。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步說明的內容,請使用此表格來報告文件問題。