2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

22.3. 模板資料庫 #

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 中存在兩個有用的標誌:datistemplatedatallowconn 列。datistemplate 可以設定為表示一個數據庫是為 CREATE DATABASE 準備的模板。如果設定了此標誌,任何具有 CREATEDB 許可權的使用者都可以克隆該資料庫;如果未設定,則只有超級使用者和資料庫所有者才能克隆它。如果 datallowconn 為 false,則不允許連線到該資料庫的新連線(但僅將標誌設定為 false 不會終止現有會話)。template0 資料庫通常標記為 datallowconn = false 以防止被修改。 template0template1 都應始終標記為 datistemplate = true

注意

template1template0 除了 CREATE DATABASE 命令預設源資料庫名稱是 template1 之外,沒有其他特殊之處。例如,可以刪除 template1 並從 template0 重新建立它,而不會產生任何不良影響。如果使用者不小心在 template1 中添加了大量無用物件,則可能建議採取此措施。(要刪除 template1,它必須具有 pg_database.datistemplate = false。)

資料庫叢集初始化時也會建立 postgres 資料庫。該資料庫是用作使用者和應用程式連線的預設資料庫。它只是 template1 的副本,如有必要,可以刪除並重新建立。

提交更正

如果您在文件中看到任何不正確的內容、與您使用該功能時的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。