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