まず最初に、ディスク上にデータベース格納領域を初期化する必要があります。
この格納領域をデータベースクラスタと呼びます。(標準SQLではカタログクラスタという用語が使用されています)。
データベースクラスタはデータベースの集合で、稼働しているデータベースサーバのただ一つのインスタンスを通して管理されます。
初期化が終わると、データベースクラスタにはpostgres
という名前のデータベースが含まれています。
このデータベースは、ユーティリティ、ユーザ、サードパーティ製アプリケーションが使用するデフォルトデータベースになります。
データベースサーバ自身はこのpostgres
データベースの存在を必要としていませんが、多くの外部ユーティリティはその存在を想定しています。
初期化中に他にもtemplate1
というデータベースが各クラスタ内に作成されます。
その名前から推測できるように、これはその後に作成されるデータベースのテンプレートとして使われます。
したがって、実際の作業に使用しない方がよいです。
(クラスタ内における新しいデータベースの作成については第22章を参照してください。)
ファイルシステムの観点から見ると、データベースクラスタというのは、すべてのデータが格納される1つのディレクトリということになります。
これはデータディレクトリもしくはデータ領域と呼ばれます。
どこにデータを格納するかは完全にユーザの自由です。
特にデフォルトの領域はありませんが、一般的によく使われるのは/usr/local/pgsql/data
か/var/lib/pgsql/data
です。
データベースクラスタを初期化するためには、PostgreSQLと一緒にインストールされるコマンドinitdbを使用してください。
データベースクラスタのファイルシステム上の場所は-D
オプションで示します。
例えば次のようにします。
$
initdb -D /usr/local/pgsql/data
このコマンドは、前節で説明したPostgreSQLユーザアカウントでログインして実行する必要があります。
他にも以下のようにpg_ctlプログラム経由でinitdb
を実行することができます。
$
pg_ctl -D /usr/local/pgsql/data initdb
pg_ctl
がデータベースサーバインスタンスの管理に使用する単一のコマンドになりますので、サーバの起動や停止にpg_ctl
を使用している場合(18.3参照)はこちらの方がより直感的かもしれません。
もし指定したディレクトリが存在しない場合は、initdb
はその新しいディレクトリを作成しようとします。
もちろん、その親ディレクトリに書き込み権限がない場合initdb
は失敗します。
PostgreSQLユーザがデータディレクトリだけでなく、親ディレクトリも所有することを一般的に推奨します。
このようにすると問題になることはありません。
目的の親ディレクトリが存在しない場合は、まずそのディレクトリを作成する必要があります。
親の親ディレクトリが書き込み可能でない場合は、root権限を使用して作成します。
そのため、手順は下記のようになります。
root#mkdir /usr/local/pgsql
root#chown postgres /usr/local/pgsql
root#su postgres
postgres$initdb -D /usr/local/pgsql/data
データディレクトリが存在し、すでにファイルが含まれている場合は、initdb
は実行を拒否します。これは、誤って既存のインストールを上書きしないようにするためです。
データディレクトリにはデータベースの中のすべてのデータが保持されるため、権限を持たない人からのアクセスを確実に制限することが不可欠です。
ですから、initdb
はPostgreSQLユーザ、更にオプションでグループ以外からのアクセス権を剥奪します。
許可されている場合には、グループアクセスは読み出し専用になります。
これにより、クラスタの所有者と同じグループに所属する非特権ユーザが、そのクラスタのデータをバックアップすることや、読み出し権限だけが必要なその他の操作を実行することが可能になります。
既存のクラスタに対してグループアクセスを有効にする、あるいは無効にするには、PostgreSQLを再起動する前に、クラスタが停止済みの状態で、すべてのディレクトリとファイルに適切なモードが設定されている必要があることに注意してください。
そうでないと、データディレクトリ内に異なるモードが混在してしまうかもしれません。
所有者のみにアクセスを許可するクラスタでは、適切なディレクトリのモードは0700
で、ファイルモードは0600
です。
加えてグループに対して読み出しを許可するクラスタでは、適切なディレクトリのモードは0750
で、ファイルモードは0640
です。
しかし、ディレクトリの内容は安全ですが、デフォルトのクライアント認証の設定では、すべてのローカルユーザはデータベースに接続でき、データベーススーパーユーザになることさえ可能です。
他のローカルユーザを信用しない場合、initdb
の-W
、--pwprompt
、--pwfile
オプションのいずれか1つを使用して、データベーススーパーユーザにパスワードを付与することを推奨します。
また、デフォルトのtrust
認証モードを使用しないように、-A md5
もしくは-A password
を指定してください。
もしくは、initdb
の後、初回のサーバの起動の前に、生成済みのpg_hba.conf
ファイルを変更してください。
(他の穏当な方法として、peer
認証やファイルシステムの権限を使用して、接続を制限することもできます。
詳細については第20章を参照してください。)
initdb
はまた、データベースクラスタのデフォルトのロケールを初期化します。
通常は、環境のロケール設定を初期化されたデータベースにそのまま適用します。
データベースに異なるロケールを指定することも可能です。
詳細については23.1を参照してください。
特定のデータベースクラスタ内で使用されるデフォルトのソート順はinitdb
で設定されます。
異なるソート順を使用する新しいデータベースを作成することもできますが、initdbが作成するテンプレートデータベースで使用される順は削除して再作成しない限り変更することができません。
また、C
やPOSIX
以外のロケールを使用する場合には性能上の影響もあります。
ですので初回にこれを正しく選択することが重要です。
またinitdb
は、データベースクラスタのデフォルトの文字セット符号化方式も設定します。
通常これは、ロケールの設定と合うものが選ばれなければなりません。
詳細は23.3を参照してください。
非C
および非POSIX
のロケールでは、文字セットのソート順はオペレーティングシステムの照合ライブラリに依存しています。
これは、インデックスに格納されているキーの順序を制御します。
このためにクラスタは、スナップショットのリストア、バイナリストリーミングレプリケーション、異なるオペレーティングシステム、またはオペレーティングシステムのアップグレードのいずれでも互換性のない照合ライブラリバージョンに切り替えることは出来ません。
多くのインストールでは、マシンの「ルート」ボリューム以外のファイルシステム(ボリューム)上にデータベースクラスタを作成します。 この選択をした場合、セカンダリボリュームの最上位ディレクトリ(マウントポイント)をデータディレクトリとして使用することはお勧めできません。 最善の方法はマウントポイントディレクトリ内にPostgreSQLユーザが所有するディレクトリを作成し、その中にデータディレクトリを作成することです。 これにより、権限の問題、特にpg_upgradeなどの操作での問題を避けることができ、またセカンダリボリュームがオフラインになったときに、確実にきれいなエラーを起こすようになります。
多くのインストレーションはネットワークファイルシステム上にデータベースクラスタを作成します。 直接NFSを介して行うこともありますし、NFSを内部的に使うネットワークアタッチドストレージ(NAS)デバイスを使用することもあります。 PostgreSQLはNFSファイルシステムに特別なことを何も行いません。 つまりNFSはローカル接続のドライブとまったく同様に振る舞うという前提です。 クライアントとサーバのNFS実装が標準ファイルシステム・セマンティクスを持たないならば、信頼性の問題を引き起こす可能性があります。 (https://www.time-travellers.org/shane/papers/NFS_considered_harmful.html参照)。 具体的には、NFSサーバへの遅延(非同期)書きこみがデータ破損の問題を引き起こす可能性があります。 可能ならばNFSファイルシステムを(キャッシュ無しで)同期マウントし、この危険を防止してください。更に、NFSをソフトマウントすることは薦められません。
ストレージエリアネットワーク(SAN)は通常NFSとは異なる通信プロトコルを使用し、この種の危険がある場合と無い場合があります。 これは、データの整合性の保証に関するベンダのドキュメントを参照することをお勧めします。 PostgreSQLは、使用しているファイルシステム以上に信頼性が高くなることはありません。