?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
PostgreSQL里的表空間允許數(shù)據(jù)庫管理員在文件系統(tǒng)里定義那些代表 數(shù)據(jù)庫對象的文件存放位置。一旦創(chuàng)建了表空間,那么就可以在創(chuàng)建數(shù)據(jù)庫對象的時候引用它。
通過使用表空間,管理員可以控制一個 PostgreSQL 安裝的磁盤布局。 這么做至少有兩個用處。首先,如果初始化集群所在的分區(qū)或者卷用光了空間, 而又不能邏輯上擴展或者別的什么操作,那么表空間可以在一個不同的分區(qū)上創(chuàng)建和使用, 直到系統(tǒng)可以重新配置。
第二,表空間允許管理員根據(jù)數(shù)據(jù)庫對象的使用模式安排數(shù)據(jù)位置,從而優(yōu)化性能。 比如,一個很頻繁使用的索引可以放在非常快并且非??煽康拇疟P上,比如一種非常貴的固態(tài)設備。 而同時,一個存儲歸檔的數(shù)據(jù),很少使用的或者對性能要求不高的表可以存儲在一個便宜但比較慢的磁盤系統(tǒng)上。
要定義一個表空間,使用 命令,比如:
CREATE TABLESPACE fastspace LOCATION '/mnt/sda1/postgresql/data';
這個位置必須是一個現(xiàn)有的空目錄,并且屬于 PostgreSQL 系統(tǒng)用戶。 所有隨后在該表空間創(chuàng)建的對象都將被存放在這個目錄下的文件里。
Note: 當在邏輯文件系統(tǒng)上定義不止一個表空間時,并沒有那么多的條件,因為您無法控制邏輯文件系統(tǒng)中的特定文件的位置。 然而,的PostgreSQL不執(zhí)行任何這樣的限制,并且實際上是不直接識別您的文件系統(tǒng)邊界,它僅僅只是存儲在你定義的目錄中。
創(chuàng)建表空間時必須是數(shù)據(jù)庫超級用戶, 但在創(chuàng)建完之后之后,可以給數(shù)據(jù)庫普通用戶授予create的權限(在該表空間上的權限)來使用它。
表、索引和整個數(shù)據(jù)庫都可以放在特定的表空間里。想要這么做的話, 在給定表空間上有 CREATE權限的用戶必須把表空間的名字以一個參數(shù)的形式傳遞給相關的命令。 比如,下面的命令在表空間space1上創(chuàng)建一個表:
CREATE TABLE foo(i int) TABLESPACE space1;
另外,還可以使用default_tablespace參數(shù):
SET default_tablespace = space1; CREATE TABLE foo(i int);
只要default_tablespace被設置為非空字符串, 那么它就為沒有明確使用 TABLESPACE 子句的CREATE TABLE 和CREATE INDEX 命令提供一個隱含的子句。
還有temp_tablespaces參數(shù), 決定臨時表和索引的位置,以及如用于對大數(shù)據(jù)進行排序的臨時文件。 這可以是一個表空間名的列表,而不是只有一個,因此,與臨時對象有關的負載可以遍及 多個表空間。列表中的一個隨機成員每次采摘時創(chuàng)建一個臨時對象。
與數(shù)據(jù)庫相關聯(lián)的表空間用來存儲該數(shù)據(jù)庫的系統(tǒng)目錄表。 此外,如果沒有TABLESPACE條款給出,并且 default_tablespace或者 temp_tablespaces(如適用)沒有進行其他的聲明時,它還是在該數(shù)據(jù)庫中創(chuàng)建的表,索引,臨時文件的默認表空間。 如果沒有創(chuàng)建數(shù)據(jù)庫時沒有聲明表空間,它會使用與模板數(shù)據(jù)庫相同的表空間。
當初始化數(shù)據(jù)庫集群時,自動創(chuàng)建兩個表空間: pg_global(用于存儲共享系統(tǒng)目錄表)和 pg_default表空間,這個表空間是表是默認的表空間 template1和template0數(shù)據(jù)庫的默認表空間,因此,如果CREATE DATABASE時沒有 通過TABLESPACE字句聲明表空間,那么,pg_default表空間會是作為該數(shù)據(jù)庫的默認表空間。
表空間一旦被創(chuàng)建,那么它就可以被任何數(shù)據(jù)庫使用,并提供給 發(fā)出請求的用戶足夠的權限。這也意味著,一個表空間 只有在表空間中所有數(shù)據(jù)庫下所有對象都被刪除掉之后才可以被刪掉。
要刪除一個空的表空間,使用 DROP TABLESPACE 命令。
通過查看pg_tablespace 系統(tǒng)表,可以獲取已有的表空間的屬性,比如
SELECT spcname FROM pg_tablespace;
psql程序的 \db 命令也可以用于列出現(xiàn)有表空間。
PostgreSQL通過使用符號連接來簡化表空間的實施,這就意味著表空間只能在支持符號連接的系統(tǒng)上使用。
$PGDATA/pg_tblspc 目錄下包含指向集群里定義的每個非內置表空間的符號連接。 盡管我們不建議,但是我們還是可能通過手工重定義這些連接來調整表空間的布局。 兩個警告:在服務器運行時,以及重啟服務器之后,更新 pg_tablespace 表的顯示新位置時不能這么做。 否則pg_dump 將繼續(xù)顯示舊的表空間位置。