smellman's Broken Diary

クソみたいなもんです

postgresql93-serverからpostgresql94-serverに移行

普段MacPortsでpostgresql93-serverを使っているんだけど、そろそろ古いな―と思ったので移行をしてみる。

まずは何か合った時のためのようにdumpを取得しておく。

% sudo -u postgres /opt/local/lib/postgresql93/bin/pg_dumpall > /tmp/pg93_dumpall

なにもないことを祈ります(何

次にpostgresql94関係をインストールします。

% sudo port install postgresql94
% sudo port install postgresql94-server

ここで以下の出力が出てくる。

To create a database instance, after install do
 sudo mkdir -p /opt/local/var/db/postgresql94/defaultdb
 sudo chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb
 sudo su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D
/opt/local/var/db/postgresql94/defaultdb'

この出力通りにデータベースを作る。

% sudo mkdir -p /opt/local/var/db/postgresql94/defaultdb
% sudo chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb
% sudo su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D /opt/local/var/db/postgresql94/defaultdb'

次に基本的なコマンドをpostgresql94を使うようにする。

% sudo port select postgresql postgresql94

次に既存のpostgresql93-serverを停止する。

% sudo -u postgres /opt/local/lib/postgresql93/bin/pg_ctl -D /opt/local/var/db/postgresql93/defaultdb stop

あとはpg_upgradeを実行してアップデートをします。pg_upgradeは実行したディレクトリにファイルを出力するので、/tmpなどの権限がゆるいところで実行すると良いです。

% cd /tmp
% sudo -u postgres /opt/local/lib/postgresql94/bin/pg_upgrade --old-datadir /opt/local/var/db/postgresql93/defaultdb --new-datadir /opt/local/var/db/postgresql94/defaultdb --old-bindir /opt/local/lib/postgresql93/bin --new-bindir /opt/local/lib/postgresql94/bin
Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok
Checking database user is a superuser                       ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for reg* system OID user data types                ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for invalid "line" user columns                    ok
Creating dump of global objects                             ok
Creating dump of database schemas
                                                            ok
Checking for presence of required libraries                 fatal

Your installation references loadable libraries that are missing from the
new installation.  You can add these libraries to the new installation,
or remove the functions using them from the old installation.  A list of
problem libraries is in the file:
    loadable_libraries.txt

Failure, exiting

はいコケた。
loadable_libraries.txtを見てみるとpostgis2とpg_routingでコケています。

とりあえずpostgis2とpgroutingをpostgresql94で動かすようにしないといけないのですが、MacPortsでは postgis2 +postgresql93 +postgresql94 とかだとVariantsがバッティングして両方をインストールできません。
また、pgroutingは現段階でそもそもpostgresql94のVariantsすらないです。
なので、postgresql94側は一旦ソースコードからインストールすることにします。

まずはpostgis2から。こちらはMacPortsのバージョンに合わせて2.1.8をインストールします。(postgis2は2.1.xと2.2.xで、pgroutingは2.0.xと2.1.xでライブラリのファイル名が違うのでバージョンはなるべく合わせる必要があります)

% wget http://download.osgeo.org/postgis/source/postgis-2.1.8.tar.gz
% tar zxf postgis-2.1.8.tar.gz
% cd postgis-2.1.8
% sudo port install proj47
% CC=clang ./configure --with-projdir=/opt/local/lib/proj47 --with-raster --with-topology --with-libiconv=/opt/local --without-json
% make
% sudo make install

次にpg_routingもMacPortsのバージョンに合わせて2.0.1をインストールします。

% wget https://github.com/pgRouting/pgrouting/archive/pgrouting-2.0.1.tar.gz
% tar zxf pgrouting-2.0.1.tar.gz
% cd pgrouting-pgrouting-2.0.1
% mkdir build
% cd build
% cmake ..
% make
% sudo make install

では、再度実行です。

% cd /tmp
% sudo -u postgres /opt/local/lib/postgresql94/bin/pg_upgrade --old-datadir /opt/local/var/db/postgresql93/defaultdb --new-datadir /opt/local/var/db/postgresql94/defaultdb --old-bindir /opt/local/lib/postgresql93/bin --new-bindir /opt/local/lib/postgresql94/bin

これでコンバートができました。

さて、ここで一旦postgis2をMacPortsで利用しているものに再度切り替えます。

% cd postgis-2.1.8
% sudo make uninstall
% sudo port install postgis2 +postgresql94

最後にサービスの切り替えをします。

% sudo launchctl unload -w /Library/LaunchDaemons/org.macports.postgresql93-server.plist
% sudo launchctl load -w /Library/LaunchDaemons/org.macports.postgresql94-server.plist
% sudo launchctl start org.macports.postgresql94-server

あとは後始末です。まずはpostgresql93に関連するパッケージを消していきます。

% sudo port uninstall postgresql93-server
% sudo port install py27-psycopg2 +postgresql94
% sudo port uninstall pgrouting
% sudo port uninstall inactive
% sudo port uninstall postgresql93

次にpg_upgradeを実行したディレクトリにあるスクリプトを実行したり、要らないディレクトリを削除しましょう。

% cd /tmp
% sudo -u postgres ./analyze_new_cluster.sh
% sudo ./delete_old_cluster.sh
% sudo rm -fr /opt/local/var/db/postgresql93

実際のプロダクトの検証はまた後日ということで...たぶんRubyGemsのpgとかnode.js周りのやつはいろいろ再ビルドが必要そうです。