RPMで複数バージョンのPostgreSQLをインストールしてみよう

RPMで複数バージョンのPostgreSQLをインストールしてみよう

笠原 辰仁

はじめに

この記事は、PostgreSQL Advent Calendar(#5)に参加しています。

以前に、CentOSでPostgreSQLをインストールする方法yumでPostgreSQLをインストールする方法がLet's Postgresで紹介されました。これらはいずれもRPMを使ったインストール方法でした。ところで、RPMについてはRedHatなどディストリビュータが作成しているものもあれば、コミュニティで作成されているものもあります。CentOSでのインストールはCentOSコミュニティが、yumでのインストールはPostgreSQLのコミュニティがそれぞれ作成しているRPMが配布されています。

最近、といっても昨年の2010年にPostgreSQLの9.0がリリースされた時からですが、コミュニティやCent、RedHatで配布されているRPMのポリシーがいくつか変更されました。これにより、複数バージョンのPostgreSQLパッケージを同居させることができるようになりました。ただし、それに伴いいくつか注意する点もでてきました。下記のRPMは昨年の2010年からコミュニティから配布されているRPM全てに当てはまります。

複数のメジャーバージョンの同居が可能

従来は、RPMの依存性制約として、既にPostgreSQLのRPMパッケージがインストールされている環境に、別のバージョンのパッケージをインストールしようとすると衝突が発生していました。このため、異なるメジャーバージョンのRPMを同居させるには、RPMコマンドのオプションでインストールされる資材の配置場所の変更や、依存性を無視するなどの指定が必要でした。新しいポリシーでは、メジャーバージョンの異なるパッケージのインストール時には依存性による衝突が発生しません。このため、インプレイスなアップグレードや、新しいバージョンのpg_dumpを使ってのダンプ取得が非常に楽になりました。

実行ファイルやライブラリのインストール先変更

最もユーザに影響の大きい変更点です。従来のRPMは実行ファイルを"/usr/bin"配下に、ライブラリを"/usr/lib or /usr/lib64"配下にインストールしていました。ところが新しいポリシーでは"/usr/pgsql-<メジャーバージョン>"というディレクトリを作成し、その配下のbinやlibディレクトリに配置するようになりました。例えば、バージョン9.1のパッケージであれば、"/usr/pgsql-9.1"というディレクトリを作成し、その配下のbinやlib、sharedディレクトリへ資材を配置しています。そして、一部の実行ファイルのみLinuxの"alternatives"の仕組みを利用するようになっています。このため、以下の2点に注意してください。

実行ファイルやライブラリへのPATH指定

実行ファイルなどの配置場所が変更されたため、従来は必要なかったPATH指定が必要になるケースがあります。下記のalternativesと関連しますが、特にinitdbやpg_ctlが"/usr/bin"配下にあることを期待している環境では、"/usr/pgsql-m.n/bin"などへのPATHをbashrcなどへ記述すると良いでしょう。

一部実行ファイルに対してのみalternativesが有効

alternativesは、最近のRedHat系Linuxで良く使われる、複数バージョンの実行ファイルなどを管理/切り替えて使うためのしくみです。"/usr/bin"配下に実行ファイルへのシンボリックリンクを起き、優先度に応じて異なるバージョンの実行ファイルへのリンクを切り替える、という形がよくある使い方です。

例えば、PostgreSQLのバージョン9.0と9.1のRPMパッケージを同居させた場合、"/usr/pgsql-9.1"と"/usr/pgsql-9.0"のそれぞれに対応するバージョンの資材が配置されます。RPMパッケージの導入時に、"/usr/bin"配下と"/etc/alternatives"にそれぞれリンクが置かれます。そして、より優先度の高いパッケージがあればそのバージョンの実行ファイルにリンクが張られます。内部的には以下のようにつながっています。

  /usr/bin/psql
    --> /etc/alternatives/pgsql-psql <ここで切り替え> 
          --> /usr/pgsql-9.1/bin/psql

PostgreSQLのRPMパッケージではバージョン番号がそのまま優先度となっています。したがって、バージョン9.0のRPMがインストール済みの環境に9.1のパッケージを入れると、自動的に"/usr/bin"配下の実行ファイルのシンボリックリンクが、9.1の実ファイルへ切り替えられます。実際に、以下のようにalternativesコマンドでどのファイルを使われているかを確認できます。下記では、9.0と9.1のパッケージが同居しており、alternativesにより9.1のファイルが使用されていることを示しています。

# alternatives --display pgsql-psql
pgsql-psql - status is auto.
 link currently points to /usr/pgsql-9.1/bin/psql ★ 現在の指し先
/usr/pgsql-9.1/bin/psql - priority 910
/usr/pgsql-9.0/bin/psql - priority 900
Current `best' version is /usr/pgsql-9.1/bin/psql.

なお、全ての実行ファイルがalternativesの対象ではありません。具体的には、pg_ctlとinitdbが除外されています。おそらく、この2つのコマンドはinitスクリプト("/etc/init.d/postgesql-9.0など")で実行されるためでしょう。実際、initスクリプトではPGENGINEという変数でバージョン別のディレクトリ配下のpg_ctlなどを指定しています。手動でpg_ctlやinitdbを使っている方は、PATHを指定しておくことをお勧めします。参考までに、aletrnativesで対応しているコマンドを下記に示します。

$ ls /etc/alternatives/pgsql-*
/etc/alternatives/pgsql-clusterdb      /etc/alternatives/pgsql-dropdbman
/etc/alternatives/pgsql-clusterdbman   /etc/alternatives/pgsql-droplang
/etc/alternatives/pgsql-createdb       /etc/alternatives/pgsql-droplangman
/etc/alternatives/pgsql-createdbman    /etc/alternatives/pgsql-dropuser
/etc/alternatives/pgsql-createlang     /etc/alternatives/pgsql-dropuserman
/etc/alternatives/pgsql-createlangman  /etc/alternatives/pgsql-pg_dump
/etc/alternatives/pgsql-createuser     /etc/alternatives/pgsql-pg_dumpall
/etc/alternatives/pgsql-createuserman  /etc/alternatives/pgsql-pg_dumpallman
/etc/alternatives/pgsql-dropdb         /etc/alternatives/pgsql-pg_dumpman
/etc/alternatives/pgsql-pg_restore     /etc/alternatives/pgsql-reindexdb
/etc/alternatives/pgsql-pg_restoreman  /etc/alternatives/pgsql-reindexdbman
/etc/alternatives/pgsql-psql           /etc/alternatives/pgsql-vacuumdb
/etc/alternatives/pgsql-psqlman        /etc/alternatives/pgsql-vacuumdbman

initスクリプトがバージョン別に分かれている

PostgreSQLの起動やDBクラスタの初期化を行うinitスクリプトがバージョン別に分けられています。従来は"/etc/init.d/postgresql"というファイルが配置されていましたが、新しく"/etc/init.d/postgresql-9.1"というファイルになりました。これに伴い、chkconfigやserviceコマンドで指定するサービス名にバージョン名を含めた名前を入力する必要があります。従来と勝手が違いますので注意してください。例えばchkconfigでは、以下のように複数のバージョンを個別に設定することが可能(もしくは必要)です。

# chkconfig --list | grep postgres
postgresql-9.0  0:off   1:off   2:off   3:off   4:off   5:off   6:off
postgresql-9.1  0:off   1:off   2:off   3:off   4:off   5:off   6:off

RPM名が変更

細かいことですが・・・従来は

  postgresql-<パッケージ種別>-<バージョン数>-xxx.rpm

という名称でRPMが作成されていました。8.4.9のサーバユーティリティ(initdbやpg_ctlなどのサーバ用コマンドなど)のパッケージ名であれば

  postgresql-server-8.4.9-2.el5_4.1.x86_64.rpm

という名前でした。ところが最近は

  postgresql<メジャーバージョン番号>-<パッケージ種別>-<バージョン数>-xxx.rpm

となっています。上記のパッケージで言えば

  postgresql84-server-8.4.9-2.el5_4.1.x86_64.rpm

となります。

終わりに

最近変更されたRPMのポリシー変更について解説しました。運用へのインパクトが大きい変更ながら、違いになかなか気づきにくい部分もありますね。ぜひ、使用するパッケージには注意してください。


(2011年12月5日 公開)