PostgreSQL 模板數據庫

2021-08-31 15:29 更新

CREATE DATABASE實際上通過拷貝一個已有數據庫進行工作。默認情況下,它拷貝名為template1 的標準系統(tǒng)數據庫。所以該數據庫是創(chuàng)建新數據庫的模板。 如果你為template1數據庫增加對象,這些對象將被拷貝到后續(xù)創(chuàng)建的用戶數據庫中。 這種行為允許對數據庫中標準對象集合的站點本地修改。例如,如果你把過程語言PL/Perl安裝到 template1中,那么你在創(chuàng)建用戶數據庫后不需要額外的操作就可以使用該語言。

系統(tǒng)里還有名為template0 的第二個標準系統(tǒng)數據庫。 這個數據庫包含和template1初始內容一樣的數據,也就是說,只包含你的PostgreSQL版本預定義的標準對象。 在數據庫集簇被初始化之后,不應該對template0做任何修改。 通過指示CREATE DATABASE使用 template0取代template1進行拷貝, 你可以創(chuàng)建一個原始的用戶數據庫(其中不存在用戶定義的對象,并且系統(tǒng)對象沒有被改變),它不會包含任何template1中的站點本地附加物。 這一點在恢復一個pg_dump轉儲時非常方便:轉儲腳本應該在一個原始的數據庫中恢復以確保我們重建被轉儲數據庫的正確內容,而不和任何現在可能已經被加入到 template1中的附加物相沖突。

另一個從template0而不是template1復制的常見原因是, 可以在復制template0時指定新的編碼和區(qū)域設置,而一個template1的副本必須使用和它相同的設置。這是因為的template1可能包含編碼相關或區(qū)域相關的數據,而 template0中沒有。

要通過拷貝template0來創(chuàng)建一個數據庫,使用:SQL 環(huán)境中的

CREATE DATABASE dbname TEMPLATE template0;

或者 shell 中的

createdb -T template0 dbname

可以創(chuàng)建額外的模板數據庫,并且實際上可以通過將集簇中任意數據庫指定為CREATE DATABASE的模板來從該數據庫拷貝。不過,我們必需明白,這個功能并不是設計作為一般性的COPY DATABASE功能。主要的限制是當源數據庫被拷貝時,不能有其他會話連接到它。如果在 CREATE DATABASE開始時存在任何其它連接,那么該命令將會失敗。在拷貝操作期間,到源數據庫的新連接將被阻止。

對于每一個數據庫在pg_database 中存在兩個有用的標志: datistemplatedatallowconn列。datistemplate可以被設置來指示該數據庫是不是要作為CREATE DATABASE的模板。如果設置了這個標志,那么該數據庫可以被任何有 CREATEDB權限的用戶克??;如果沒有被設置,那么只有超級用戶和該數據庫的擁有者可以克隆它。如果 datallowconn為假,那么將不允許與該數據庫建立任何新的連接(但已有的會話不會因為把該標志設置為假而被中止)。template0通常被標記為datallowconn = false來阻止對它的修改。template0template1通??偸潜粯擞洖? datistemplate = true。

注意

除了template1CREATE DATABASE的默認源數據庫名之外, template1template0沒有任何特殊的狀態(tài)。例如,我們可以刪除template1然后從template0重新創(chuàng)建它而不會有任何不良效果。如果我們不小心在 template1中增加了一堆垃圾,那么我們就會建議做這樣的操作(要刪除template1,它必須有pg_database.datistemplate = false)。

當數據庫集簇被初始化時,也會創(chuàng)建postgres數據庫。這個數據庫用于做為用戶和應用連接的默認數據庫。它只是 template1的一個拷貝,需要時可以刪除并重建。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號