PostgreSQL10.1手冊_部分III.伺服器管理_第22章管理資料庫_22.6.表空間

李博bluemind發表於2018-10-03

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 TABLECREATE INDEX命令提供一個隱式TABLESPACE子句。

還有一個temp_tablespaces引數,它決定臨時表和索引的位置,以及用於大資料集排序等目的的臨時檔案的位置。 這可以是一個表空間名的列表,而不是隻有一個。因此,與臨時物件有關的負載可以散佈在多個表空間上。每次要建立一個臨時物件時,將從列表中隨機取一個成員來存放它。

與一個資料庫相關聯的表空間用來儲存該資料庫的系統目錄。此外,如果沒有給出TABLESPACE子句並且沒有在default_tablespacetemp_tablespaces(如適用)中指定其他選擇,它還是在該資料庫中建立的表、索引和臨時檔案的預設表空間。如果一個資料庫被建立時沒有指定表空間,它會使用其模板資料庫相同的表空間。

當初始化資料庫集簇時,會自動建立兩個表空間。pg_global表空間被用於共享系統目錄。pg_default表空間是template1template0資料庫的預設表空間(並且,因此也將是所有其他資料庫的預設表空間,除非被一個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中文社群,原文連結:22.6. 表空間


相關文章