PostgreSQL 管理資料庫
管理資料庫
每個正在執行的PostgreSQL 伺服器例項都管理著一個或多個數據庫。因此,在組織SQL物件(“資料庫物件”)的層次中,資料庫位於最頂層。
本章描述資料庫的屬性,以及如何建立、管理、刪除它們。
1. 概述
資料庫是一些SQL物件(“資料庫物件”) 的命名集合。通常每個資料庫物件(表、函式等)屬於並且只屬於一個數據庫。
(不過有幾個系統表如pg_database 屬於整個叢集並且可以在叢集之內的每個資料庫中訪問)
因此完整的層次是這樣的:伺服器、資料庫、模式、表 (或者某些其他物件型別,如函式)。
模式只是一個純粹的邏輯結構, 並且誰能訪問某個模式由許可權系統管理。
postgres=# SELECT datname FROM pg_database;
datname
-----------
template1
template0
postgres
exampledb
postgres-# \l
2. 建立一個數據庫
CREATE DATABASE name;
其他人建立一個數據庫,並且使其成為新資料庫的所有者
CREATE DATABASE dbname OWNER rolename;
3. 模板資料庫
CREATE DATABASE實際上通過拷貝一個已有資料庫進行工作。 預設情況下,它拷貝名為template1 的標準系統資料庫。所以該資料庫是建立新資料庫的“模板”。
如果你為template1資料庫增加物件, 這些物件將被拷貝到後續建立的使用者資料庫中。 這種行為允許對資料庫中標準物件集合的站點本地修改。
postgres-# create database hq owner dbuser;
ERROR: syntax error at or near "-"
LINE 1: -l
^
postgres=# SELECT rolname FROM pg_roles;
rolname
----------
postgres
dbuser
(2 rows)
postgres=# CREATE DATABASE hq OWNER dbuser;
CREATE DATABASE
系統裡還有名為template0 的第二個標準系統資料庫。這個資料庫包含和template1 初始內容一樣的資料,也就是說,
只包含你的PostgreSQL 版本預定義的標準物件。在資料庫集簇被初始化之後,不應該對template0 做任何修改。
通過指示CREATE DATABASE使用template0 而不是template1進行拷貝,你可以建立一個“純淨的”使用者資料庫, 它不會包
含任何template1中的站點本地附加物。
這一點在恢復一個pg_dump轉儲時非常方便: 轉儲指令碼應該在一個純淨的資料庫中恢復以確保我們重建被轉儲資料庫的正確內容, 而不和任何
現在可能已經被加入到template1中的附加物相沖突。
CREATE DATABASE dbname TEMPLATE template0;
可以建立額外的模板資料庫,並且實際上可以通過將集簇中任意資料庫指定為 CREATEDATABASE的模板來從該資料庫拷貝
如果在CREATE DATABASE開始時存在任何其它連線,那麼該命令將會失敗。 在拷貝操作期間,到源資料庫的新連線將被阻止。
對於每一個數據庫在pg_database中存在兩個有用的標誌:datistemplate和datallowconn列。
datistemplate可以被設定來指示該資料庫是不是要作為 CREATE DATABASE的模板。如果設定了這個標誌,那麼該資料庫可以被任何
有 CREATEDB許可權的使用者克隆;如果沒有被設定, 那麼只有超級使用者和該資料庫的所有者可以克隆它。
如果datallowconn為假, 那麼將不允許與該資料庫建立任何新的連線(但已有的會話不會因為把該標誌設定為假而被中止)。
template0資料庫通常被標記為datallowconn = false來阻止對它的修改。 template0和template1通常總是被標記為datistemplate = true。
注意
例如, 我們可以刪除template1然後從template0 重新建立它而不會有任何不良效果。
如果我們不小心在template1 中增加了一堆垃圾,那麼我們就會建議做這樣的操作(要刪除template1, 它必須有pg_database.datistemplate = false)
4. 資料庫配置
PostgreSQL 伺服器提供了大量的執行時配置變數。
例如,如果由於某種原因,你想禁用指定資料庫上的GEQO優化器, 正常情況下你不得不對
所有資料庫禁用它,或者確保每個連線的客戶端小心地發出了 SET geqo TO off。要令這
個設定在一個特定資料庫中成為預設值, 你可以執行下面的命令:
ALTER DATABASE mydb SET geqo TO off;
這樣將儲存該設定(但不是立即設定它)。 在後續建立的到該資料庫的連線中它將表現得像
在會話開始後馬上呼叫 SET geqo TO off;。注意使用者仍然可以在該會話中更改這個設定,
它只是預設值。要撤消這樣的設定,使用 ALTER DATABASE dbname RESET varname。
5. 銷燬一個數據庫
DROP DATABASE name;
只有資料庫的所有者或者超級使用者才可以刪除資料庫。 刪除資料庫會移除其中包括的所有物件。資料庫的刪除不能被撤銷。
你不能在與目標資料庫連線時執行DROP DATABASE命令。
為了方便,有一個在shell上執行的命令可以刪除資料庫, dropdb:
dropdb dbname
6. 表空間
PostgreSQL中的表空間允許資料庫管理員在檔案系統中定義用來 存放表示資料庫物件的檔案的位置。
一旦被建立, 表空間就可以在建立資料庫物件時通過名稱引用。
通過使用表空間,管理員可以控制一個PostgreSQL安裝的磁碟佈局。
注意:即便是位於主要的 PostgreSQL 資料目錄之外,表空間也是資料庫集簇的一部分 並且不能被視作資料檔案的一個自治集合。
如果丟失一個表空間(檔案刪除、磁碟失效等), 資料庫集簇可能會變成不可讀或者無法啟動。把一個表空間放在一個臨時檔案
系統 (如一個RAM磁碟)上會帶來整個集簇的可靠性風險。
CREATE TABLESPACE fastspace LOCATION ’/ssd1/postgresql/data’;
這個位置必須是一個已有的空目錄,並且屬於PostgreSQL作業系統使用者。
表、索引和整個資料庫都可以被分配到特定的表空間。
CREATE TABLE foo(i int) TABLESPACE space1;
SET default_tablespace = space1;
CREATE TABLE foo(i int);
還有一個temp_tablespaces引數,它決定臨時表和索引的位置, 以及如用於大資料集排序等目的的臨時檔案的位置。
與一個數據庫相關聯的表空間用來儲存該資料庫的系統目錄。此外,如果沒有給出TABLESPACE子句並且沒有在
default_tablespace或 temp_tablespaces(如適用)中指定其他選擇, 它還是在該資料庫中建立的表、索引
和臨時檔案的預設表空間。 如果建立資料庫時沒有宣告表空間,它會使用與模板資料庫相同的表空間。
當初始化資料庫集簇時,會自動建立兩個表空間。pg_global 表空間被用於共享系統目錄。
pg_default表空間是template1 和template0資料庫的預設表空間(並且, 因此也將是所有其他資料庫的預設表空間
,除非被一個CREATE DATABASE 中的TABLESPACE子句覆蓋)。
表空間一旦被建立,就可以被任何資料庫使用,前提是發出請求的使用者具有足夠的許可權。
要刪除一個空的表空間,使用DROP TABLESPACE命令。
要確定現有表空間的集合,可檢查pg_tablespace 系統目錄,例如
postgres=# SELECT spcname FROM pg_tablespace;
spcname
------------
pg_default
pg_global
(2 rows)
postgres=# \db
List of tablespaces
Name | Owner | Location
------------+----------+----------
pg_default | postgres |
pg_global | postgres |
(2 rows)
PostgreSQL使用符號連線來簡化表空間的實現。 這就意味著表空間只能在支援符號連線的系統上使用。