【JPUG主催】PostgreSQLカンファレンス2020【11月13日開催】
他のバージョンの文書 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

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

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

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

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

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

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

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

postmaster には、このほかにも多くのコマンドラインオプションを指定することができます。 詳しい情報はリファレンスページと後述の 項16.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 の終了にも使うことができます。

16.3.1. サーバ起動の失敗

サーバの起動が失敗する理由として、代表的なものがいくつかあります。 サーバのログファイルをチェックするか、(標準出力や標準エラーをリダイレクトせずに) 手動で起動して、どのようなエラーメッセージが出ているか確認してください。 以下に、よく発生するエラーメッセージのいくつかをより詳細に説明します。

LOG:  could not bind IPv4 socket: Address already in use
HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
FATAL:  could not create TCP/IP listen socket

これは大抵の場合メッセージが示すとおりの意味です。 すでに postmasterが動いているポートで別の postmaster を起動しようとしたことを示しています。 しかし、カーネルエラーメッセージが Address already in use やそれに類似したものではない場合は、別の問題の可能性もあります。 たとえば、予約済みのポート番号で postmaster を起動しようとすると下記のようなメッセージが出ます。

$ postmaster -i -p 666
LOG:  could not bind IPv4 socket: Permission denied
HINT:  Is another postmaster already running on port 666? If not, wait a few seconds and retry.
FATAL:  could not create TCP/IP listen socket

次のようなメッセージが表示された場合、

FATAL:  could not create shared memory segment: Invalid argument
DETAIL:  Failed system call was shmget(key=5440001, size=4011376640, 03600).

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

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

FATAL:  could not create semaphores: No space left on device
DETAIL:  Failed system call was semget(5440126, 17, 03600).

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

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

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

16.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 通信を試みた時に上記のように表示されます。 よくある間違いはサーバに TCP/IP を許可する設定を忘れていることです。

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

psql: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

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