読者です 読者をやめる 読者になる 読者になる

PostgreSQL のアップグレード時に明らかになる pg_wrapper の役割

PostgreSQL 9.5 のサーバーがデフォルトの 5432 番ポートで動いている状態で、PostgreSQL 9.6 のサーバーをインストールするとどうなるか。

$ apt-get install postgresql-9.6

結果。PostgreSQL 9.6 の main クラスタが 5433 番ポートで立ち上がる。

この状態で psql コマンドのバージョンを調べると、9.5.4 のように古いバージョン番号が報告される。

なぜか。

実は、psqlpg_dumppg_restorepg_basebackup などのコマンドは /usr/share/postgresql-common/pg_wrapper へのリンクとなっていて、この pg_wrapper がさらに適切なバージョンの「本物」のコマンドを実行する、という仕組みになっているからである。

PostgreSQL 9.6 用の「本物」の psql/usr/lib/postgresql/9.6/bin にある。

pg_wrapper が「本物」のコマンドを選択する方法については、man pg_wrapper に書いてある。その仕組みはかなり複雑だが、私たちが特に何もしていない場合、デフォルトの 5432 番ポートを listen している PostgreSQL サーバーのバージョンを使うことになる。つまり、現状では 9.5 だ。

ここで、PostgreSQL 9.5 をアンインストールしてみよう。

apt-get remove postgresql-9.5

5432 番を listen している PostgreSQL サーバーは停止されて、PostgreSQL 9.5 のプログラムは除去される。

そして psql --version を実行すると、次のようなエラーメッセージが出る。

Error: No existing local cluster is suitable as a default target.
Please see man pg_wrapper(1) how to specify one.

5432 番を listen している PostgreSQL サーバーが存在しないからだ。

しかし、psql --port=5433 --version というコマンドを実行すれば、正しく 9.6.2 という結果を返す。

だから、さきほどのエラーメッセージについては気にしなくてもいい。

もし気になるのであれば、いくつか回避方法がある。

  1. 環境変数 PGPORT5433 をセットする。
  2. /etc/postgresql/9.6/main/postgresql.confport 属性の値を 5432 に変更して、PostgreSQL サーバーを再起動する。