在您可以執行任何操作之前,您必須在磁碟上初始化一個資料庫儲存區域。 我們稱之為資料庫叢集。(SQL標準使用術語 catalog cluster。)資料庫叢集是由執行中的資料庫伺服器的單一實例所管理的資料庫集合。 初始化後,資料庫叢集將包含一個名為 postgres
的資料庫,它旨在作為公用程式、使用者和第三方應用程式使用的預設資料庫。 資料庫伺服器本身不要求 postgres
資料庫存在,但許多外部公用程式假設它存在。 在初始化期間,每個叢集內會建立另外兩個資料庫,分別命名為 template1
和 template0
。 顧名思義,這些將用作後續建立的資料庫的範本; 它們不應用於實際工作。(有關在叢集中建立新資料庫的資訊,請參閱第 22 章。)
在檔案系統術語中,資料庫叢集是一個單一目錄,所有資料都將儲存在該目錄下。 我們稱之為資料目錄或資料區域。 您完全可以自行選擇儲存資料的位置。 沒有預設值,儘管像 /usr/local/pgsql/data
或 /var/lib/pgsql/data
這樣的位址很受歡迎。 資料目錄必須在使用前初始化,使用程式 initdb,該程式是隨著 PostgreSQL 一起安裝的。
如果您使用的是預先封裝的 PostgreSQL 版本,它很可能對資料目錄的放置位置有特定的慣例,並且它也可能提供用於建立資料目錄的指令碼。 在這種情況下,您應該使用該指令碼,而不是直接執行 initdb
。 請參閱套件層級文件以瞭解詳細資訊。
若要手動初始化資料庫叢集,請執行 initdb
並使用 -D
選項指定所需資料庫叢集的檔案系統位置,例如
$
initdb -D /usr/local/pgsql/data
請注意,您必須在登入 PostgreSQL 使用者帳戶時執行此命令,該帳戶在前一節中已說明。
或者,您可以透過 pg_ctl 程式 執行 initdb
,如下所示
$
pg_ctl -D /usr/local/pgsql/data initdb
如果您使用 pg_ctl
來啟動和停止伺服器(請參閱第 18.3 節),這可能會更直觀,因此 pg_ctl
將是您用於管理資料庫伺服器實例的唯一命令。
如果 initdb
指定的目錄尚不存在,它將嘗試建立該目錄。 當然,如果 initdb
沒有在父目錄中寫入的權限,這將會失敗。 通常建議 PostgreSQL 使用者不僅擁有資料目錄,還擁有它的父目錄,這樣就不會有問題。 如果所需的父目錄也不存在,則您需要先建立它,如果祖父目錄不可寫入,則需要使用 root 權限。 因此,該過程可能如下所示
root#mkdir /usr/local/pgsql
root#chown postgres /usr/local/pgsql
root#su postgres
postgres$initdb -D /usr/local/pgsql/data
如果資料目錄存在且已包含檔案,則 initdb
將拒絕執行; 這是為了防止意外覆寫現有的安裝。
因為資料目錄包含儲存在資料庫中的所有資料,因此必須保護它免受未授權的存取。 因此,initdb
撤銷了除 PostgreSQL 使用者和可選群組之外的所有人的存取權限。 啟用群組存取權限時,它是唯讀的。 這允許與叢集擁有者位於同一群組中的非特權使用者備份叢集資料或執行其他僅需要讀取存取權限的操作。
請注意,啟用或停用現有叢集上的群組存取權,需要先關閉叢集,並在重新啟動 PostgreSQL 之前,在所有目錄和檔案上設定適當的模式。否則,資料目錄中可能存在混合模式。對於僅允許擁有者存取的叢集,目錄的適當模式為 0700
,檔案的適當模式為 0600
。對於也允許群組讀取的叢集,目錄的適當模式為 0750
,檔案的適當模式為 0640
。
然而,雖然目錄內容是安全的,但預設的用戶端認證設定允許任何本地使用者連線到資料庫,甚至成為資料庫超級使用者。如果您不信任其他本地使用者,我們建議您使用 initdb
的 -W
、--pwprompt
或 --pwfile
選項,為資料庫超級使用者指定密碼。 此外,請指定 -A scram-sha-256
,這樣就不會使用預設的 trust
認證模式;或者在執行 initdb
之後,但在您第一次啟動伺服器之前,修改產生的 pg_hba.conf
檔案。(其他合理的方法包括使用 peer
認證或檔案系統權限來限制連線。請參閱 第 20 章 以取得更多資訊。)
initdb
還會初始化資料庫叢集的預設語系。通常,它只會採用環境中的語系設定,並將其應用於初始化的資料庫。可以為資料庫指定不同的語系;有關更多資訊,請參閱 第 23.1 節。initdb
會設定特定資料庫叢集中使用的預設排序方式,雖然您可以使用不同的排序方式建立新的資料庫,但無法更改 initdb 建立的範本資料庫中使用的排序方式,除非刪除並重新建立它們。使用 C
或 POSIX
以外的語系也會對效能產生影響。因此,第一次做出正確的選擇非常重要。
initdb
還會設定資料庫叢集的預設字元集編碼。通常,這應選擇為與語系設定匹配。有關詳細資訊,請參閱 第 23.3 節。
非 C
和非 POSIX
語系依賴作業系統的排序規則函式庫來進行字元集排序。這控制了儲存在索引中的金鑰排序。因此,無論是透過快照還原、二進制流複製、不同的作業系統還是作業系統升級,叢集都無法切換到不相容的排序規則函式庫版本。
許多安裝程式會在機器「根目錄」磁碟區以外的檔案系統(磁碟區)上建立其資料庫叢集。如果您選擇執行此操作,不建議嘗試將次要磁碟區的最頂層目錄(掛載點)用作資料目錄。最佳實務是在掛載點目錄中建立一個由 PostgreSQL 使用者擁有的目錄,然後在該目錄中建立資料目錄。這可以避免權限問題,特別是在 pg_upgrade 等操作中,並且還可以確保在次要磁碟區離線時乾淨利落地失敗。
通常,具有 POSIX 語意的任何檔案系統都可以用於 PostgreSQL。使用者出於各種原因(包括供應商支援、效能和熟悉度)而喜歡不同的檔案系統。經驗表明,在所有其他條件相同的情況下,不應僅僅因為切換檔案系統或進行微小的檔案系統組態變更而期望發生重大的效能或行為變更。
可以使用NFS檔案系統來儲存 PostgreSQL 資料目錄。PostgreSQL 對於NFS檔案系統沒有做任何特殊處理,這表示它假設NFS行為與本地連線的磁碟機完全相同。PostgreSQL 不使用任何已知在NFS上具有非標準行為的功能,例如檔案鎖定。
使用NFS與 PostgreSQL 搭配使用的唯一堅定要求是檔案系統以 hard
選項掛載。使用 hard
選項,如果出現網路問題,程序可能會無限期地「掛起」,因此此組態將需要仔細的監控設定。soft
選項會在發生網路問題時中斷系統呼叫,但 PostgreSQL 不會重複以這種方式中斷的系統呼叫,因此任何此類中斷都會導致報告 I/O 錯誤。
沒有必要使用 sync
掛載選項。async
選項的行為就足夠了,因為 PostgreSQL 會在適當的時間發出 fsync
呼叫,以刷新寫入快取。(這類似於它在本地檔案系統上的運作方式。)但是,強烈建議在使用 NFS 伺服器上的 sync
匯出選項(主要為 Linux)。否則,NFS 用戶端上的 fsync
或等效項目實際上無法保證到達伺服器上的永久儲存裝置,這可能會導致類似於關閉參數 fsync 運行的損壞。這些掛載和匯出選項的預設值因供應商和版本而異,因此建議檢查並可能在任何情況下明確指定它們,以避免任何歧義。
在某些情況下,可以透過 NFS 或諸如 iSCSI 之類的較低層級協定存取外部儲存產品。在後一種情況下,儲存裝置顯示為區塊裝置,並且可以在其上建立任何可用的檔案系統。這種方法可能會減輕 DBA 處理 NFS 某些特性的負擔,但當然管理遠端儲存裝置的複雜性會發生在其他層級。
如果您在文件中發現任何不正確、與特定功能的經驗不符或需要進一步澄清的內容,請使用此表單報告文件問題。