3.2. 建立資料庫集群

在你做任何事情之前,你必須初始化硬碟上的資料庫的儲存區間. 我們管它叫資料庫集群. (SQL 使用術語目錄集群.) 一個資料庫集群是一系列資料庫的集合,這些資料庫可以通過 單個資料庫伺服器的案例存取.在初始化後,一個資料庫集群 將包含一個叫template1的資料庫. 正如其名一樣,這個資料庫將作為隨後建立的資料庫的 模版﹔在實際工作中不應該使用這個庫. (參閱 Chapter 7 獲取有關建立資料庫的資訊。)

用文件系統的術語來說,一個資料庫集群將是一個目錄,所有資料都 將存放在這個目錄中.我們把它稱做 資料目錄資料區 .在哪裡存放資料完全是你的選擇,我們沒有預設值,盡管 /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 給 超級使用者賦予一個密碼.在 initdb 之後, 在你第一次啟動伺服器之前 修改 pg_hba.conf,讓它使用 md5 或者 password,而不是 trust 認証方式. (另外一些方法包括 ident 認証或者 用文件系統權限限止連結.參閱 Chapter 4 獲取更多細節.)

initdb 同時也為資料庫集群初始化區域. 通常,它將只是使用環境中的區域設定並且把它們應用與初始化的資料庫. 我們可以為資料庫宣告不同的區域﹔有關這些的更多資訊可以在 Section 5.1 中找到. 運行 initdb 的時候你可能碰到的一件奇怪的事情是 看到下面這樣的注意資訊:

WARNING:  Initializing database with en_US collation order.
        This locale setting will prevent use of index optimization for
        LIKE and regexp searches.  If you are concerned about speed of
        such queries, you may wish to set LC_COLLATE to "C" and
        re-initdb.  For more information see the Administrator's Guide.

這條注意資訊主要是警告你目前所用的區域設定將把索引按照 一種無法用於LIKE和正則表達式搜尋的方式儲存. 如果你執行這樣的搜尋時需要高性能的話,你應該把目前區域設定設 為 "C" 然後重新運行 initdb. 也就是說,運行 initdb --lc-collate=C. 在特定資料庫集群裡的排序順序是由 initdb 設定的, 而且以後就不能變更了,除非轉儲所有資料,重新運行initdb, 並重新裝載資料.因此在這個階段做決定很有必要.