22.6. 表空間
PostgreSQL中的表空間允許資料庫管理者在檔案系統中定義用來存放表示資料庫對象的檔案的位置。一旦被建立,表空間就可以在建立資料庫對象時通過名稱引用。
通過使用表空間,管理者可以控制一個PostgreSQL安裝的磁盤布局。 這麼做至少有兩個用處。首先,如果初始化集簇所在的分區或者卷用光了空間,而又不能在邏輯上擴充或者做别的什麼操作,那麼表空間可以被建立在一個不同的分區上,直到系統可以被重新配置。
其次,表空間允許管理者根據資料庫對象的使用模式來優化性能。例如,一個很頻繁使用的索引可以被放在非常快并且非常可靠的磁盤上,如一種非常貴的固态裝置。同時,一個很少使用的或者對性能要求不高的存儲歸檔資料的表可以存儲在一個便宜但比較慢的磁盤系統上。
警告
即便是位于主要的 PostgreSQL 資料目錄之外,表空間也是資料庫集簇的一部分 并且不能被視作資料檔案的一個自治集合。 它們依賴于包含在主資料目錄中的中繼資料,并且是以不能被附加到一個 不同的資料庫集簇或者單獨備份。類似地,如果丢失一個表空間(檔案删除、磁盤失效等), 資料庫集簇可能會變成不可讀或者無法啟動。把一個表空間放在一個臨時檔案系統 (如一個記憶體虛拟盤)上會帶來整個集簇的可靠性風險。
要定義一個表空間,使用
CREATE TABLESPACE指令,例如:
CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';
這個位置必須是一個已有的空目錄,并且屬于PostgreSQL作業系統使用者。 所有後續在該表空間中建立的對象都将被存放在這個目錄下的檔案中。該位置不能放在可移動 或者瞬時存儲上,因為如果表空間丢失會導緻集簇無法工作。
注意
通常在每個邏輯檔案系統上建立多于一個表空間沒有什麼意義,因為你無法控制在一個邏輯檔案系統中特定檔案的位置。不過,PostgreSQL不強制任何這樣的限制,并且事實上它不會注意你的系統上的檔案系統邊界。它隻是在你告訴它要使用的目錄中存儲檔案。
表空間的建立本身必須作為一個資料庫超級使用者完成,但在建立完之後之後你可以允許普通資料庫使用者來使用它。要這樣做,給資料庫普通使用者授予表空間上的
CREATE
權限。
表、索引和整個資料庫都可以被配置設定到特定的表空間。想這麼做,在給定表空間上有
CREATE
權限的使用者必須把表空間的名字以一個參數的形式傳遞給相關的指令。例如,下面的指令在表空間
space1
中建立一個表:
CREATE TABLE foo(i int) TABLESPACE space1;
另外,還可以使用
default_tablespace參數:
SET default_tablespace = space1;
CREATE TABLE foo(i int);
當
default_tablespace
被設定為非空字元串,那麼它就為沒有顯式
TABLESPACE
子句的
CREATE TABLE
和
CREATE INDEX
指令提供一個隐式
TABLESPACE
子句。
還有一個
temp_tablespaces參數,它決定臨時表和索引的位置,以及用于大資料集排序等目的的臨時檔案的位置。 這可以是一個表空間名的清單,而不是隻有一個。是以,與臨時對象有關的負載可以散布在多個表空間上。每次要建立一個臨時對象時,将從清單中随機取一個成員來存放它。
與一個資料庫相關聯的表空間用來存儲該資料庫的系統目錄。此外,如果沒有給出
TABLESPACE
子句并且沒有在
default_tablespace
或
temp_tablespaces
(如适用)中指定其他選擇,它還是在該資料庫中建立的表、索引和臨時檔案的預設表空間。如果一個資料庫被建立時沒有指定表空間,它會使用其模闆資料庫相同的表空間。
當初始化資料庫集簇時,會自動建立兩個表空間。
pg_global
表空間被用于共享系統目錄。
pg_default
表空間是
template1
template0
資料庫的預設表空間(并且,是以也将是所有其他資料庫的預設表空間,除非被一個
CREATE DATABASE
中的
TABLESPACE
子句覆寫)。
表空間一旦被建立,就可以被任何資料庫使用,前提是請求的使用者具有足夠的權限。這也意味着,一個表空間隻有在所有使用它的資料庫中所有對象都被删除掉之後才可以被删掉。
要删除一個空的表空間,使用
DROP TABLESPACE指令。
要确定現有表空間的集合,可檢查
pg_tablespace
系統目錄,例如
SELECT spcname FROM pg_tablespace;
psql 程式的
\db
元指令也可以用來列出現有的表空間。
PostgreSQL使用符号連接配接來簡化表空間的實作。這就意味着表空間隻能在支援符号連接配接的系統上使用。
$PGDATA/pg_tblspc
目錄包含指向集簇中定義的每個非内建表空間的符号連接配接。 盡管我們不推薦,但還是可以通過手工重定義這些連接配接來調整表空間布局。在伺服器運作時,絕不要這樣做。注意在 PostgreSQL 9.1 及更早的版本中,你将還需要用新位置更新
pg_tablespace
目錄(如果你不更新,
pg_dump
将繼續輸出舊的表空間位置)。
本文轉自PostgreSQL中文社群,原文連結: