無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

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

まず第一に、ディスク上にデータベース格納領域を初期化する必要があります。 この格納領域を データベースクラスタ と呼びます( SQL ではカタログクラスタという用語が使用されます)。 データベースクラスタはデータベースの集合で、稼働しているデータベースサーバのただ1つのインスタンスを通して管理されます。 初期化が終わると、データベースクラスタには postgres という名前のデータベースが含まれています。 このデータベースは、ユーティリティやユーザ、サードパーティ製アプリケーションのデフォルトデータベースとして用意されています。 データベースサーバ自身はこの postgres データベースの存在を必要としていません。 初期化中に他にも template1 というデータベースが各クラスタ内に作成されます。 その名前から推測できるように、これはその後に作成されるデータベースのテンプレートとして使われます。 したがって、実際の作業に使用すべきではありません。 (クラスタ内における新しいデータベースの作成については 第21章 を参照してください。)

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


$
 
initdb -D /usr/local/pgsql/data

このコマンドは、前節で説明した PostgreSQL ユーザアカウントでログインして実行する必要があります。

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

他にも以下のように pg_ctl プログラム経由で initdb を実行することができます。


$
 
pg_ctl -D /usr/local/pgsql/data initdb

pg_ctl がデータベースサーバインスタンスの管理に使用する単一のコマンドになりますので、サーバの起動や停止に pg_ctl を使用している場合( 項17.3 参照)はこちらの方がより直感的かもしれません。

もし指定したディレクトリが存在しない場合は、 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 オプションのいずれか1つを使用して、データベーススーパーユーザにパスワードを付与することを推奨します。 また、デフォルトの trust 認証モードを使用しないように、 -A md5 もしくは -A password を指定してください。 もしくは、 initdb の後、初回のサーバの起動の に、生成済みの pg_hba.conf ファイルを変更してください。 (他の穏当な方法として、 peer 認証やファイルシステムの権限を使用して、接続を制限することもできます。 詳細については 第19章 を参照してください。)

initdb はまた、データベースクラスタのデフォルトのロケールを初期化します。 通常は、環境のロケール設定を初期化されたデータベースにそのまま適用します。 データベースに異なるロケールを指定することも可能です。 詳細については 項22.1 を参照してください。 特定のデータベースクラスタ内で使用されるデフォルトのソート順は initdb で設定されます。 異なるソート順を使用する新しいデータベースを作成することもできますが、initdbが作成するテンプレートデータベースで使用される順は削除して再作成しない限り変更することができません。 また、 C POSIX 以外のロケールを使用する場合には性能上の影響もあります。 ですので初回にこれを正しく選択することが重要です。

また initdb は、データベースクラスタのデフォルトの文字セット符号化方式も設定します。 通常これは、ロケールの設定と合うものが選ばれなければなりません。 詳細は 項22.3 を参照してください。

17.2.1. ネットワークファイルシステム

多くのインストレーションはネットワークファイルシステム上にデータベースクラスタを作成します。 直接 NFS を介して行うこともありますし、 NFS を内部的に使うネットワークアタッチトストレージ( NAS )デバイスを使用することもあります。 PostgreSQL NFS ファイルシステムに特別なことを何も行いません。 つまり NFS はローカル接続のドライブ( DAS 、ダイレクトアタッチトストレージ)とまったく同様に振る舞うという前提です。 クライアントとサーバの NFS 実装が標準セマンティックスを持たないならば、信頼性に関する問題が発生します ( http://www.time-travellers.org/shane/papers/NFS_considered_harmful.html 参照)。 特に NFS サーバへの遅延(非同期)書きこみが信頼性に関する問題を引き起こします。 可能ならば NFS ファイルシステムを(キャッシュ無しで)同期マウントし、これを防止してください。更に、 NFS をソフトマウントすることは薦められません。 (ストレージエリアネットワーク( SAN )は NFS よりも低レベルな通信プロトコルを使用します。)


powered by SEO.CUG.NET