Chapter 49. 資料庫實際儲存

Table of Contents
49.1. 資料庫檔案配置
49.2. TOAST
49.3. 資料庫分頁文件

本章對 PostgreSQL 資料庫使用的實際格式進行一個概述。

49.1. 資料庫檔案配置

本節在文件和的層次上描述儲存格式。

資料庫集群所需要的所有資料都儲存在集群的資料目錄裡, 通常用 PGDATA 來引用(用的是可以定義之的環境變量的名字)。 PGDATA 的一個常見位置是 /var/lib/pgsql/data。 不同 postmaster 管理的多個集群,可以在同一台機器上共存。

PGDATA 目錄包含幾個子目錄以及一些控制文件, 在 Table 49-1 裡面顯示。除了這些必要的東西之外, 集群的配置文件 postgresql.confpg_hba.conf, 和 pg_ident.conf 通常都儲存在 PGDATA (儘管從 PostgreSQL 8.0 開始,我們可以把它們放在別的地方。)

Table 49-1. PGDATA的內容

描述
PG_VERSION一個包含 PostgreSQL 主版本的文件
base包含每個資料庫對應的子目錄的子目錄
global包含集群範圍的資料表的子目錄,比如pg_database
pg_clog包含交易提交狀態資料的子目錄
pg_subtrans包含子交易狀態資料的子目錄
pg_tblspc包含指向資料表空間的符號鏈接的子目錄
pg_xlog包含 WAL (預寫日誌)文件的子目錄
postmaster.opts一個記錄 postmaster 最後一次啟動時使用的命令行參數的文件
postmaster.pid一個鎖文件,記錄著目前的 postmaster PID 和共享內存段 ID (在 postmaster 關閉之後不存在)

對於集群裡的每個資料庫,在 PGDATA/base 裡都有一個子目錄對應, 子目錄的名字時該資料庫在 pg_database 裡的 OID。 這個子目錄時該資料庫文件的預設位置;特別值得一提的是,該資料庫的系統資料表儲存在此。

每個資料表和索引都儲存在獨立的文件裡,以該資料表或者該索引的 filenode 號命名, 我們可以在 pg_class.relfilenode 找到。

Caution

請注意,雖然一個資料表的 filenode 通常和它的 OID 相同,但實際上並不必須如此; 有些操作,比如 TRUNCATEREINDEXCLUSTER 以及一些特殊的 ALTER TABLE 形式,都可以改變 filenode 而同時保留 OID。 我們不應該假設 filenode 和資料表 OID 相同。

在資料表或者索引超過 1Gb 之後,它就被分裂成一吉大小的。 第一個段的文件名和 filenode 相同;隨後的段名名為 filenode.1,filenode.2,等等。 這樣的安排避免了在某些有文件大小限制的平台上的問題。資料表和索引的內容在 Section 49.3 裡有進一步討論。

一個資料表如果有些字串裡面可能儲存相當大的資料,那麼就會有個相關聯的 TOAST 資料表, 用於儲存無法在資料表的資料行中放下的太大的線外資料。 如果有的話,pg_class.reltoastrelid 從一個資料表鏈接到它的 TOAST 資料表。 參閱 Section 49.2 獲取更多訊息。

資料表空間把情況搞得更複雜些。每個用戶定義的資料表空間都在 PGDATA/pg_tblspc 目錄裡面有一個符號連接,它指向實際的資料表空間目錄(就是在 CREATE TABLESPACE 命令裡聲明的那個目錄)。這個符號連接是用資料表空間的 OID 命名的。 在實際資料表空間裡面,為每個在這個資料表空間裡有元素的資料庫都有一個子目錄, 以那個資料庫的 OID 命名。該目錄裡的資料表遵循 filenode 的命名規則。 pg_default 沒有透過 pg_tblspc 關聯,但是對應 PGDATA/base。 類似的還有,pg_global 沒有透過 pg_tblspc 關聯,而是對應 PGDATA/global