PostgreSQL的兩個模板庫

T1YSL發表於2021-07-14

PostgreSQL裡包含兩個標準系統資料庫,template0和template1。

建立資料庫時,CREATE DATABASE透過複製一個已有資料庫進行工作。預設情況下,它複製名為template1的標準系統資料庫  ,所以template1是建立新資料庫的模板,如果給template1資料庫增加物件,這些物件將被複製到後續建立的使用者資料庫中。

postgres=# \c template1
You are now connected to database "template1" as user "postgres".
template1=# \dt
        List of relations
Schema | Name | Type  |  Owner   
--------+------+-------+----------
public | ysl  | table | postgres
(1 row)
template1=# create database sarah;
CREATE DATABASE
template1=# \c sarah
You are now connected to database "sarah" as user "postgres".
sarah=# \dt
        List of relations
Schema | Name | Type  |  Owner   
--------+------+-------+----------
public | ysl  | table | postgres
(1 row)

系統裡還有名為template0的第二個標準系統資料庫。這個資料庫包含和template1初始內容一樣的資料,也就是說,只包含你的PostgreSQL版本預定義的標準物件。在資料庫被初始化之後,不應該對template0做任何修改。透過指示CREATE DATABASE使用template0取代template1進行複製,你可以建立一個“純淨的”使用者資料庫,它不會包含任何template1中的任何物件。 在恢復一個pg_dump轉儲時非常方便:在一個完全乾淨的資料庫中恢復以確保我們重建被轉儲資料庫的正確內容,而不會和任何現在可能已經被加入到template1中的物件衝突。

而且可以在複製template0時指定新的編碼和區域設定,但是template1的副本必須使用和它相同的設定。這是因為的template1可能包含編碼相關或區域相關的資料,而template0中沒有。

透過複製template0來建立一個資料庫的方法

1.SQL環境

sarah=# CREATE DATABASE dbname TEMPLATE template0;

2.shell

[postgres@ysla ~]$ createdb -T template0 dbname

對於每一個資料庫在pg_database中存在兩個有用的標誌: datistemplate和datallowconn列。datistemplate可以被設定來指示該資料庫是不是要作為CREATE DATABASE的模板。如果設定了這個標誌,那麼該資料庫可以被任何有 CREATEDB許可權的使用者克隆;如果沒有被設定,那麼只有超級使用者和該資料庫的擁有者可以克隆它。如果datallowconn為f,那麼將不允許與該資料庫建立任何新的連線(但已有的會話不會因為把該標誌設定為f而被中止)。template0通常被標記為datallowconn = f來阻止對它的修改。template0和template1通常總是被標記為datistemplate = t

sarah=# select * from pg_database;
  oid  |  datname  | datdba | encoding | datcollate  |  datctype   | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace |  datacl                
-------+-----------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------+------------+---------------+--------------
13593 | postgres  |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | f             | t            |           -1 |         13592 |          480 |          1 |          1663 |
16385 | dcdpdb    |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | f             | t            |           -1 |         13592 |          480 |          1 |          1663 |
     1 | template1 |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | t             | t            |           -1 |         13592 |          480 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres}
13592 | template0 |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | t             | f            |           -1 |         13592 |          480 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres}
24583 | sarah     |     10 |        6 | en_US.UTF-8 | en_US.UTF-8 | f             | t            |           -1 |         13592 |          480 |          1 |          1663 |
(5 rows)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2781171/,如需轉載,請註明出處,否則將追究法律責任。

相關文章