Deepgreen(Greenplum) 模板數據庫template0和template1 探討
平時工作中,我們在進行數據庫創建時(CREATE DATABASE),實際上通過拷貝一個已有數據庫的方式完成的。語法如下:
CREATE DATABASE name [ [WITH] [OWNER [=] dbowner]
[TEMPLATE [=] template]
[ENCODING [=] encoding]
[TABLESPACE [=] tablespace]
[CONNECTION LIMIT [=] connlimit ] ]
默認情況下,它拷貝名為template1的標準係統數據庫。所以該數據庫是創建新數據庫的"模板"。 如果我們為template1數據庫增加對象,這些對象將被拷貝到後續創建的用戶數據庫中。 這種行為允許對數據庫中標準對象集合的站點本地修改。例如,如果你把過程語言PL/Perl安裝到 template1中,那麼你在創建用戶數據庫後不需要額外的操作就可以使用該語言。
係統裏還有名為template0的第二個標準係統數據庫。這個數據庫包含和template1初始內容一樣的數據,也就是說,隻包含你的Greenplum版本預定義的標準對象。在數據庫集簇被初始化之後,不應該對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開始時存在任何其它連接,那麼該命令將會失敗。在拷貝操作期間,到源數據庫的新連接將被阻止。
創建數據庫示例:
創建一個新數據庫gpdb:
CREATE DATABASE gpdb;
創建一個新數據庫sales,所有者salesapp,默認表空間salesspace:
CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;
創建一個新數據庫music,支持字符集ISO-8859-1:
CREATE DATABASE music ENCODING 'LATIN1';
對於每一個數據庫在pg_database中存在兩個有用的標誌: datistemplate和datallowconn列。datistemplate可以被設置來指示該數據庫是不是要作為CREATE DATABASE的模板。如果設置了這個標誌,那麼該數據庫可以被任何有 CREATEDB權限的用戶克隆;如果沒有被設置,那麼隻有超級用戶和該數據庫的擁有者可以克隆它。如果datallowconn為假,那麼將不允許與該數據庫建立任何新的連接(但已有的會話不會因為把該標誌設置為假而被中止)。template0通常被標記為datallowconn = false來阻止對它的修改。template0和template1通常總是被標記為datistemplate = true。
template1=# select * from pg_database where datname like 'template%';
datname | datdba | encoding | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datconfig | datacl
-----------+--------+----------+---------------+--------------+--------------+---------------+--------------+---------------+-----------+----------------------------------
template1 | 10 | 6 | t | t | -1 | 10898 | 888 | 1663 | | {=c/dgadmin,dgadmin=CTc/dgadmin}
template0 | 10 | 6 | t | f | -1 | 10898 | 888 | 1663 | | {=c/dgadmin,dgadmin=CTc/dgadmin}
(2 rows)
注意: 除了template1是CREATE DATABASE的默認源數據庫名之外, template1和template0沒有任何特殊的狀態。例如,我們可以刪除template1然後從template0重新創建它而不會有任何不良效果。如果我們不小心在template1中增加了一堆垃圾,那麼我們就會建議做這樣的操作(要刪除template1,它必須有pg_database.datistemplate = false)。
當數據庫集簇被初始化時,也會創建postgres數據庫。這個數據庫用於做為用戶和應用連接的默認數據庫。它隻是 template1的一個拷貝,需要時可以刪除並重建。
最後更新:2017-06-11 14:33:04
上一篇:
Greenplum/Deepgreen ERROR: insufficient memory reserved for statement (memquota.c:228)
下一篇:
Deepgreen的TPC-H測試步驟(簡略版)
HTML元素定位
深入淺出看懂AlphaGo Zero - PaperWeekly 第51期
他用手指玩滑板,居然玩成了國內第一人?
PostgreSQL服務器管理:備份和恢複
pushbackDemo(Modalview present)
自定義TabHost實現背景圖片隨選項卡切換滑動效果
magento -- 修正又一個翻譯上的bug,同時了解了下Magento解析xml的方式
CoreFreq:一款強大的監控 CPU 的專業工具
Oracle 12.2新特性掌上手冊 - 第三卷 Sharding 的增強
Hibernate下搭建JUNIT的測試環境,使用beforeclass和afterclass實現sessionFactory建立一次