支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0

22.6. 表空間 #

PostgreSQL 中,表空間允許資料庫管理員定義檔案系統中的位置,用於儲存代表資料庫物件的檔案。 一旦建立,在建立資料庫物件時,可以透過名稱來引用表空間。

透過使用表空間,管理員可以控制 PostgreSQL 安裝的磁碟佈局。 這至少在兩個方面很有用。 首先,如果叢集初始化的分割區或磁碟區空間不足且無法擴展,則可以在另一個分割區上建立表空間並使用它,直到系統可以重新配置。

其次,表空間允許管理員利用對資料庫物件使用模式的了解來優化效能。 例如,可以將使用非常頻繁的索引放置在非常快速、高可用性的磁碟上,例如昂貴的固態裝置。 同時,可以將儲存很少使用或效能不重要的封存資料的表格儲存在較便宜、速度較慢的磁碟系統上。

警告

即使位於主要的 PostgreSQL 資料目錄之外,表空間也是資料庫叢集的組成部分,不能被視為資料檔案的自主集合。 它們依賴於主資料目錄中包含的中繼資料,因此無法附加到不同的資料庫叢集或單獨備份。 同樣地,如果您遺失表空間(檔案刪除、磁碟故障等),資料庫叢集可能會變得無法讀取或無法啟動。 將表空間放置在諸如 RAM 磁碟之類的暫時性檔案系統上會危及整個叢集的可靠性。

要定義表空間,請使用 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 (視情況而定) 指定其他選擇,則它是用於在資料庫中建立的表格、索引和臨時檔案的預設表空間。 如果建立資料庫時未指定其表空間,它將使用與它複製的範本資料庫相同的表空間。

當初始化資料庫叢集時,會自動建立兩個表空間(tablespace)。pg_global 表空間僅用於共用的系統目錄。pg_default 表空間是 template1template0 資料庫的預設表空間(因此,它也將是其他資料庫的預設表空間,除非在 CREATE DATABASE 中使用 TABLESPACE 子句覆蓋)。

一旦建立,表空間就可以從任何資料庫中使用,前提是請求的使用者擁有足夠的權限。這表示在刪除表空間中所有資料庫的所有物件之前,無法刪除該表空間。

若要移除空的表空間,請使用 DROP TABLESPACE 指令。

若要確定現有表空間的集合,請檢視 pg_tablespace 系統目錄,例如

SELECT spcname FROM pg_tablespace;

psql 程式的 \db 中繼指令也可用於列出現有的表空間。

目錄 $PGDATA/pg_tblspc 包含符號連結,指向叢集中定義的每個非內建表空間。雖然不建議,但可以通過重新定義這些連結來手動調整表空間佈局。在任何情況下,都不應在伺服器執行時執行此操作。請注意,在 PostgreSQL 9.1 及更早版本中,您還需要使用新的位置更新 pg_tablespace 目錄。(如果您不這樣做,pg_dump 將繼續輸出舊的表空間位置。)

提交更正

如果您在文件中發現任何不正確、與特定功能的體驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。