3.3. データベースサーバの起動

データベースにアクセスするためには、まずデータベースサーバ を起動しなくてはいけません。データベースサーバは postmasterと呼ばれます。postmaster は 自分が作業するデータがどこにあるのかを知っている必要があり、 オプション-Dで指定できます。したがって、 サーバを起動する一番簡単な方法例は、

> postmaster -D /usr/local/pgsql/data
となり、サーバをフォアグラウンドで走らせます。これもまた Postgresユーザアカウントにログインして実行されなくてはいけません。 -Dオプションが指定されていない場合、サーバは 環境変数PGDATAで指定されたデータディレクトリを使用しようと試みます。 両方の方法でも出来ない場合は失敗します。

バックグランドでpostmasterを起動する には通常のシェルの構文を使います。

> postmaster -D /usr/local/pgsql/data > logfile 2>&1 &
この例のように、サーバの出力をどこかに残しておくことを強くお勧めします。 これは追跡記録的な役割と問題の原因究明の2つの役割があります。

postmasterはこの他にも多くのコマンドラインオプションを指定することが できます。詳しい情報はレファレンスページの実行時設定の部分を 参照してください。特に、postmasterがTCP/IP接続を許容するためには (Unixドメインソケットではなく)オプション-iを 指定する必要があります。

このシェル構文はすぐに長くなります。したがってシェルスクリプトラッパーである pg_ctlコマンドが提供されており、 いくつかのタスクをカプセル化することができます。例えば、

pg_ctl start -l logfile
はサーバをバックグラウンドで起動し、出力を指定されたログファイルに 書き出します。-Dオプションはpostmasterを直接 呼び出すことと同じです。pg_ctl は対称的な"stop"操作も実装しています。

通常、コンピュータが起動された時にデータベースサーバも一緒に起動 する場合が多いと思われます。そうすることは強制ではありませんが、 PostgreSQLサーバは権限を持たないアカウント からでもrootの介入なしで起動させることができます。

ブート時にデーモンを開始する方法はシステムによって異なりますが、 精通しておいたほうが良いでしょう。多くのシステムには /etc/rc.localファイルや /etc/rc.d/rc.localファイルがあり、それらのコマンド を置いておくには良い場所だと言えます。何を実行するにしても、サーバは Postgresユーザアカウントで起動させます。 rootではいけませんし他のユーザでもいけません。 したがって、su -c '...' postgresのような 専用のコマンドを作っておいたほうが良いでしょう。例えば下記のように なります。

su -c 'pg_ctl -D /usr/local/pgsql/data -l serverlog' postgres

さらに幾つかのオペレーティングシステム固有の提案を挙げます。 (適切なインストールディレクトリと自分が選んだユーザ名に 置き換えて下さい。)

postmasterが動いている間は、その PID は データディレクトリの中のpostmaster.pidファイル 記述されています。これは同じデータディレクトリで動く複数の postmaster の 調整をし、postmaster の終了にも使うことができます。

3.3.1. サーバ起動の失敗

postmasterの起動が失敗する理由として、代表的なものがいくつかあります。 postmasterのログファイルをチェックするか、どのような エラーメッセージが出ているか見るために(標準出力か標準エラーをリダイレクトせずに) 手動で起動してみて下さい。いくつかのエラーメッセージは比較的 原因が分かりやすいものですが、そうではないものについてここで説明します。

FATAL: StreamServerPort: bind() failed: Address already in use
        Is another postmaster already running on that port?
これは多くの場合、すでにpostmasterが動いているポートで2つめのpostmaster を起動してしまった可能性があることを示しています。しかし、もしカーネル エラーメッセージがAddress already in use ではない場合や、それに似たようなものだった場合は別の問題の可能性もあります。 例えば、 予約済みのポート番号でpostmasterを起動しようとすると下記のような結果が出ます。
> postmaster -i -p 666
FATAL: StreamServerPort: bind() failed: Permission denied
        Is another postmaster already running on that port?

IpcMemoryCreate: shmget(key=5440001, size=83918612, 01600) failed: Invalid argument
FATAL 1:  ShmemCreate: cannot create region
上記のようなメッセージが出た場合は、おそらく共有メモリ領域のカーネル の上限がPostgresが作ろうとしているバッファ領域よりも小さい可能性があります。 (この例では83918612バイトです。)または、System V方式の共有メモリサポートが カーネルに全く設定されていない可能性もあります。一時的な策として、 (-Bオプションを使用して)postmasterを通常よりも 少ないバッファ数で起動することもできます。しかし最終的には、カーネルを 再設定し、使用可能共有メモリサイズを増やしたほうがよいでしょう。 このメッセージは、同じマシン上で複数の postmaster を起動させようと するときに要求された空間の合計がカーネルの上限を越えた場合にも出ます。

下記のようなエラー

IpcSemaphoreCreate: semget(key=5440026, num=16, 01600) failed: No space left on device
はディスクの空き容量がなくなったということを示しているわけでは ありません。これは使っているカーネルのSystem V セマフォの上限がPostgres が作成しようとしている数よりも小さいということを意味しています。 上記のように、バックエンドプロセスを減らして(-Nオプションを使用して) postmasterを起動させることで問題は回避できるかもしれませんが 最終的にはカーネルの上限を増やした方が良いでしょう。

"illegal system call"というエラーが表示された場合は、 使用しているカーネルでは共有メモリやセマフォが全くサポートされていない可能性があります。 その場合、これらの機能を使えるように設定し直すことが唯一の選択肢となります。

System V IPC 設備の設定についての詳細はSection 3.5.1に記述されています。

3.3.2. クライアント接続の問題

クライアント側の起こり得るエラー状態はほとんど無限であり アプリケーションに依存します。そのなかのいくつかはサーバの 起動された方法と直接関係するかもしれません。下記で説明する以外 の状態では各々のクライアントアプリケーションの資料を見て下さい。

PQconnectPoll() -- connect() failed: Connection refused
	Is the postmaster running (with -i) at 'server.joe.com'
	and accepting connections on TCP/IP port 5432?
これは一般的な"接続するサーバが見つけられませんでした" という失敗です。TCP/IP 通信を試みた時に上記のような表示が出ます。 よくある間違いは postmaster に TCP/IP を許可する-i オプションをつけ忘れていることです。

代わりとして、ローカルの postmaster に Unix ソケット通信 を試みると下記のような表示が出ます。

connectDBstart() -- connect() failed: No such file or directory
	Is the postmaster running locally
	and accepting connections on Unix socket '/tmp/.s.PGSQL.5432'?

最後の行は、クライアントが正しいところに接続しようとしている ことを実証するのに役立ちます。もしそこに動いている postmaster がない場合、典型的なカーネルエラーメッセージは、表示されているように Connection refused もしくは No such file or directory となります。特にこの場合の Connection refusedは postmaster が接続要求を受けつけ拒否したわけではない ということを理解しておくことが大切です。もしそうだった場合は Section 4.3で示されるような 別のメッセージが表示されます。) Connection timed outのような 他のメッセージは、例えばネットワーク接続の欠如のような もっと根本的な問題を表しています。