?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
本節(jié)在文件和目錄的層次上描述存儲(chǔ)格式。
數(shù)據(jù)庫集群所需要的所有數(shù)據(jù)都存儲(chǔ)在集群的數(shù)據(jù)目錄里,通常用環(huán)境變量 PGDATA來引用。PGDATA的一個(gè)常見位值 /var/lib/pgsql/data。不同服務(wù)器實(shí)例管理的多個(gè)集群, 可以在同一臺(tái)機(jī)器上共存。
PGDATA目錄包含幾個(gè)子目錄以及一些控制文件, 在Table 54-1里面顯示。除了這些必要的東西之外, 集群的配置文件postgresql.conf, pg_hba.conf, pg_ident.conf通常也都存儲(chǔ)在這里。 (PostgreSQL8.0 之后也可以把它們放在別的地方)
Table 54-1. PGDATA的內(nèi)容
Item | 描述 |
---|---|
PG_VERSION | 一個(gè)包含PostgreSQL主版本號(hào)的文件 |
base | 包含與每個(gè)數(shù)據(jù)庫對應(yīng)的子目錄的子目錄 |
global | 包含集群范圍的表的子目錄,比如 pg_database |
pg_clog | 包含事務(wù)提交狀態(tài)數(shù)據(jù)的子目錄 |
pg_multixact | 包含多重事務(wù)狀態(tài)數(shù)據(jù)的子目錄(使用共享的行鎖) |
pg_notify | 包含 LISTEN/NOTIFY 狀態(tài)數(shù)據(jù)的子目錄 |
pg_stat_tmp | 包含臨時(shí)文件的統(tǒng)計(jì)子系統(tǒng)的子目錄 |
pg_subtrans | 包含子事務(wù)狀態(tài)數(shù)據(jù)的子目錄 |
pg_tblspc | 包含指向表空間的符號(hào)鏈接的子目錄 |
pg_twophase | 包含用于預(yù)備事務(wù)的狀態(tài)文件的子目錄 |
pg_xlog | 包含 WAL(預(yù)寫日志)文件的子目錄 |
postmaster.opts | 一個(gè)記錄服務(wù)器最后一次啟動(dòng)時(shí)使用的命令行參數(shù)的文件 |
postmaster.pid | 一個(gè)鎖文件,記錄著當(dāng)前的服務(wù)器主進(jìn)程 PID 和共享內(nèi)存段 ID ,在服務(wù)器關(guān)閉之后此文件就不存在了。 |
對于集群里的每個(gè)數(shù)據(jù)庫,在PGDATA/base 里都有對應(yīng)的一個(gè)子目錄,子目錄的名字是該數(shù)據(jù)庫在pg_database 里的 OID 。這個(gè)子目錄是該數(shù)據(jù)庫文件的缺省位置;特別值得一提的是, 該數(shù)據(jù)庫的系統(tǒng)表存儲(chǔ)在此。
每個(gè)表和索引都存儲(chǔ)在獨(dú)立的文件里,以該表或者該索引的filenode 號(hào)命名,該號(hào)碼可以在pg_class.relfilenode找到。 另外,主文件(a/k/a 主叉文件),每個(gè)表和索引有個(gè)自由空間映射(參閱 Section 54.3), 其用來存儲(chǔ)關(guān)于在關(guān)系中可用的自由空間的信息。自用空間映射存儲(chǔ)在文件名為filenode編號(hào)加上后綴 _fsm的文件里。 表也有可見映射,存儲(chǔ)在一個(gè)分叉文件,后綴為_vm,用來跟蹤那些頁,有活動(dòng)的行。該可見映射在Section 54.4進(jìn)一步的描述。
Caution |
請注意,雖然一個(gè)表的 filenode 通常和它的 OID 相同,但實(shí)際上并不必須如此;
有些操作,比如TRUNCATE, REINDEX, CLUSTER
以及一些特殊的ALTER TABLE形式,都可以改變 filenode 而同時(shí)保留 OID 。
避免假定filenode 和表 OID 相同。
還有,對于某種系統(tǒng)表包括pg_class自身,pg_class.relfilenode 包含零。這些表的實(shí)際的filenode編號(hào)存儲(chǔ)在
低級(jí)別的數(shù)據(jù)結(jié)構(gòu),并且可以使用 |
在表或者索引超過 1 GB 之后,將分割成 1GB 大小的段。第一個(gè)段的文件名 和 filenode 相同;隨后的段名名為 filenode.1, filenode.2 ... 等等。 這樣的安排避免了在某些平臺(tái)上的有文件大小限制的問題。 (實(shí)際上,1GB 只是缺省的段大小。當(dāng)構(gòu)建PostgreSQL時(shí),可以使用配置選項(xiàng)--with-segsize調(diào)整段大小。) 原則上,自由空間映射和可見映射叉文件可能需要多個(gè)段,盡管這在實(shí)踐中不可能發(fā)生。
一個(gè)表如果有些字段里面可能存儲(chǔ)相當(dāng)大的數(shù)據(jù),那么就會(huì)有個(gè)相關(guān)聯(lián)的TOAST 表,用于存儲(chǔ)無法在表的數(shù)據(jù)行中放置的超大行外數(shù)據(jù)。如果有的話, pg_class.reltoastrelid從一個(gè)表鏈接到它 的TOAST表。參閱Section 54.2獲取更多信息。
表的內(nèi)容和索引在Section 54.5中有討論。
表空間把情況搞得更復(fù)雜些。每個(gè)用戶定義的表空間都在PGDATA/pg_tblspc 目錄里面有一個(gè)符號(hào)連接,它指向物理的表空間目錄(就是在CREATE TABLESPACE 命令里聲明的那個(gè)目錄)。這個(gè)符號(hào)連接是用表空間的 OID 命名的。 在物理的表空間目錄內(nèi)部,有個(gè)依賴PostgreSQL服務(wù)器版本的命名的子目錄,如 PG_9.0_201008051。 (使用這個(gè)子目錄的原因是為了讓后續(xù)版本的數(shù)據(jù)庫不產(chǎn)生沖突的情況下,可以使用相同的 CREATE TABLESPACE位置值。) 在有指定版本的子目錄里,每個(gè)在表空間中有元素的數(shù)據(jù)庫有個(gè)子目錄,命名為數(shù)據(jù)庫的OID。表和索引存儲(chǔ)在那個(gè)目錄,使用filenode命名方法。 pg_default沒有通過pg_tblspc關(guān)聯(lián), 但是對應(yīng)PGDATA/base。類似的還有, pg_global沒有通過pg_tblspc關(guān)聯(lián), 而是對應(yīng)PGDATA/global。
pg_relation_filepath()
函數(shù)用于顯示任何關(guān)系的全路徑。(相對于PGDATA)
替代記住許多上述規(guī)則,它往往是有用的。但是請記住,這個(gè)函數(shù)只給了關(guān)系主分叉文件的第一部分的名稱—
你可能還需要一段數(shù)字和/或 _fsm或_vm用來找到關(guān)聯(lián)該關(guān)系的所有文件。
創(chuàng)建臨時(shí)文件(對于操作如更多數(shù)據(jù)于可適合內(nèi)存的排序)在PGDATA/base/pgsql_tmp, 或如果表空間不是指定的pg_default,在表空間目錄下的pgsql_tmp 子目錄。 臨時(shí)文件的名表示為pgsql_tmpPPP.NNN,這里PPP是后臺(tái)擁有的PID和 NNN是后臺(tái)來區(qū)分不同的臨時(shí)文件。