2025年9月25日: PostgreSQL 18 釋出!
支援的版本:當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

18.2. 建立資料庫叢集 #

在可以進行任何操作之前,必須在磁碟上初始化一個數據庫儲存區域。我們稱之為資料庫叢集。(SQL標準術語是目錄叢集。)資料庫叢集是由單個正在執行的資料庫伺服器例項管理的資料庫集合。初始化後,資料庫叢集將包含一個名為postgres的資料庫,該資料庫用於實用程式、使用者和第三方應用程式的預設資料庫。資料庫伺服器本身不需要postgres資料庫存在,但許多外部實用程式都假定它存在。初始化期間,每個叢集中還會建立另外兩個資料庫,分別命名為template1template0。顧名思義,它們將用作後續建立的資料庫的模板;不應將其用於實際工作。(有關叢集內建立新資料庫的資訊,請參閱第 22 章。)

從檔案系統角度來看,資料庫叢集是所有資料將儲存在其下的一個目錄。我們稱之為資料目錄資料區域。資料的儲存位置完全由您決定。沒有預設位置,儘管/usr/local/pgsql/data/var/lib/pgsql/data等位置很受歡迎。資料目錄在使用前必須使用initdb程式進行初始化,該程式隨PostgreSQL一起安裝。

如果您使用的是預打包版本的PostgreSQL,它可能有關於放置資料目錄位置的特定約定,並且可能還提供用於建立資料目錄的指令碼。在這種情況下,您應該優先使用該指令碼,而不是直接執行initdb。有關詳細資訊,請參閱打包文件。

要手動初始化資料庫叢集,請執行initdb,並使用-D選項指定資料庫叢集所需的檔案系統位置,例如

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

請注意,您必須在登入到PostgreSQL使用者帳戶時執行此命令,該帳戶在上一節中已介紹。

提示

除了-D選項外,還可以設定環境變數PGDATA

或者,可以透過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建立的模板資料庫之前,其排序順序無法更改。使用非CPOSIX區域設定也會影響效能。因此,首次正確做出此選擇非常重要。

initdb還設定了資料庫叢集的預設字元集編碼。通常應選擇與區域設定匹配的編碼。有關詳細資訊,請參閱第 23.3 節

C和非POSIX區域設定依賴於作業系統在字元集排序方面的整理庫。這控制著索引中儲存的鍵的排序。因此,叢集無法透過快照恢復、二進位制流複製、不同的作業系統或作業系統升級切換到不相容的整理庫版本。

18.2.1. 使用輔助檔案系統 #

許多安裝在機器的卷以外的檔案系統(卷)上建立資料庫叢集。如果您選擇這樣做,不建議嘗試使用輔助卷的最頂層目錄(掛載點)作為資料目錄。最佳做法是在由PostgreSQL使用者擁有的掛載點目錄內建立一個目錄,然後在此目錄內建立資料目錄。這可以避免許可權問題,特別是對於pg_upgrade等操作,並且在輔助卷離線時也能確保乾淨地失敗。

18.2.2. 檔案系統 #

通常,任何具有POSIX語義的檔案系統都可以用於PostgreSQL。使用者出於各種原因偏好不同的檔案系統,包括供應商支援、效能和熟悉度。經驗表明,在其他條件相同的情況下,僅僅切換檔案系統或進行小的檔案系統配置更改不應該期望有重大的效能或行為變化。

18.2.2.1. NFS #

可以為儲存PostgreSQL資料目錄使用NFS檔案系統。PostgreSQL不對NFS檔案系統做任何特殊處理,這意味著它假設NFS行為與本地連線的驅動器完全相同。PostgreSQL不使用任何已知在NFS上行為不標準的函式,例如檔案鎖定。

使用NFSPostgreSQL的唯一硬性要求是使用hard選項掛載檔案系統。使用hard選項,如果存在網路問題,程序可能會無限期地掛起,因此此配置需要仔細的監控設定。soft選項會在網路問題時中斷系統呼叫,但PostgreSQL不會重複中斷的系統呼叫,因此任何此類中斷都會導致報告I/O錯誤。

不一定需要使用sync掛載選項。async選項的行為就足夠了,因為PostgreSQL會適時發出fsync呼叫以重新整理寫快取。(這類似於它在本地檔案系統上的工作方式。)但是,強烈建議在存在sync匯出選項的系統(主要是Linux)的NFS伺服器上使用該選項。否則,NFS客戶端上的fsync或等效操作實際上不能保證到達伺服器上的永久儲存,這可能會導致類似於在引數fsync關閉的情況下執行的損壞。這些掛載和匯出選項的預設值在供應商和版本之間有所不同,因此建議在任何情況下都要檢查並可能顯式指定它們,以避免任何歧義。

在某些情況下,可以透過NFS或更低級別的協議(如iSCSI)訪問外部儲存產品。在後一種情況下,儲存顯示為塊裝置,並且可以在其上建立任何可用的檔案系統。這種方法可以使DBA不必處理NFS的一些特性,但當然,管理遠端儲存的複雜性會在其他級別上發生。

提交更正

如果您在文件中看到任何不正確、與您的實際體驗不符或需要進一步澄清的內容,請使用此表單報告文件問題。