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

まず何もする前に、ディスクのデータベース格納領域を初期化しなくては いけません。これがデータベースクラスタと呼ばれる ものです。(SQLではかわりにカタログクラスタが あります。) データベースクラスタは動いているデータベースサーバ の一つのインスタンスを通してアクセスできるデータベースの集合です。 初期化が終ると、データベースクラスタにtemplate1 と呼ばれるデータベースができます。名前から分かるように、これは あとから作られるデータベースのテンプレートとして使われ、実際の 業務に使用すべきではありません。

ファイルシステム用語で言えば、データベースクラスタは全てのデータが 格納される一つのディレクトリということになります。これは データディレクトリもしくは データ領域と呼ばれます。どこにデータを格納 するかは完全にユーザの自由で、特にデフォルトはありません。一般的に よく使われるのは/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_ALLLANGの値を変えることで 行えます。特定のデータベースクラスタで使われるソートの順番は initdbで設定され、全てのデータをダンプし、再 initdb し、データを再リードしない限り後で変更することはできません。 ここで正しい選択をしておくことが大切です。