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

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

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

上記のコマンドは、サーバをフォアグラウンドで実行させます。これは、PostgreSQL ユーザアカウントにログインして実行されなくてはいけません。 -D オプションが指定されていない場合、サーバは環境変数 PGDATA で指定されたデータディレクトリを使用しようと試みます。 どちらの方法でもできない場合は失敗します。

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

$ postmaster -D /usr/local/pgsql/data > logfile 2>&1 &

この例のように、サーバの stdoutstderr 出力をどこかに保管しておくことが重要です。 これは追跡記録的な目的と問題の原因究明に役立ちます (ログファイルの取り扱いについての全体的な説明については Section 8.4 を参照して下さい)。

postmaster には、このほかにも多くのコマンドラインオプションを指定することができます。詳しい情報はリファレンスページと後述の Section 3.4 を参照してください。特に、サーバが(単に Unix ドメインソケットではなく) TCP/IP 接続を受け入れるためには、オプション -i を指定する必要があります。

このシェル構文はすぐに長くなります。そのため、シェルスクリプトラッパである pg_ctl コマンドが提供されていて、いくつかのタスクを単純化しています。以下に例を示します。

pg_ctl start -l logfile

これは、サーバをバックグラウンドで起動し、出力を指定されたログファイルに書き出します。 -D オプションは、ここでも postmaster の場合と同じ意味をもちます。 pg_ctl によってサーバを停止させることもできます。

通常、コンピュータが起動されたときにデータベースサーバも一緒に起動したい場合が多いと思われます。 自動起動スクリプトは、オペレーティングシステム固有のものです。いくつかは PostgreSQL/contrib/start-scripts ディレクトリに同梱されています。これらは root 権限を必要とする場合があります。

起動時にデーモンを開始する方法はシステムによって異なります。多くのシステムには /etc/rc.local ファイルや /etc/rc.d/rc.local ファイルがあります。他のシステムでは rc.d ディレクトリが使用されます。何を実行するにしても、サーバは PostgreSQL ユーザアカウントで起動させなければなりません。 rootであってはいけませんし、他のユーザーでもいけません。したがって、su -c '...' postgres を使用してコマンドを実行したほうがよいでしょう。以下に例を示します。

su -c 'pg_ctl start -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 が動いているポートで別の 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

これは、おそらくカーネルによる共有メモリのサイズの上限が PostgreSQL が作ろうとしているバッファ領域よりも小さい可能性があります(この例では83,918,612バイトです)。または、System V方式の共有メモリサポートがカーネルにまったく設定されていない可能性もあります。一時的な策として、(-Bオプションを使用して)postmasterを通常よりも少ないバッファ数で起動することもできます。しかし最終的には、カーネルを再設定し、使用可能な共有メモリサイズを増やしたほうがよいでしょう。このメッセージは、同じマシン上で複数の postmaster を起動しようとしたときに、要求された領域の合計がカーネルの上限を越えた場合にも表示されます。

下記のようなエラーはディスクの空き容量がなくなったということを示しているわけでは ありません

IpcSemaphoreCreate:semget(key=5440026, num=16, 01600) failed:No space left on device

これはカーネルの System V セマフォの上限が、PostgreSQL が作成しようとしている数よりも小さいということを意味しています。 上記のように、許可される接続の数を減らして(-Nオプションを使用して)postmaster を起動させることで問題は回避できるかもしれませんが、最終的にはカーネルの設定を変えてセマフォの上限を増やした方がよいでしょう。

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

System V IPC 設備の設定についての詳細は Section 3.5.1を参照してください。

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

クライアント側で起こり得るエラー状態はきわめて多様で、アプリケーションに依存します。 そのなかのいくつかはサーバが起動された方法と直接関係するかもしれません。以下で説明する以外の状態については各々のクライアントアプリケーションの資料を参照してください。

psql:could not connect to server:Connection refused
        Is the server running on host server.joe.com and accepting
        TCP/IP connections on port 5432?

これは一般的な "接続するサーバが見つけられませんでした" という失敗です。TCP/IP 通信を試みたときに上記のように表示されます。よくある間違いは postmaster に TCP/IP を許可する -i オプションを付け忘れていることです。

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

psql:could not connect to server:Connection refused
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

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