読者です 読者をやめる 読者になる 読者になる

山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

古いPostgreSQLのデータ移行

個人的なサイトで使っているPostgreSQLのデータ移行をしました。いろいろうまくいかなくて試行錯誤しましたがなんとかできたので公開しておこうと思います。

移行元
レンタルサーバー
CentOS4 / PostgreSQL7.1 / EUC-JP

移行先
VirtualBox
CentOS6 / PostgreSQL8.4 / UTF-8

結論
レンタルサーバーでpgdump
VirtualBoxでCentOS4 / PostgreSQL / EUC-JPのサーバーを作る
psqlでダンプデータを取り込み
・pgdumpでテーブル定義だけエクスポートしてpsqlで取り込みてーブル作成
JavaプログラムでPostgreSQL7.1から読み取ってPostgreSQL8.4にinsertする

データとしては掲示板のデータが主で、改行コードがばりばり入っていますしあらゆる種類の文字が入っています。

レンタルサーバーpostgresqlのポートが空いてないしsshのポートフォワーディングもできないのでdumpファイルを転送するしかありません。

次のステップは、通常ならpsqlコマンドでdumpファイルを8.4へインポートです。これがどうやってもうまくできません。EUCからUTF8はもちろん、EUCからEUCでもだめです。
通常のインポート → 文字コードのエラーでNG
insert文のdump → やはり文字コードのエラーでNG
7.1のダンプファイルは8.4では取り込めないようです。

pg_dumpはローカルだけでなくリモートサーバーに接続してダンプすることができます。PostgreSQLのマニュアルによるとバージョンが異なるサーバーに接続してダンプすることも可能でバージョン7.0までさかのぼれるとのこと。そこでローカルに同じバージョンのPostgreSQLサーバーを立てました。注意しなければならないのは、バージョンの少数第1位まで合わせること。PostgreSQL7は7.4がありますが7.1のダンプファイルは取り込めませんでした。7.1でやっと取り込めました。

次に8.4のpg_dumpから7.1に接続してダンプファイルを作成。先ほどの7.1のダンプファイルと確かに内容が違うようです。しかしこれも取り込めませんでした。
pg_dumpしてpsql取り込み → 文字コードエラー
pg_dumpしてpg_restore取り込み → 文字コードエラー
pg_dumpするときにUNICODE指定してpsql取り込み → ダンプ中に変換エラー多数
pg_dumpしてnkfで変換してpsql取り込み → 文字コードエラー
pg_dumpしてiconvで変換してpsql取り込み → iconvでエラー

少々手間ではありますがJavaプログラムはかなりきれいに移行できました。JDBCドライバでのEUCからUTF8への変換部分が一番ちゃんとしているのでしょう。DBUtilsを使えばプログラムもだいぶ短くすみます。

プログラムはこちらです。Gistが貼れません・・・

Migrate.java

感想
PostgreSQL7と8は別物と思えるくらい違う。
掲示板のデータのような改行やいろんな文字が入っているデータは移行が大変。
古いものは大変。もっと新しい8から9への移行なんかはきっと楽なのでしょう。