最近、SQLserver7.0のバックアップデータが戻せないというトラブルが発生した。
経緯はこうだ。
- BSOD頻発。NTFSかHDDに由来する問題であることがエラーメッセージから読み取れた。
- RAID1環境のどちらのHDDでも発生する問題なので、復旧をあきらめ、データを退避する。HDDからmdfとldfファイルを抜く。同時にSQLserverが日々行っている、バックアップデータを抜いた。
- データ以外同一な環境からHDDをコピーし、バックアップファイルから復元を実行。しかし「致命的なエラー*1」によって復元が行えない。しかも十数本ある、すべてのDBが復元できない。
- mdfとldfをコピーして認識させるが、一部DBが破損している。これはNTFSかHDD破損という現象と符合する。
- 正しいデータはやはりバックアップデータしかないが、このファイルも破損しているのかもしれない。
といった状況であった。そもそもいまどきSQLserver7.0ってどうなのという「そもそも論」が発生しそうだが「今そこにある危機」に対しては、そもそも論なんて、その場ではなんの役にも立たない*2。
さてこのとき、どうやってトラブルを乗り越えたか。経緯はこうだ。
- 十数本のすべてのバックアップファイルが壊れているという偶然はありえない。
- よってバックアップファイルをDBに戻すプログラムに不具合があるか、復元手順に誤りがあることが推測される。
- SQLserver7.0としては最新バージョン。
- 復元手順は以前復元を行い成功した実績のある手順。
- 別環境で取得したバックアップデータを復元してみたが、それも復元できず。
以上のことから個人的に、
「バックアップ復元プログラムに日付系の不具合が潜在している。」
と推測した。
唯一神グーグルの神託によれば、SQLserver7.0で作成したバックアップファイルをSQLserver2000以上に対して戻すことが可能なようだ。よって、SQLserver2000環境でバックアップ復元を行ってみたが、やはり復元できず。まあ、SQLserver7.0と2000には大した違いはないはずなので、これは予想通り。SQLserver2005環境に対して復元を行ったところ、無事復旧できた。
ここまでくればこっちのもの。データをBCPツールでネイティブOUTし実環境にINしたところ無事データが復旧した。
バックアップの危険性という一つのケースを経験した。バックアップファイルは復元を行って初めて完全性が確認できるが、バックアップファイルを復元するのはトラブル時だけだ。
簡単に実行・復元が可能なDBバックアップというのはレイヤーが高く、高いがゆえにイレギュラーに弱い。
逆に手間がかかるデータ部分だけのバックアップはレイヤーが低い、低いがゆえにイレギュラーに強い。
理想は両方バックアップを実行しておくことだろう。
以上の経験から私が得た結論は、
- DBバックアップは2種類とれ。ひとつは完全なバックアップ。もうひとつはデータのみ。
- 保存しただけで壊れたデータは別バージョンで読み込みを試せ。