2025年9月25日: PostgreSQL 18 釋出!
支援的版本:當前 (18) / 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(根據情況)未指定其他選擇。如果建立資料庫時未指定表空間,它將使用與它複製的模板資料庫相同的表空間。

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

建立後,只要請求使用者擁有足夠的許可權,就可以從任何資料庫中使用表空間。這意味著在刪除所有使用表空間的所有資料庫中的物件之前,無法刪除表空間。

要刪除一個空的表空間,請使用 DROP TABLESPACE 命令。

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

SELECT spcname, spcowner::regrole, pg_tablespace_location(oid) FROM pg_tablespace;

可以找到哪些資料庫使用了哪些表空間;請參閱 表 9.76psql 程式的 \db 元命令對於列出現有表空間也很有用。

目錄 $PGDATA/pg_tblspc 包含指向叢集中定義的每個非內建表空間的符號連結。雖然不推薦,但可以透過手動重新定義這些連結來調整表空間佈局。在伺服器執行時,絕對不要執行此操作。

提交更正

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