16.2. データベースクラスタの作成

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

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

データディレクトリにはデータベースの中のすべてのデータが保持されるため、権限を持たない人のアクセスを確実に制限することが不可欠です。 ですから、initdbPostgreSQL ユーザ以外にはアクセス権を与えません。

しかし、ディレクトリの内容は安全ですが、デフォルトのクライアント認証の設定では、全てのローカルユーザはデータベースに接続でき、データベーススーパユーザになることさえ可能です。 他のローカルユーザを信用しない場合、initdb-W または --pwprompt オプションを使用して、データベーススーパユーザにパスワードを付与することを推奨します。 initdb の後、初回のサーバの起動の に、trust 認証ではなく、md5 または password 認証を使用するように pg_hba.conf ファイルを変更して下さい。 (他の方法として、ident 認証やファイルシステムの権限を使用して、接続を制限することもできます。 詳細については 第19章 を参照して下さい。

initdb はまた、データベースクラスタのデフォルトのロケールを初期化します。 通常は、環境のロケール設定を初期化されたデータベースにそのまま適用します。 データベースに異なるロケールを指定することも可能です。 詳細については 項20.1 を参照して下さい。 データベースクラスタ内の特定のデータベースで使用されるソート順はinitdb で設定され、後で変更することができません。その場合は、全データをダンプし、initdbを再実行し、データを再読み込みさせます。 従い、最初の時点で正しい選択を行なうことが重要です。