3.2. データベースクラスタ作成

まず何もする前に、ディスクのデータベース格納領域を初期化する必要があります。 これがデータベースクラスタと呼ばれるものです。 (SQLでは代わりにカタログクラスタがあります。) データベースクラスタとは、データベースの集合で、稼働しているデータベースサーバの 1つのインスタンスを通してアクセスすることができます。初期化が終ると、 データベースクラスタにはtemplate1 と呼ばれるデータベースが1つ作成されています。その名前から推測できるように、 これはその後に作成されるデータベースのテンプレートとして使われます。 したがって、実際の作業に使用すべきではありません。

ファイルシステムの観点から見ると、データベースクラスタというのは、 全てのデータが格納される1つのディレクトリということになります。これは データディレクトリもしくは データ領域と呼ばれます。どこにデータを格納 するかは完全にユーザの自由で、特にデフォルトの領域はありません。一般的に よく使われるのは/usr/local/pgsql/data/var/lib/pgsql/dataです。データベースクラスタ を初期化するためには、PostgreSQLと一緒に インストールされるコマンドinitdbを使います。 データベースシステムの中で必要なファイルシステムの場所は オプション-Dで示します。例えばこのようにします。

> initdb -D /usr/local/pgsql/data
前節で説明があったように、このコマンドは Postgres ユーザアカウントで ログインしている間に実行する必要があります。

Tip: オプション-Dの代わりに環境変数PGDATA を設定することもできます。

もし指定したディレクトリが存在しない場合は、initdb がその新しいディレクトリを作成しようとします。しかし(本稿のアドバイスに したがって権限を持たないアカウントで作成した場合は)作成権限がない場合があります。 その場合は(rootとして)手動でディレクトリを作成し、その所有権をPostgres ユーザアカウントに変更します。下記がその例となります。

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は Postgres ユーザアカウント以外 にはアクセス権を与えません。

initdbを実行し、下記のような注意メッセージに 驚かれる場合があるかもしれません。

NOTICE:  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や正規表現検索でそれらを使用しないということを警告しています。 LIKEや正規表現のような検索で高い性能を望む場合は、現在ロケールを"C" にして initdbを再実行してください。ほとんどのシステムにおいて、 現在ロケールの設定は環境変数LC_ALL、もしくは LANGの値を変えることで行えます。特定のデータベースクラスタで 使われるソートの順番はinitdbで設定されます。後に設定を変更したい 場合は、全てのデータをダンプし、再びinitdbを行ってデータを再読み込みする必要が ありますので、ここで正しい選択をしておくことが大切です。