在做任何事情之前,必須先初始化磁盤上的數據存儲區,叫作數據庫集群(標準 SQL 術語稱為"目錄集群")。一個數據庫集群是一係列數據庫的集合,這些數據庫可以通過單個數據庫服務器的實例管理。在初始化後,一個數據庫集群將包含一個叫 postgres 的數據庫,這個庫是給工具、用戶和第三方程序使用的缺省數據庫。數據庫服務器本身並不要求 postgres 數據庫的存在,但是很多外部工具假設它存在。另外一個在每個集群初始化過程中創建的數據庫叫 template1 。正如其名一樣,這個數據庫將作為隨後創建的數據庫的模版;在實際工作中不應該使用這個庫(參閱章19獲取有關創建數據庫的信息)。
用文件係統的術語來說,一個數據庫集群是一個目錄,所有數據都將存放在這個目錄中。我們把它稱做數據目錄或數據區。在哪裡存放數據完全取決於你的選擇,我們冇有缺省值,儘管 /usr/local/pgsql/data 或 /var/lib/pgsql/data 這樣的目錄很常用。要初始化一個數據庫集群,可以使用 initdb 命令,這個命令與 PostgreSQL 一起安裝。你可以用 -D 選項指定數據目錄的位置,例如:
$ initdb -D /usr/local/pgsql/data
你必須以 PostgreSQL 用戶的身份來執行這條命令,這一點我們在前麵一節描述過。
【提示】作為 -D 選項的替代品,你還可以使用 PGDATA 環境變量。
如果你聲明的路徑還不存在,initdb 將試圖創建它。如果你按照我們的建議創建了一個非特權帳戶的話,你很有可能缺少做這些事情的權限。這時,你可以自己創建該目錄(以 root 身份)然後把該目錄的所有權交給 PostgreSQL 用戶或者賦與它寫權限。下麵是可能有效的方法:
root# mkdir /usr/local/pgsql/data root# chown postgres /usr/local/pgsql/data root# su postgres postgres$ initdb -D /usr/local/pgsql/data
如果數據目錄看起來像已經初始化過了,那麼 initdb 會拒絕運行。
因為數據目錄包含所有存儲在數據庫裡的數據,所以出於安全考慮,這個目錄不能給任何非授權用戶訪問。因此,initdb 禁止除 PostgreSQL 用戶帳戶以外的任何用戶訪問這個目錄。
不過,因為目錄的內容是安全的,所以缺省的客戶端認證設置允許任意本地用戶連接到數據庫甚至成為超級用戶。如果你不信任本地用戶,我們建議你使用 initdb 的 -W, --pwprompt 或 --pwfile 選項給超級用戶賦予一個口令。還有,聲明 -A md5 或 -A password ,這樣就不會使用缺省的 trust 身份認證。或者在執行 initdb 之後,第一次啟動服務器之前修改 pg_hba.conf 文件。另外一些合理的方法包括 ident 認證或者用文件係統權限禁止連接。參閱章20獲取更多細節。
initdb 同時也為數據庫集群初始化缺省區域。通常,它將隻是使用環境中的區域設置並且把它們應用於初始化的數據庫。我們可以為數據庫聲明不同的區域;有關這些的更多信息可以在節21.1中找到。在特定數據庫集群裡的排序順序是由 initdb 設置的,而且以後就不能更改了(除非轉儲所有數據,重新運行 initdb 並重新裝載數據)。使用非 C 或 POSIX 的區域還會有性能影響。因此,第一次就選擇正確很重要。
initdb 還為數據庫集群設置缺省的字符集編碼。通常這個應該選擇與區域匹配。詳見節21.2。