PostgreSQL 創(chuàng)建一個(gè)數(shù)據(jù)庫集簇

2021-08-31 10:29 更新
18.2.1. 二級文件系統(tǒng)的使用
18.2.2. 文件系統(tǒng)

在你能做任何事情之前,你必須在磁盤上初始化一個(gè)數(shù)據(jù)庫存儲區(qū)域。我們稱之為一個(gè)數(shù)據(jù)庫集簇SQL標(biāo)準(zhǔn)使用的術(shù)語是目錄集簇)。一個(gè)數(shù)據(jù)庫集簇是被一個(gè)運(yùn)行數(shù)據(jù)庫服務(wù)器的單一實(shí)例所管理的多個(gè)數(shù)據(jù)庫的集合。在初始化之后,一個(gè)數(shù)據(jù)庫集簇將包含一個(gè)名為postgres的數(shù)據(jù)庫,它表示被功能、用戶和第三方應(yīng)用所使用的默認(rèn)數(shù)據(jù)庫。數(shù)據(jù)庫服務(wù)器本身并不要求 postgres數(shù)據(jù)庫存在。另一個(gè)在初始化過程中為每一個(gè)集簇創(chuàng)建的數(shù)據(jù)庫被稱為template1。顧名思義,它將被用于創(chuàng)建后續(xù)數(shù)據(jù)庫的模板;它不應(yīng)該被用于實(shí)際工作(在集簇內(nèi)創(chuàng)建新數(shù)據(jù)庫的更多信息請見第 22 章)。

在文件系統(tǒng)術(shù)語中,一個(gè)數(shù)據(jù)庫集簇是一個(gè)單一目錄,所有數(shù)據(jù)都將被存儲在其中。我們稱它為數(shù)據(jù)目錄數(shù)據(jù)區(qū)域。在哪里存儲你的數(shù)據(jù)完全由你選擇。沒有默認(rèn)的位置,不過/usr/local/pgsql/data/var/lib/pgsql/data位置比較流行。 數(shù)據(jù)目錄必須在使用前初始化,必須使用與 PostgreSQL一起安裝的程序initdb 。

如果您使用的是 PostgreSQL 的預(yù)打包版本,它可能有一個(gè)特定的約定來放置數(shù)據(jù)目錄的位置,并且它還可能提供用于創(chuàng)建數(shù)據(jù)目錄的腳本。 在這種情況下,您應(yīng)該優(yōu)先使用該腳本而不是直接運(yùn)行 initdb。 有關(guān)詳細(xì)信息,請參閱包級文檔。

要手動初始化數(shù)據(jù)庫集群,請運(yùn)行 initdb 并使用 -D 選項(xiàng)指定所需的數(shù)據(jù)庫集群文件系統(tǒng)位置,例如:

$ initdb -D /usr/local/pgsql/data

請注意,您必須在登錄 PostgreSQL 用戶帳戶時(shí)執(zhí)行此命令,這在上一節(jié)中進(jìn)行了描述。

提示

作為-D選項(xiàng)的一種替換方案,你可以設(shè)置環(huán)境變量PGDATA

另一種替代方案是,你可以通過pg_ctl 程序來運(yùn)行initdb

$ pg_ctl -D /usr/local/pgsql/data initdb

如果你使用pg_ctl來啟停服務(wù)器(見第 18.3 節(jié)),這種方法可能更直觀,以為這樣pg_ctl將是你用來管理數(shù)據(jù)庫服務(wù)器實(shí)例的唯一命令。

如果你指定的目錄還不存在,initdb將嘗試創(chuàng)建它。當(dāng)然,如果initdb沒有在父目錄中的寫權(quán)限,這將會失敗。通常推薦讓PostgreSQL用戶擁有數(shù)據(jù)目錄及其父目錄,這樣就不存在上面的問題了。如果想要的父目錄也不存在,你將需要先創(chuàng)建它,如果父父目錄不可寫則使用 root 特權(quán)。因此,該過程可能像這樣:

root# mkdir /usr/local/pgsqlroot# chown postgres /usr/local/pgsqlroot# su postgrespostgres$ initdb -D /usr/local/pgsql/data      

如果數(shù)據(jù)目錄存在并且已經(jīng)包含文件,initdb將拒絕運(yùn)行。這可以避免無意中覆蓋一個(gè)已有的安裝。

因?yàn)閿?shù)據(jù)目錄包含所有存儲在數(shù)據(jù)庫里的數(shù)據(jù),所以最重要的是保護(hù)這個(gè)目錄不受未授權(quán)的訪問。因此,initdb會回收禁止除PostgreSQL用戶,也可以選擇組,之外所有用戶的訪問權(quán)限。當(dāng)組訪問啟用時(shí),是只讀的。它允許相同組中未被授權(quán)的用戶作為集簇屬主,備份集簇?cái)?shù)據(jù)或者執(zhí)行其他只需要讀訪問權(quán)限的操作。

注意在現(xiàn)有集群啟用或禁用組訪問時(shí),需要關(guān)閉集群,且重新啟動PostgreSQL之前設(shè)置所有的目錄和文件到恰當(dāng)?shù)哪J?。否則,數(shù)據(jù)目錄中會存在多種模式。集群僅可以被其屬主訪問,恰當(dāng)?shù)哪J綉?yīng)該是,其目錄設(shè)置為0700,普通文件設(shè)置為0600。允許集群被組可讀,恰當(dāng)?shù)哪J綉?yīng)該是,其目錄設(shè)置為0750,普通文件設(shè)置為 0640。

不過,雖然目錄的內(nèi)容是安全的,但默認(rèn)的客戶端認(rèn)證設(shè)置允許任意本地用戶連接到數(shù)據(jù)庫甚至成為數(shù)據(jù)庫超級用戶。如果你不信任其他本地用戶, 我們建議你使用initdb-W、--pwprompt--pwfile選項(xiàng)之一給數(shù)據(jù)庫超級用戶賦予一個(gè)口令。 還可以指定-A md5-A password,這樣就不會使用默認(rèn)的trust 身份認(rèn)證?;蛘咴趫?zhí)行initdb之后、第一次啟動服務(wù)器之前修改生成的pg_hba.conf文件(另外一些可行的方法包括 peer認(rèn)證或者用文件系統(tǒng)權(quán)限限制連接。更多信息見第 20 章)。

initdb同時(shí)也為數(shù)據(jù)庫集簇初始化默認(rèn)區(qū)域 。 通常,它將只是使用環(huán)境中的區(qū)域設(shè)置并且把它們應(yīng)用于被初始化的數(shù)據(jù)庫。 可以為數(shù)據(jù)庫指定一個(gè)不同的區(qū)域;有關(guān)于此的更多信息可以在第 23.1 節(jié)中找到。 特定數(shù)據(jù)庫集簇中使用的默認(rèn)排序順序是通過initdb設(shè)置的, 雖然你可以創(chuàng)建使用不同排序順序的新數(shù)據(jù)庫,但在 initdb 創(chuàng)建的模板數(shù)據(jù)庫中使用的順序不能更改(除非刪除并重建它們)。使用非 CPOSIX的區(qū)域還會對性能造成影響。因此,第一次就正確地選擇很重要。

initdb還為數(shù)據(jù)庫集簇設(shè)置默認(rèn)的字符集編碼。通常字符集編碼應(yīng)該選擇與區(qū)域設(shè)置匹配。詳見第 23.3 節(jié)。

C以及非POSIX區(qū)域?qū)τ谧址判蛞蕾囉诓僮飨到y(tǒng)的排序規(guī)則庫。這控制著索引中存儲的鍵的排序。為此,通過快照恢復(fù)、二進(jìn)制流復(fù)制、更換不同的操作系統(tǒng)或者升級操作系統(tǒng)都不能把一個(gè)集簇切換到一種不兼容的排序規(guī)則庫版本。

