| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 18. 管理數據庫 | Fast Forward | Next |
CREATE DATABASE 實際上是通過拷貝一個現有的數據庫進行工作的。 缺省時,它拷貝名字叫 template1 的標準系統數據庫。 所以該數據庫是創建新數據庫的"模板"。如果你給 template1 增加對象,這些對象將被拷貝到隨後創建的用戶數據庫中。 這樣的行為允許節點對數據庫中的標準套件進行修改。 比如,如果你把過程語言 PL/pgSQL 安裝到 template1 裡,那麼你在創建用戶數據庫的時候它們就會自動可得,而不需要額外的動作。
系統裡還有第二個標準的系統數據庫,叫 template0。 這個數據庫包含和 template1 一開始時一樣的數據內容, 也就是說,只有你使用的版本的 PostgreSQL 標準的對象。在 initdb 之後,我們不應該對 template0 做任何修改。通過告訴 CREATE DATABASE 使用 template0 而不是 template1 進行拷貝, 你可以創建一個"純淨"的用戶數據庫,它不會包含任何 template1 裡節點所特有的東西。 這一點在恢復 pg_dump 轉儲的時候是非常方便的: 轉儲腳本應該在一個純潔的數據庫中恢復以確保我們創建了被轉儲出的數據庫中的正確內容, 而不和任何現在可能已經存在在 template1 中的附加物相衝突。
要通過拷貝 template0 的方法創建一個數據庫, 使用
CREATE DATABASE dbname TEMPLATE template0;
這條命令是在 SQL 環境裡的,或者是在 shell 裡
createdb -T template0 dbname
我們可以創建額外的模板數據庫,而且實際上我們可以在一個集群中通過將 CREATE DATABASE 的模板聲明為相應的數據庫名拷貝任何數據庫。 不過,我們必需明白,這個功能並非一般性的"COPY DATABASE"工具。 實際上,在拷貝操作的過程中,源數據庫必需是空閒狀態(沒有正在處理的數據修改事務)。 CREATE DATABASE 在操作開始時將會檢查確保沒有會話(除它自己以外)與源數據庫聯接, 但是這樣並不能保證在拷貝過程中不會發生修改的事情,如果發生這些事情,那麼會導致一個不一致的結果數據庫。 因此,我們建議那些用做模板的數據庫應該當做只讀庫對待.
在 pg_database 裡有兩個有用的標志可以用于每個數據庫: 字段 datistemplate 和 datallowconn。 datistemplate 表示該數據庫是準備用做 CREATE DATABASE 的模板的。 如果設置了這個標志,那麼該數據庫可以由任何有 CREATEDB 權限的用戶克隆;如果沒有設置,那麼只有超級用戶和該數據庫的所有者可以克隆它。 如果 datallowconn 為假,那麼將不允許與該數據庫發生任何新的連接(不過現有的會話不會因為把該標志設置為假而被殺死)。 template0 數據庫通常被標記為 datallowconn = false 以避免對它的修改。 template0 和 template1都應該總是標記為datistemplate = true。
完成模板數據庫的準備之後,或者對某個數據庫做了任何標記修改之後, 在該數據庫中執行一次 VACUUM FREEZE 或 VACUUM FULL FREEZE 是一個好主意。 如果做這些的時候在同一個數據庫中沒有其它打開的事務,那麼系統保證在數據庫中的行是"凍結"的, 並且不會受事務 ID 重疊的影響。這個動作對那些 datallowconn 設置為假的數據庫特別重要, 因為在這樣的數據庫上沒有辦法做日常維護性的VACUUM。 參閱 Section 21.1.3 獲取更多信息.
注意: template1 和 template0 沒有任何特殊的狀態, 除了 template1 這個名字是 CREATE DATABASE 以及各種象 createdb 這樣的程序的缺省源數據庫名之外。 比如,我們可以刪除 template1,然後從 template0 中創建它而不會有任何不良效果。如果我們不小心在 template1 裡加了一堆垃圾,那麼我們就會建議做這樣的操作。