| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 18. 管理資料庫 | Fast Forward | Next |
PostgreSQL 裡的資料表空間允許資料庫管理員在文件系統裡定義那些代資料表資料庫對象的文件存放的位置。 一旦建立了資料表空間,那麼就可以在建立資料庫對象的時候引用它。
透過使用資料表空間,管理員可以控制一個 PostgreSQL 安裝的磁盤佈局。 這麼做至少有兩個用處。首先,如果初始化集群所在的分區或者卷用光了空間,而又不能邏輯上擴展或者別的什麼操作, 那麼資料表空間可以在一個不同的分區上建立和使用,直到系統可以重新配置。
第二,資料表空間允許管理員根據資料庫對象的使用模式安排資料位置,從而優化性能。 比如,一個很頻繁使用的索引可以放在非常快的,並且非常可靠的磁盤上,比如一種非常貴的固態設備。 而同時,一個儲存歸檔的資料,很少使用的,或者對性能要求不高的資料表可以儲存在一個沒那麼昂貴,比較慢的磁盤系統上。
要定義一個資料表空間,使用 CREATE TABLESPACE 命令, 比如:
CREATE TABLESPACE fastspace LOCATION '/mnt/sda1/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 TABLE 和 CREATE INDEX 命令提供一個隱含的 TABLESPACE 子句。
與一個資料庫相關聯的資料表空間用於儲存該資料庫的系統資料表,以及任何使用該資料庫的伺服器進程建立的臨時文件。 另外,如果在建立資料庫對象是沒有給出 TABLESPACE 子句(不管是明確的還是透過 default_tablespace), 那麼這是在該資料庫裡建立這些任何對像使用的預設資料表空間。 如果建立資料庫時沒有給它聲明一個資料表空間,那麼它使用與它拷貝的模版資料庫相同的資料表空間。
initdb 自動建立兩個資料表空間。pg_global 資料表空間用於共享的系統資料表。 pg_default 是 template1 和 template0 資料庫的預設資料表空間 (因此,這個資料表空間也將是任何其它資料庫的預設資料表空間,除非在 CREATE DATABASE 的時候使用了明確的 TABLESPACE 子句。)
建立了資料表空間之後,它就可以用於任何資料庫,只要請求的用戶有足夠權限。 這意味著除非我們把使用這個資料表空間的所有資料庫裡的所有對象抖刪除掉,否則我們不能刪除該資料表空間。
要刪除一個空的資料表空間,使用 DROP TABLESPACE 命令。
要判斷一套現有的資料表空間,檢查系統資料表 pg_tablespace,比如
SELECT spcname FROM pg_tablespace;
psql 程序的 \db 元命令也可以用於列出現有資料表空間。
為了簡化資料表空間的實現,PostgreSQL 使用了大量符號連接。 這就意味著資料表空間只能在支援符號連接的系統上使用。
目錄 $PGDATA/pg_tblspc 包含指向集群裡定義的每個非內置的資料表空間的符號連接。 儘管我們不建議,但是我們還是可能透過手工重定義這些連接來調整資料表空間的佈局。 兩個警告:在 postmaster 執行的時候不要這麼干;並且,在您重啟 postmaster 之後, 更新 pg_tablespace 資料表以顯示新的位置。(如果您不這麼做,pg_dump 將繼續顯示舊的資料表空間位置。)