數據庫PostrageSQL-表空間

22.6. 表空間

PostgreSQL中的表空間容許數據庫管理員在文件系統中定義用來存放表示數據庫對象的文件的位置。一旦被建立,表空間就能夠在建立數據庫對象時經過名稱引用。java

經過使用表空間,管理員能夠控制一個PostgreSQL安裝的磁盤佈局。 這麼作至少有兩個用處。首先,若是初始化集簇所在的分區或者卷用光了空間,而又不能在邏輯上擴展或者作別的什麼操做,那麼表空間能夠被建立在一個不一樣的分區上,直到系統能夠被從新配置。web

其次,表空間容許管理員根據數據庫對象的使用模式來優化性能。例如,一個很頻繁使用的索引能夠被放在很是快而且很是可靠的磁盤上,如一種很是貴的固態設備。同時,一個不多使用的或者對性能要求不高的存儲歸檔數據的表能夠存儲在一個便宜但比較慢的磁盤系統sql

即使是位於主要的 PostgreSQL 數據目錄以外,表空間也是數據庫集簇的一部
分 而且不能被視做數據文件的一個自治集合。 它們依賴於包含在主數據目錄
中的元數據,而且所以不能被附加到一個 不一樣的數據庫集簇或者單獨備份。
相似地,若是丟失一個表空間(文件刪除、磁盤失效等), 數據庫集簇可能
會變成不可讀或者沒法啓動。把一個表空間放在一個臨時文件系統 (如一個
內存虛擬盤)上會帶來整個集簇的可靠性風險。數據庫

要定義一個表空間,使用CREATE TABLESPACE命令,例如:服務器

CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';

這個位置必須是一個已有的空目錄,而且屬於PostgreSQL操做系統用戶。 全部後續在該表空間中建立的對象都將被存放在這個目錄下的文件中。該位置不能放在可移動 或者瞬時存儲上,由於若是表空間丟失會致使集簇沒法工做。svg

一般在每一個邏輯文件系統上建立多於一個表空間沒有什麼意義,由於你沒法控制在一個邏輯文件系統中特定文件的位置。不過,PostgreSQL不強制任何這樣的限制,而且事實上它不會注意你的系統上的文件系統邊界。它只是在你告訴它要使用的目錄中存儲文件。佈局

表空間的建立自己必須做爲一個數據庫超級用戶完成,但在建立完以後以後你能夠容許普通數據庫用戶來使用它。要這樣作,給數據庫普通用戶授予表空間上的CREATE權限。post

表、索引和整個數據庫均可以被分配到特定的表空間。想這麼作,在給定表空間上有 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_tablespacetemp_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將繼續輸出舊的表空間位置)。

本文同步分享在 博客「cwl_java」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索