Main Contents

Apple Store(Japan)

PostgreSQL8.1

PostgreSQL を 8.0.3 から 8.1 に更新中。
管理してるサーバーのほとんど全部更新してます。

PostgreSQLのメジャーバージョンが上がったときには、データベースクラスタも initdb し直さなくてはいけないので、アップグレードも結構大変だったりします。
たいていは、マニュアルに書いてある通り、 --prefix を指定して、稼働中のDBとは別の場所にインストールして、違うポートで postmaster を立ち上げて、 pg_dumpall -p 5432 | psql -d postgres -p 6543 のようにするのでしょうが、pg_dumpall はラージオブジェクトの dump ができないので、僕みたいに LargeObject をよく使う人は、pg_dump と pg_restore をつかってDBを一つずつ dump, restore しなくてはならず、面倒です。
そこで、こんなシェルスクリプトを使って、この作業を自動化しています。

ここでは、新しいPostgreSQLを --prefix=/usr/local/pgsql8.1 でインストールして、 initdb して、 postmaster を port 6543 で立ち上げてから、PostgreSQLのスーパーユーザー権限で、このスクリプトを実行します。

#!/bin/sh
# 古いPostgreSQLのprefixを指定
OLD_PGSQL=/usr/local/pgsql
# 新しいPostgreSQLのprefixを指定
NEW_PGSQL=/usr/local/pgsql8.1
# 古い方のPGPORTを指定
OLD_PORT=5432
# 新しい方のPGPORTを指定
NEW_PORT=6543

LD_LIBRARY_PATH=${NEW_PGSQL}/lib; export LD_LIBRARY_PATH

dbnames=`${NEW_PGSQL}/bin/psql -q -t -A -d template1 -c "SELECT datname FROM pg_database WHERE datname != 'template0'"`

${NEW_PGSQL}/bin/pg_dumpall -g -p ${OLD_PORT} | ${NEW_PGSQL}/bin/psql -d template1 -p ${NEW_PORT}
for db in ${dbnames}; do
echo -n " $db"
file=./dump_${db}.tar
${NEW_PGSQL}/bin/pg_dump -b -Fc -f ${file} ${db}
${NEW_PGSQL}/bin/dropdb -p ${NEW_PORT} ${db}
${NEW_PGSQL}/bin/createdb -p ${NEW_PORT} ${db}
${NEW_PGSQL}/bin/psql -p ${NEW_PORT} -q -t -A -d ${db} -c "DROP TABLE tellers"
${NEW_PGSQL}/bin/pg_restore -p ${NEW_PORT} -d ${db} ${file}
[ $? -gt 0 ] && rc=3
done

自動的に、古いDB を dump し、新しい方へ restore するようになっています。


Copyright © here.Creative Commons LicenseThis weblog is licensed under a Creative Commons License.