普段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周りのやつはいろいろ再ビルドが必要そうです。