このエントリーをはてなブックマークに追加
スポンサーリンク

ダンプコンバーター

スキーマーの変換

PostgreSQL7.4以上のスキーマーをPostgreSQL7.3に読み込ませるとエラーが出ます。特に、8.0以上になると、7.3シリーズとの互換性はほとんどありません。正確には、7.3から8.0にレベルアップは可能ですが、8.0から7.3へのレベルダウンができません。

通常、上位互換さえ保たれていれば下位互換がなくとも問題はないのですが、現場レベルでは8.0でダンプしたデーターを7.3で読み込ませたい場合もあります。例えば、新しいサーバー、新しいOS、新しいバージョンにシステムを総入れ替えした2〜3日後に致命的なバグが発見された、あるいは、新しいサーバーが故障した、などで、ダンプデーターを元に古いシステムに戻さねばならない事があります。しかも、2〜3日間に新しいシステムで稼動したデーターは残さねばなりません。

そういった場合、8.0でダンプしたデーターをなんとか7.3で読み込ませる事になりますが、関数とかはまず無理としても、データーだけは何とか生かしたい所です。なので、ダンプデーターを解析すると、大抵はシーケンスのスキーマーでエラーになっているだけの事が多いです。なので、Perlで正規表現でスキーマーをコンバートするプログラムを作成しました。

dump_conv.pl
を右クリックして「対象をファイルに保存」を選択してください。

使い方は、dump_conv.plに実行権限をつけた後、
./dump_conv.pl < ダンプファイル名 > 出力ファイル名
で、出力ファイルにコンバート後のファイルが生成されます。必ずダンプファイル名と出力ファイル名は、別にしてください。

コンバートする内容は以下の通りです。
・INCREMENT BY 1のBYを取る。
・NO MAXVALUEをmaxvalue 9223372036854775807に変換する。
・NO MINVALUEを、minvalue 1に変換する。
・nextval関数にある、::regclas型へのキャストを外す
・setval関数の、pg_catalog.setval(pg_catalog.pg_get_serial_sequence・・・ という書式を、setval(のみに変換する。
・ALTER TABLE句の public()を外す。
・フィールド名にダブルクォートがある場合は外す
・userというフィールドはusernameというフィールドに変更

これでもまだ足りないと思いますが、リストアした時にエラーが出るようであれば、dump_conv.pl内の正規表現を追加するなどしてください。また、関数の変換には対応していませんし、当然、8.0以降にしかない機能は7.3には完全には移動できません。ただ、先の例のような、直前まで7.3で動いていて、8.0にコンバージョンした後にアクシデントで急遽バージョンをダウンさせたい場合には有効かと思います。

データーの変換

同じバージョンのダンプをそのままリストアしてもエラーになるケースがあります。

PostgreSQLのデーター内(特にtext型)に、文字化けなどでEUCに変換できないコードが入ってしまう場合があります。また、古いバージョンでは¥マークの後に8進数の数値を書くとそのままノーチェックでバイナリデーターが混在してしまう事があります。例えば、ユーザーが「\1000なんて高いですよ」みたいな書き込みをした場合に、データーベースに8進数の100が入ってしまうケースがあります。PostgreSQLの7.2以下のバージョンで、¥マークをきちんと\\にエスケープしてないとそうなります。

また、insertする際に絶妙な文字化け具合(?)で、EUCコードに存在しないかどうかのチェックを通ってしまい、ダンプ&リストア時にエラーが出てデーターが戻らないケースがあります。

こういった場合に困るのが、
・1つでもエラーがあると、1テーブル全滅
・リストア時のメッセージが早すぎて1テーブルぐらいエラーでも気づかない
・そもそも英文でエラーが出ても、英文の通常のメッセージと何ら区別がつかない

日本人がLinuxを扱う場合に最もネックになるのが、英文が画面にばあああっとスクロールした時に、通常のメッセージなのかエラーを告げているのかなかなか気づかないという事です。そりゃ、**ERROR**とか赤い時でも出ればわかりますが、多くの正常時にも出るメッセージにまじってinvalid byte sequence for encoding EUC_JPという文字があっても、なかなかそれが異常を告げるものだと気づきにくいものです。(これを私は「英語の壁」と呼んでいます。)

という事で、EUCコードに存在しないコードを¥8進数に戻すプログラムを作成しました。

data_conv.pl
を右クリックして「対象をファイルに保存」を選択してください。

使い方は、data_conv.plに実行権限をつけた後、
./data_conv.pl < ダンプファイル名 > 出力ファイル名
で、出力ファイル名に変換後のデーターが出力されます。必ずダンプファイル名と出力ファイル名は、別にしてください。

また、標準エラー出力に、どの文字がエラーになったのかが表示されます。
XXX does not exist in EUC-JP
という風にEUCコードに存在しない文字が表示されます。このメッセージが出ても出力ファイル名には、\xxx(xxxは8進数)という風に変換されていますので、出力先のデーターは psql DB名 < ファイル名 でリストアする事ができます。
スポンサーリンク