18.2.1. 二級文件系統(tǒng)的使用

很多安裝會在文件系統(tǒng)(卷)而不是機(jī)器的卷上創(chuàng)建它們的數(shù)據(jù)庫集簇。如果你選擇這樣做,我們不建議嘗試使用二級卷的頂層目錄(掛載點(diǎn))作為數(shù)據(jù)目錄。最好的做法是在PostgreSQL用戶擁有的掛載點(diǎn)目錄中創(chuàng)建一個(gè)目錄,然后在其中創(chuàng)建數(shù)據(jù)目錄。這可以避免權(quán)限問題,特別是對于pg_upgrade這類操作,并且它也能在二級卷被斷線后確保干凈的失敗。

18.2.2. 文件系統(tǒng)

通常來說,任何具有 POSIX 語義的文件系統(tǒng)都可用于 PostgreSQL。用戶出于各種原因會喜歡不同的文件系統(tǒng),包括供應(yīng)商支持、性能和熟悉程度等。 經(jīng)驗(yàn)表明,在其他方面相同的情況下,人們不應(yīng)期望僅僅通過切換文件系統(tǒng)或進(jìn)行較小的文件系統(tǒng)配置調(diào)整以造成明顯的性能或行為更改。

18.2.2.1. NFS

可以用 NFS文件系統(tǒng)來存儲 PostgreSQL數(shù)據(jù)目錄。 PostgreSQL沒有特殊對待NFS文件系統(tǒng),這意味著它假定NFS的行為與本地連接的驅(qū)動器完全一樣。 PostgreSQL不使用任何已知在NFS上非標(biāo)準(zhǔn)的功能,例如文件鎖定。

PostgreSQL使用NFS 的唯一硬性要求是,文件系統(tǒng)需要使用 hard 選項(xiàng)掛載。 使用hard選項(xiàng),如果存在網(wǎng)絡(luò)問題,進(jìn)程可以無限期地hang,因此這個(gè)配置需要仔細(xì)的監(jiān)視設(shè)置。 soft選項(xiàng)將在出現(xiàn)網(wǎng)絡(luò)問題時(shí)中斷系統(tǒng)調(diào)用,但 PostgreSQL 不會重復(fù)系統(tǒng)呼叫以這種方式中斷,因此任何此類中斷都將導(dǎo)致報(bào)告 I/O 錯(cuò)誤。

sync掛載選項(xiàng)不是必須的。 async選項(xiàng)的特性是足夠的,因?yàn)?PostgreSQL 發(fā)出 fsync調(diào)用,會在適當(dāng)?shù)臅r(shí)候刷新寫緩存。(這與它在本地文件系統(tǒng)上的工作方式相類似。) 但是,強(qiáng)烈建議在部署NFS server 的系統(tǒng)上使用 sync導(dǎo)出選項(xiàng)(主要是Linux)。 否則,NFS 客戶端上的 fsync 或等效項(xiàng)實(shí)際上不能保證實(shí)現(xiàn)服務(wù)器上的永久存儲,這可能會導(dǎo)致?lián)p壞,類似于使用參數(shù) fsync關(guān)閉。 這些掛載和導(dǎo)出選項(xiàng)的默認(rèn)值在供應(yīng)商和版本之間有所不同,因此建議在任何情況下檢查并明確指定它們,以避免任何歧義。

在某些情況下,可以通過 NFS 或較低級別的協(xié)議,例如 iSCSI,訪問外部存儲產(chǎn)品。 在后一種情況下,存儲顯示為塊設(shè)備,可以在其上創(chuàng)建任何可用的文件系統(tǒng)。 這種方法可能會使 DBA 不必處理 NFS 的一些特性,但是在其他級別當(dāng)然會出現(xiàn)管理遠(yuǎn)程存儲的復(fù)雜性。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號