W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
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
中存在兩個有用的標志: datistemplate
和datallowconn
列。datistemplate
可以被設置來指示該數據庫是不是要作為CREATE DATABASE
的模板。如果設置了這個標志,那么該數據庫可以被任何有 CREATEDB
權限的用戶克??;如果沒有被設置,那么只有超級用戶和該數據庫的擁有者可以克隆它。如果
datallowconn
為假,那么將不允許與該數據庫建立任何新的連接(但已有的會話不會因為把該標志設置為假而被中止)。template0
通常被標記為datallowconn = false
來阻止對它的修改。template0
和template1
通??偸潜粯擞洖? datistemplate = true
。
除了template1
是CREATE DATABASE
的默認源數據庫名之外, template1
和template0
沒有任何特殊的狀態(tài)。例如,我們可以刪除template1
然后從template0
重新創(chuàng)建它而不會有任何不良效果。如果我們不小心在
template1
中增加了一堆垃圾,那么我們就會建議做這樣的操作(要刪除template1
,它必須有pg_database.datistemplate = false
)。
當數據庫集簇被初始化時,也會創(chuàng)建postgres
數據庫。這個數據庫用于做為用戶和應用連接的默認數據庫。它只是 template1
的一個拷貝,需要時可以刪除并重建。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: