W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
PostgreSQL中的表空間允許數(shù)據(jù)庫管理員在文件系統(tǒng)中定義用來存放表示數(shù)據(jù)庫對象的文件的位置。一旦被創(chuàng)建,表空間就可以在創(chuàng)建數(shù)據(jù)庫對象時通過名稱引用。
通過使用表空間,管理員可以控制一個PostgreSQL安裝的磁盤布局。 這么做至少有兩個用處。首先,如果初始化集簇所在的分區(qū)或者卷用光了空間,而又不能在邏輯上擴(kuò)展或者做別的什么操作,那么表空間可以被創(chuàng)建在一個不同的分區(qū)上,直到系統(tǒng)可以被重新配置。
其次,表空間允許管理員根據(jù)數(shù)據(jù)庫對象的使用模式來優(yōu)化性能。例如,一個很頻繁使用的索引可以被放在非??觳⑶曳浅?煽康拇疟P上,如一種非常貴的固態(tài)設(shè)備。同時,一個很少使用的或者對性能要求不高的存儲歸檔數(shù)據(jù)的表可以存儲在一個便宜但比較慢的磁盤系統(tǒng)上。
即便是位于主要的 PostgreSQL 數(shù)據(jù)目錄之外,表空間也是數(shù)據(jù)庫集簇的一部分 并且不能被視作數(shù)據(jù)文件的一個自治集合。 它們依賴于包含在主數(shù)據(jù)目錄中的元數(shù)據(jù),并且因此不能被附加到一個 不同的數(shù)據(jù)庫集簇或者單獨備份。類似地,如果丟失一個表空間(文件刪除、磁盤失效等), 數(shù)據(jù)庫集簇可能會變成不可讀或者無法啟動。把一個表空間放在一個臨時文件系統(tǒng) (如一個內(nèi)存虛擬盤)上會帶來整個集簇的可靠性風(fēng)險。
要定義一個表空間,使用CREATE TABLESPACE命令,例如:
CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';
這個位置必須是一個已有的空目錄,并且屬于PostgreSQL操作系統(tǒng)用戶。 所有后續(xù)在該表空間中創(chuàng)建的對象都將被存放在這個目錄下的文件中。該位置不能放在可移動 或者瞬時存儲上,因為如果表空間丟失會導(dǎo)致集簇?zé)o法工作。
通常在每個邏輯文件系統(tǒng)上創(chuàng)建多于一個表空間沒有什么意義,因為你無法控制在一個邏輯文件系統(tǒng)中特定文件的位置。不過,PostgreSQL不強(qiáng)制任何這樣的限制,并且事實上它不會注意你的系統(tǒng)上的文件系統(tǒng)邊界。它只是在你告訴它要使用的目錄中存儲文件。
表空間的創(chuàng)建本身必須作為一個數(shù)據(jù)庫超級用戶完成,但在創(chuàng)建完之后之后你可以允許普通數(shù)據(jù)庫用戶來使用它。要這樣做,給數(shù)據(jù)庫普通用戶授予表空間上的CREATE
權(quán)限。
表、索引和整個數(shù)據(jù)庫都可以被分配到特定的表空間。想這么做,在給定表空間上有 CREATE
權(quán)限的用戶必須把表空間的名字以一個參數(shù)的形式傳遞給相關(guān)的命令。例如,下面的命令在表空間space1
中創(chuàng)建一個表:
CREATE TABLE foo(i int) TABLESPACE space1;
另外,還可以使用default_tablespace參數(shù):
SET default_tablespace = space1;
CREATE TABLE foo(i int);
當(dāng)default_tablespace
被設(shè)置為非空字符串,那么它就為沒有顯式TABLESPACE
子句的CREATE TABLE
和CREATE INDEX
命令提供一個隱式TABLESPACE
子句。
還有一個temp_tablespaces參數(shù),它決定臨時表和索引的位置,以及用于大數(shù)據(jù)集排序等目的的臨時文件的位置。 這可以是一個表空間名的列表,而不是只有一個。因此,與臨時對象有關(guān)的負(fù)載可以散布在多個表空間上。每次要創(chuàng)建一個臨時對象時,將從列表中隨機(jī)取一個成員來存放它。
與一個數(shù)據(jù)庫相關(guān)聯(lián)的表空間用來存儲該數(shù)據(jù)庫的系統(tǒng)目錄。此外,如果沒有給出TABLESPACE
子句并且沒有在default_tablespace
或temp_tablespaces
(如適用)中指定其他選擇,它還是在該數(shù)據(jù)庫中創(chuàng)建的表、索引和臨時文件的默認(rèn)表空間。如果一個數(shù)據(jù)庫被創(chuàng)建時沒有指定表空間,它會使用其模板數(shù)據(jù)庫相同的表空間。
當(dāng)初始化數(shù)據(jù)庫集簇時,會自動創(chuàng)建兩個表空間。pg_global
表空間被用于共享系統(tǒng)目錄。pg_default
表空間是template1
和template0
數(shù)據(jù)庫的默認(rèn)表空間(并且,因此也將是所有其他數(shù)據(jù)庫的默認(rèn)表空間,除非被一個CREATE DATABASE
中的
TABLESPACE
子句覆蓋)。
表空間一旦被創(chuàng)建,就可以被任何數(shù)據(jù)庫使用,前提是請求的用戶具有足夠的權(quán)限。這也意味著,一個表空間只有在所有使用它的數(shù)據(jù)庫中所有對象都被刪除掉之后才可以被刪掉。
要刪除一個空的表空間,使用DROP TABLESPACE命令。
要確定現(xiàn)有表空間的集合,可檢查pg_tablespace
系統(tǒng)目錄,例如
SELECT spcname FROM pg_tablespace;
psql程序的\db
元命令也可以用來列出現(xiàn)有的表空間。
PostgreSQL使用符號連接來簡化表空間的實現(xiàn)。這就意味著表空間只能在支持符號連接的系統(tǒng)上使用。
$PGDATA/pg_tblspc
目錄包含指向集簇中定義的每個非內(nèi)建表空間的符號連接。 盡管我們不推薦,但還是可以通過手工重定義這些連接來調(diào)整表空間布局。在服務(wù)器運行時,絕不要這樣做。注意在 PostgreSQL 9.1 及更早的版本中,你將還需要用新位置更新pg_tablespace
目錄(如果你不更新,pg_dump
將繼續(xù)輸出舊的表空間位置)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: