CREATE DATABASE
實際上是透過複製現有的資料庫來運作。預設情況下,它會複製名為 template1
的標準系統資料庫。 因此,該資料庫是建立新資料庫的「範本」。如果您將物件新增至 template1
,這些物件將被複製到後續建立的使用者資料庫中。此行為允許對資料庫中的標準物件集進行站台本地修改。例如,如果您在 template1
中安裝程序語言 PL/Perl,它將自動在使用者資料庫中可用,而無需在建立這些資料庫時採取任何額外動作。
然而,CREATE DATABASE
不會複製附加到來源資料庫的資料庫層級 GRANT
權限。新的資料庫具有預設的資料庫層級權限。
還有第二個名為 template0
的標準系統資料庫。 此資料庫包含與 template1
的初始內容相同的資料,也就是說,僅包含您的 PostgreSQL 版本預定義的標準物件。template0
在資料庫叢集初始化後絕不應更改。透過指示 CREATE DATABASE
複製 template0
而不是 template1
,您可以建立一個「原始」使用者資料庫(其中不存在任何使用者定義的物件,並且系統物件未被更改),其中不包含 template1
中的任何站台本地新增項目。當還原 pg_dump
轉儲時,這特別方便:應將轉儲腳本還原到原始資料庫中,以確保重新建立轉儲資料庫的正確內容,而不會與稍後可能新增到 template1
的物件發生衝突。
複製 template0
而不是 template1
的另一個常見原因是,複製 template0
時可以指定新的編碼和語言環境設定,而 template1
的副本必須使用與其相同的設定。這是因為 template1
可能包含特定於編碼或特定於語言環境的資料,而 template0
已知不包含。
要透過複製 template0
來建立資料庫,請使用
CREATE DATABASE dbname
TEMPLATE template0;
從 SQL 環境,或
createdb -T template0 dbname
從 shell。
可以建立其他範本資料庫,並且確實可以透過將叢集中任何資料庫的名稱指定為 CREATE DATABASE
的範本來複製該資料庫。但是,重要的是要了解,這(還)不打算作為通用「COPY DATABASE
」工具。主要限制是,在複製來源資料庫時,沒有其他會話可以連接到該資料庫。如果啟動時存在任何其他連線,CREATE DATABASE
將會失敗;在複製作業期間,將阻止建立與來源資料庫的新連線。
在每個資料庫的 pg_database
中,存在兩個有用的旗標:datistemplate
和 datallowconn
這兩個欄位。datistemplate
可被設定為指示該資料庫是否作為 CREATE DATABASE
指令的樣板。 如果設定此旗標,則任何擁有 CREATEDB
權限的使用者都可以複製該資料庫;如果未設定,則只有超級使用者和資料庫擁有者可以複製它。 如果 datallowconn
為 false,則不允許與該資料庫建立任何新連線 (但現有的連線不會僅僅因為設定此旗標為 false 而終止)。template0
資料庫通常會被標記為 datallowconn = false
,以防止被修改。template0
和 template1
都應始終標記為 datistemplate = true
。
template1
和 template0
除了 template1
這個名稱是 CREATE DATABASE
指令預設的來源資料庫名稱之外,沒有任何特殊狀態。 例如,可以刪除 template1
並從 template0
重新建立它,而不會產生任何不良影響。 如果不小心在 template1
中添加了一堆垃圾,則這種做法可能是明智的。(要刪除 template1
,必須將 pg_database.datistemplate
設為 false
。)
當初始化資料庫叢集時,也會建立 postgres
資料庫。 這個資料庫旨在作為使用者和應用程式連線的預設資料庫。 它只是 template1
的一個副本,如果需要可以刪除並重新建立。
如果您在文件中發現任何不正確、與您特定功能的使用經驗不符或需要進一步澄清的地方,請使用此表格來回報文件問題。