一、簡介
template1和template0是PostgreSQL的模板數據庫。所謂模板數據庫就是創建新database時,PostgreSQL會基於模板數據庫制作一份副本,其中會包含所有的數據庫設置和數據文件。PostgreSQL安裝好以后會默認附帶兩個模板數據庫:template0和template1。
PostgreSQL默認初始化數據庫后,模板數據庫template0和template1包含的內容是一致的。在PG中創建數據庫時,默認是從template1模板數據庫中克隆出來的!
我們知道創建數據庫時的語法為:
如:create database aaaa with template='template0' encoding ='UTF8' lc_collate='C' lc_ctype='en_US.utf8' owner='test123'; 其中template表示模板數據庫。建庫時如果不指定 TEMPLATE 屬性,默認用的是 template1 模板庫。
二、template1和template0的區別是什么?1、template1 可以連接,template0 不可以連接。
2、使用 template1 模板庫建庫時不可指定新的 encoding 和 locale,而 template0 可以。這里的“新的”指的是非UTF8,使用\l 命令查看template0和template1的encoding和locale
我們看到template0和template1的encoding是UTF8、Collate為en_US.utf8、Ctype為en_US.utf8。
注:template0和template1都不能被刪除(需要特殊手段)。
三、怎么創建模板數據庫?
1、除了template0和template1,能指定is_template創建自定義模板庫。
create database lhrtmpdb with template template0 lc_collate 'en_US.utf8' lc_ctype 'en_US.utf8' is_template=true;
2、如何刪除剛創建模板數據庫?
解決需要先把模板庫改成普通庫再刪除。
四、模板template1
在PG中創建數據庫時,默認是從template1模板數據庫中克隆出來的!
CREATE DATABASE實際上通過拷貝一個已有數據庫進行工作。默認情況下,它拷貝名為template1的標准系統數據庫。所以該數據庫是創建新數據庫的“模板”。 如果你為template1數據庫增加對象,這些對象將被拷貝到后續創建的用戶數據庫中。 這種行為允許對數據庫中標准對象集合的站點本地修改。例如,如果你把過程語言PL/Perl安裝到 template1中,那么你在創建用戶數據庫后不需要額外的操作就可以使用該語言。
五、總結
CREATE DATABASE實際上通過拷貝一個已有數據庫進行工作。默認情況下,它拷貝名為template1的標准系統數據庫。所以該數據庫是創建新數據庫的“模板”。 如果你為template1數據庫增加對象,這些對象將被拷貝到后續創建的用戶數據庫中。 這種行為允許對數據庫中標准對象集合的站點本地修改。例如,如果你把過程語言PL/Perl安裝到 template1中,那么你在創建用戶數據庫后不需要額外的操作就可以使用該語言。 系統里還有名為template0的第二個標准系統數據庫。 這個數據庫包含和template1初始內容一樣的數據,也就是說,只包含你的PostgreSQL版本預定義的標准對象。 在數據庫集簇被初始化之后,不應該對template0做任何修改。 通過指示CREATE DATABASE使用template0取代template1進行拷貝, 你可以創建一個“原始的”用戶數據庫(其中不存在用戶定義的對象,並且系統對象沒有被改變),它不會包含任何template1中的站點本地附加物。 這一點在恢復一個pg_dump轉儲時非常方便:轉儲腳本應該在一個原始的數據庫中恢復以確保我們重建被轉儲數據庫的正確內容,而不和任何現在可能已經被加入到template1中的附加物相沖突。
另一個從template0而不是template1復制的常見原因是, 可以在復制template0時指定新的編碼和區域設置,而一個template1的副本必須使用和它相同的設置。這是因為的template1可能包含編碼相關或區域相關的數據,而template0中沒有。
要通過拷貝template0
來創建一個數據庫,使用:SQL 環境中的
CREATE DATABASE dbname TEMPLATE template0;
或者 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。
六、注意
除了template1是CREATE DATABASE的默認源數據庫名之外, template1和template0沒有任何特殊的狀態。例如,我們可以刪除template1然后從template0重新創建它而不會有任何不良效果。如果我們不小心在template1中增加了一堆垃圾,那么我們就會建議做這樣的操作(要刪除template1,它必須有pg_database.datistemplate = false)。 當數據庫集簇被初始化時,也會創建postgres數據庫。這個數據庫用於做為用戶和應用連接的默認數據庫。它只是 template1的一個拷貝,需要時可以刪除並重建。