管理表空間
- 一、基本概念
- 二、創建表空間
- 三、修改表空間
- 四、刪除表空間
一、基本概念
在 PostgreSQL 中,它是通過表空間(Tablespaces)來實現邏輯對象(表、索引等)與物理文件之間的映射。創建數據庫或者數據表(包括索引)的時候,可以為其指定一個表空間
(tablespace)。表空間決定了這些對象在文件系統中的存儲路徑。
在PostgreSQL 中,表空間(tablespace)表示數據文件的存放目錄,這些數據文件代表了數據庫的對象,例如表或索引。當我們訪問表時,系統通過它所在的表空間定位到對應數據文件所在的位置。
表空間的引入為 PostgreSQL 的管理帶來了以下好處:
- 如果數據庫集群所在的初始磁盤分區或磁盤卷的空間不足,又無法進行擴展,可以在其他分區上創建一個新的表空間以供使用。
- 管理員可以根據數據庫對象的使用統計優化系統的性能。例如,可以將訪問頻繁的索引存放到一個快速且可靠的磁盤上,比如昂貴的固態硬盤。與此同時,將很少使用或者對性能要求不高的歸檔數據表存儲到廉價的低速磁盤上。
PostgreSQL 在集群初始化時將所有的數據文件和配置文件存儲到它的數據目錄中,通常是環境變量PGDATA 的值。默認創建了兩個表空間:
pg_default
,template1
和template0
默認的表空間,也是創建其他數據庫時的默認表空間;對應的目錄為PGDATA/base
。pg_global
,用于存儲一些集群級別的共享系統表(system catalogs),例如pg_database
、pg_control
;對應的目錄為PGDATA/global
。
初始安裝后,使用 psql 查詢默認創建的表空間:
同時也可以通過操作系統命令查看相應的目錄:
其中的 base 和 global 目錄分別對應表空間 pg_default 和 pg_global。
二、創建表空間
創建新的表空間使用CREATE TABLESPACE 語句:
CREATE TABLESPACE tablespace_name
OWNER user_name
LOCATION 'directory';
表空間的名稱不能以 pg_開頭,它們是系統表空間的保留名稱;LOCATION 參數必須指定絕對路徑名,指定的目錄必須是一個已經存在的空目錄,PostgreSQL 操作系統用戶(postgres)必須是該目錄的擁有者,以便能夠進行文件的讀寫。
接下來,我們使用目錄/var/lib/pgsql/創建一個新的表空間 app_tbs。先創建所需的目錄:
注意目錄的所有者和權限。然后使用具有 CREATEDB 權限的用戶創建表空間,此處我們使用 postgres 執行以下操作:
create tablespace app_tbs location '/var/lib/pgsql/app_tbs';
我們查看一下操作系統中的變化:
在表空間對應的目錄中,創建一個特定版本的子目錄。與此同時,在數據目錄下的 pg_tblspc 子目錄中,創建了一個指向表空間目錄的符號鏈接,名稱為表空間的 OID(16743):
默認情況下,執行 CREATE TABLESPACE 語句的用戶為該表空間的擁有者,也可以使用OWNER 選項指定擁有者。
對于普通用戶,需要授予表空間上的對象創建權限才能使用該表空間。我們為用戶 admin01 授予表空間 app_tbs 上的使用權限:
使用admin01 用戶連接到數據庫 testdb,然后在表空間app_tbs 中創建一個新的數據表t:
PostgreSQL 支持在 CREATE DATABASE、 CREATE TABLE、 CREATE INDEX 以及 ADD CONSTRAINT 語句中指定 tablespace_name 選項,覆蓋默認的表空間(pg_default)。也可以使用相應的 ALTER …語句將對象從一個表空間移到另一個表空間。
如果不想每次創建對象時手動指定表空間,可以使用配置參數 default_tablespace:
set default_tablespace = app_tbs;
三、修改表空間
如果需要修改表空間的定義,可以使用 ALTER TABLESPACE 語句:
-- 用于表空間的重命名
ALTER TABLESPACE name RENAME TO new_name;-- 用于修改表空間的擁有者
ALTER TABLESPACE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER };-- 后兩個語句用于設置表空間的參數
ALTER TABLESPACE name SET ( tablespace_option = value [, ... ] );ALTER TABLESPACE name RESET ( tablespace_option [, ... ] );
將表空間 app_tbs 重命名為 admin01_tbs:
只有表空間的擁有者或超級用戶才能修改表空間的定義。接下來將表空間 admin01_tbs 的擁有者修改為 admin01:
PostgreSQL 支 持設 置的 表空 間參 數包 括 seq_page_cost、 random_page_cost 以 及
effective_io_concurrency。它們用于查詢計劃器選擇執行計劃時的代價評估。
目前,PostgreSQL 還不支持使用語句修改表空間的存儲路徑。但是,可以通過手動的方式移動表空間的位置:
- 停止 PostgreSQL 服務器進程;
- 移動文件系統中的數據文件位置;
- 修改 PGDATA/pg_tblspc 目錄中的符號鏈接文件(需要提前獲取文件名),指向新的目錄;
- 啟動 PostgreSQL 服務器進程。
四、刪除表空間
對于不再需要的表空間,可以使用 DROP TABLESPACE 語句進行刪除:
DROP TABLESPACE [ IF EXISTS ] name;
-- IF EXISTS 可以避免刪除不存在的表空間時產生錯誤信息。
只有表空間的擁有者或超級用戶能夠刪除表空間。刪除表空間之前需要確保其中不存在任何數據庫對象,否則無法刪除。刪除表空間時,同時會刪除文件系統中對應的表空間子目錄。