ファイルやDBデータも含めたLinuxサーバの完全移行(Miracle Linux→TurboLinux 8 ServerにOSを変更し、環境を移行して欲しい)の依頼がありました。PostgreSQLのバージョンは、7.1.2→7.2.2-3に変わります。(rpmでのパッケージ管理をご希望なので、PostgreSQLの最新バージョンではありません。)
同じバージョンであれば、pgsqlのディレクトリごとコピーしてしまえば動くのですが、7.1→7.2のようにバージョンが変わる場合は、PostgreSQLの仕様が変わるため、単なるディレクトリのコピーでは、サービスを起動することができません。
そこで、以下のようにデータベースのバックアップをとり、バージョンアップしたデータベースにリストアする必要があります。これにより、新しいバージョンでも動くDBデータの形式になります。
●PostgreSQLのバージョンアップの方法
1.postgresユーザーで、古いデータベースのバックアップをとる。
#su - postgres
$pg_dumpall -o > バックアップファイル名
2.バージョンアップ後、initdbを行い、postgresユーザーで、データの組み込みを行う。
$psql -e template1 < バックアップファイル名
組み込み時のログをファイルに保存する場合は、
$psql -e template1 < バックアップファイル名 > ログファイル名 2>&1
何も問題がなければいいのですが、ログを見てみると、以下のようなエラーがでていました。
COPY "abcde" WITH OIDS FROM stdin;
ERROR: copy: line 127, Invalid EUC_JP character sequence found (0x8252)
lost synchronization with server, resetting connection
『abcde』というテーブルの127行目に、EUC_JPの範囲外の文字が入っているので、エラーが起こりましたということです。PostgreSQLは、バージョン7.2から、文字コードのチェックが厳しくなったので、エラーになったようです。新しく作成されたデータベースで、該当のテーブルをselect文で抽出してみると、中身は空っぽでした。いろいろな修正方法があると思いますが、1レコードしかないので、手動で値を修正し、新しいテーブルに組み込むことにしました。2005/1/21
参考:PostgreSQLでテーブルをファイルバックアップ&ファイルからテーブルの復元方法
|