一、概述:
數據庫可以被看成是SQL對象(數據庫對象)的命名集合,通常而言,每個數據庫對象(表、函數等)只屬於一個數據庫。不過對於部分系統表而言,如pg_database,是屬於整個集群的。更准確地說,數據庫是模式的集合,而模式包含表、函數等SQL對象。因此完整的對象層次應該是這樣的:服務器、數據庫、模式、表或其他類型的對象。
在與數據庫服務器建立連接時,該連接只能與一個數據庫形成關聯,不允許在一個會話中進行多個數據庫的訪問。如以postgres用戶登錄,該用戶可以訪問的缺省數據庫為postgres,在登錄後如果執行下面的SQL語句將會收到PostgreSQL給出的相關錯誤信息。
復制代碼 代碼如下:
postgres=# SELECT * FROM MyTest."MyUser".testtables;
ERROR: cross-database references are not implemented: "otherdb.otheruser.sometable"
LINE 1: select * from otherdb.otheruser.sometable
在PostgreSQL中,數據庫在物理上是相互隔離的,對它們的訪問控制也是在會話層次上進行的。然而模式只是邏輯上的對象管理結構,是否能訪問某個模式的對象是由權限系統來控制的。
執行下面的基於系統表的查詢語句可以列出現有的數據庫集合。
復制代碼 代碼如下:
SELECT datname FROM pg_database;
注:psql應用程序的\l元命令和-l命令行選項也可以用來列出當前服務器中已有的數據庫。
二、創建數據庫:
在PostgreSQL服務器上執行下面的SQL語句可以創建數據庫。
復制代碼 代碼如下:
CREATE DATABASE db_name;
在數據庫成功創建之後,當前登錄角色將自動成為此新數據庫的所有者。在刪除該數據庫時,也需要該用戶的特權。如果你想讓當前創建的數據庫的所有者為其它角色,可以執行下面的SQL語句。
復制代碼 代碼如下:
CREATE DATABASE db_name OWNER role_name;
三、修改數據庫配置:
PostgreSQL服務器提供了大量的運行時配置變量,我們可以根據自己的實際情況為某一數據庫的某一配置變量指定特殊值,通過執行下面的SQL命令可以使該數據庫的某一配置被設置為指定值,而不再使用缺省值。
復制代碼 代碼如下:
ALTER DATABASE db_name SET varname TO new_value;
這樣在之後基於該數據庫的會話中,被修改的配置值已經生效。如果要撤消這樣的設置並恢復為原有的缺省值,可以執行下面的SQL命令。
復制代碼 代碼如下:
ALTER DATABASE dbname RESET varname;
四、刪除數據庫:
只有數據庫的所有者和超級用戶可以刪除數據庫。刪除數據庫將會刪除數據庫中包括的所有對象,該操作是不可恢復的。見如下刪除SQL命令:
復制代碼 代碼如下:
DROP DATABASE db_name;
五、表空間:
在PostgreSQL中,表空間表示一組文件存放的目錄位置。在創建之後,就可以在該表空間上創建數據庫對象。通過使用表空間,管理員可以控制一個PostgreSQL服務器的磁盤布局。這樣管理員就可以根據數據庫對象的數據量和數據使用頻度等參照來規劃這些對象的存儲位置,以便減少IO等待,從而優化系統的整體運行性能。比如,將一個使用頻繁的索引放在非常可靠、高效的磁盤設備上,如固態硬盤。而將很少使用的數據庫對象存放在相對較慢的磁盤系統上。下面的SQL命令用於創建表空間。
復制代碼 代碼如下:
CREATE TABLESPACE fastspace LOCATION '/mnt/sda1/postgresql/data';
需要說明的是,表空間指定的位置必須是一個現有的空目錄,且屬於PostgreSQL系統用戶,如postgres。在成功創建之後,所有在該表空間上創建的對象都將被存放在這個目錄下的文件裡。
在PostgreSQL中只有超級用戶可以創建表空間,但是在成功創建之後,就可以允許普通數據庫用戶在其上創建數據庫對象了。要完成此操作,必須在表空間上給這些用戶授予CREATE權限。表、索引和整個數據庫都可以放在特定的表空間裡。見如下SQL命令:
復制代碼 代碼如下:
CREATE TABLE foo(i int) TABLESPACE space1;
此外,我們還可以通過修改default_tablespace配置變量,以使指定的表空間成為缺省表空間,這樣在創建任何數據庫對象時,如果沒有顯示指定表空間,那麼該對象將被創建在缺省表空間中,如:
復制代碼 代碼如下:
SET default_tablespace = space1;
CREATE TABLE foo(i int);
與數據庫相關聯的表空間用於存儲該數據庫的系統表,以及任何使用該數據庫的服務器進程創建的臨時文件。
要刪除一個空的表空間,可以直接使用DROP TABLESPACE命令,然而要刪除一個包含數據庫對象的表空間,則需要先將該表空間上的所有對象全部刪除後,才可以再在刪除該表空間。
要檢索當前系統中有哪些表空間,可以執行以下查詢,其中pg_tablespace為PostgreSQL中的系統表。
復制代碼 代碼如下:
SELECT spcname FROM pg_tablespace;
我們還可以通過psql程序的\db元命令列出現有的表空間。