最近PostgreSQLのバージョンを上げていなかったので、たまには上げてやろうと思う。
きっかけは、pg_upgrade と言う新機能のマニュアルを読んだこと。こいつがあると、今までのように pg_dump しなくてもバージョンがあげられるらしい。
ところが、良く良く読んでみると、なかなか条件が厳しい。
ちなみに、portsから入れたデフォルトではデータディレクトリも /usr/local/pgsql/data なんだけど、これはrc.conf に postgresql_data を定義してやれば自由に変えられる。
試しにpg_dumpallしてみたら1分程度で終わったので、今回も pg_upgrade ではなく dump/restore でバージョンアップすることにする。
前回の記事が postgresqlバージョンアップ - PC日記にあるのだが、あまりにざっくりしているのでもう少し丁寧に書く。(やったことは基本同じだけど)
後は、各種クライアントの動作チェックをして、っていきなり MovableType でログインしようとすると Can't use string ("x42494e3a53455247000000000000000") as an ARRAY ref while "strict refs" in use と言うエラーが出る。

これはまた泣きながら8.4に戻さないと駄目か?と思ったが、一応エラーメッセージでぐぐってみるといきなり正解にたどり着いた。Can't use string .... as an ARRAY ref while strict refs in use - Movable Type Forums
ここには、postgresql.conf に bytea = 'escape' と書けとあるが、9.1の実際の postgresql.conf を見ると bytea_output と書いてあるようなので、以下の行を追加した。
きっかけは、pg_upgrade と言う新機能のマニュアルを読んだこと。こいつがあると、今までのように pg_dump しなくてもバージョンがあげられるらしい。
ところが、良く良く読んでみると、なかなか条件が厳しい。
- 旧バージョンと新バージョンの両方のdataディレクトリが別の場所にあること
- 旧バージョンと新バージョンのバイナリが別の場所にあること
ちなみに、portsから入れたデフォルトではデータディレクトリも /usr/local/pgsql/data なんだけど、これはrc.conf に postgresql_data を定義してやれば自由に変えられる。
試しにpg_dumpallしてみたら1分程度で終わったので、今回も pg_upgrade ではなく dump/restore でバージョンアップすることにする。
前回の記事が postgresqlバージョンアップ - PC日記にあるのだが、あまりにざっくりしているのでもう少し丁寧に書く。(やったことは基本同じだけど)
- pgsqlユーザで現在のデータベースのバックアップを取る
$ pg_dumpall -f dumpall.20111207
- root でデータベースを止め、既存のバージョンを削除する。
# /usr/local/etc/rc.d/postgresql stop # pkg_deinstall postgresql-server-8.4.7 # pkg_deinstall -f postgresql-client-8.4.7
- root で既存のデータディレクトリをリネームする。
# mv /usr/local/pgsql/data /usr/local/pgsql/data.8.4
これは、将来pg_upgradeみたいな仕組みが使いやすくなったときに、いつも同じディレクトリを使うのではなく、バージョン毎のディレクトリにしておいた方が良さそうなため。PostgreSQLは、x.y.zのx.yの部分が同じならばデータディレクトリは互換性があることになっているので、バージョン8.4.7でもディレクトリは8.4で良い。 - 新バージョンをインストール
# portupgrade -N databases/postgresql91-server
- /etc/rc.conf 修正
既存のデータディレクトリのリネームで説明した通り、今後はデータディレクトリにはバージョンをつけることにしたので、/etc/rc.conf に以下を追加postgresql_data="/usr/local/pgsql/data.9.1"
- データベース作成
# /usr/local/etc/rc.d/postgresql initdb
※ 前回の記事では、initdb -E utf8をやり直したと書いてあるが、最近の rc.d/postgresql では initdb のデフォルトのオプションで "--encoding=utf-8 --lc-collate=C" が指定されているので、そのままで問題ない。 - データベース起動
# /usr/local/etc/rc.d/postgresql start
- データベースのバックアップからの復元
# psql -U pgsql postgres < dumpall.20111207
後は、各種クライアントの動作チェックをして、っていきなり MovableType でログインしようとすると Can't use string ("x42494e3a53455247000000000000000") as an ARRAY ref while "strict refs" in use と言うエラーが出る。

これはまた泣きながら8.4に戻さないと駄目か?と思ったが、一応エラーメッセージでぐぐってみるといきなり正解にたどり着いた。Can't use string .... as an ARRAY ref while strict refs in use - Movable Type Forums
ここには、postgresql.conf に bytea = 'escape' と書けとあるが、9.1の実際の postgresql.conf を見ると bytea_output と書いてあるようなので、以下の行を追加した。
bytea_output = 'escape'これで、無事に MovableType も動くようになった。