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
除了 CREATE DATABASE
命令預設源資料庫名稱是 template1
之外,沒有其他特殊之處。例如,可以刪除 template1
並從 template0
重新建立它,而不會產生任何不良影響。如果使用者不小心在 template1
中添加了大量無用物件,則可能建議採取此措施。(要刪除 template1
,它必須具有 pg_database.datistemplate = false
。)
資料庫叢集初始化時也會建立 postgres
資料庫。該資料庫是用作使用者和應用程式連線的預設資料庫。它只是 template1
的副本,如有必要,可以刪除並重新建立。
如果您在文件中看到任何不正確的內容、與您使用該功能時的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。