先日の10月26日に、誤ってmysqlのデータベースを削除してしまいました。MTやらXOOPSやらWordpressやらのデータがガッツリと消えてしまいました。
しかも、バックアップ取ったのが1年以上前という体たらく・・・。
復旧を諦めざるを得ない部分もありましたが、MTのブログはなんとか、ほぼ元の状態にもどしましたので、その過程を書いてみようと思います。
ちなみにWordpressを使っているこのブログは、以前に移行用につくったMT用のインポートファイルが残っていて、その後に新規に投稿した記事も少なかった上に、すべて(?)Googleのキャッシュに残っていたので、記事自体はすぐに復帰できました。
データベースが消えた状態からなんとか記事を復旧できないかを探してみて、こちらのブログ記事を見つけました。
実を言えば MT のデータベースをサックリ消してしまった経験は2度ほどになるわけですが、mysqldump でデータのバックアップを取っていないときは冷や汗もんです。だいだい消えるときに限ってバックアップなんぞは取っていないものです。
ブログパーマリンクのhtmlファイルから、perlスクリプトでインポート用のファイルを作成するというものだ。
デザインの都合で、perlスクリプトはそのままではつかえなかったが、記事は抽出できそうだ。それに、タグも最新のインポートファイルの仕様では入れられるので、そちらも復旧可能だ。ファイル名に時間も入ってるので、日付も秒単位以外は復旧できる。
この作業は、ブログ毎に抽出用の正規表現を調整しながら作業を進めていたので、日々ちょっとずつやっていた関係で一週間近く掛かりました。
ただ、エントリーIDをURLの一部に使っていたので、インポートするとずれてしまう。そこで、使っていないbasenameのエリアに旧エントリーIDを入れて、後でSQL文で入れ替えようと、とりあえず考えていた。
無事に、インポートを完了して、エントリーIDの入れ替え作業に移る。とりあえず、現在のIDとbasenameに埋め込んだ、旧IDをSQL文で抽出する。
これを、phpMyAdminの機能で、CSVに出力します。このCSVファイルをExcelで読み込んで、SQL文を作成します。(dummy_idについては、後述の理由です。)
とりあえず、作業の前にmtのデータベースのバックアップを撮っておきます。そして、出来上がった、SQLを流す訳ですが、途中でエラーになってしまいました。エントリーIDは、プライマリーキーになっているので、変換途中でIDが重複してしまったものがあったようでした。データベースを元に戻して、ソート順を入れ替えたりして、何度か試しましたがうまくいかず。しょうがないので、一つ列を増やして現在のIDを保存して一時的にプライマリーキーとしておく事にしました。エントリーだけでなく、コメント、トラックバック、タグも同様の処理をしています。こんな感じのSQLを流しおきます。
これで、あらためてエントリーIDを置き換え用のSQLを流しました。無事に成功。
さらに、コメントやトラックバック、タグ、カテゴリーについてるエントリーIDも同様にExcelで作成して、SQL文を作成して流して終了です。
最後に、dummy_idを削除して終了です。
エントリーIDの置き換え作業は、これで終わりでしたが、その他もろもろ、htmlからの切り出しがちゃんとできていなかったところがあとで見つかったりと、余計な作業があったりしたんですが、なんとか限りなく元通りに復旧できました。
結局、復旧するのに一週間以上かかってしまいました。