| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| 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 是一個好主意。 如果做這些的時候在同一個資料庫中沒有其它打開的交易,那麼系統保證在資料庫中的行是"凍結"的, 並且不會受交易 ID 重疊的影響。這個動作對那些 datallowconn 設置為假的資料庫特別重要, 因為在這樣的資料庫上沒有辦法做日常維護性的VACUUM。 參閱 Section 21.1.3 獲取更多訊息。
注意: template1 和 template0 沒有任何特殊的狀態, 除了 template1 這個名字是 CREATE DATABASE 以及各種象 createdb 這樣的程序的預設源資料庫名之外。 比如,我們可以刪除 template1,然後從 template0 中建立它而不會有任何不良效果。如果我們不小心在 template1 裡加了一堆垃圾,那麼我們就會建議做這樣的操作。