誤削除してしまったデータの救出(Linux ext4,RAID1パーティションから)

HDD Fire photo
Photo by Brooks Photography

バックアップのないmysqlのDBを(意図的に)dropし,後から必要なDBだったと分かって救出しようとした時の記録です.

サーバの構成

データの救出を試みたのは,Webサーバとして起動していたRAID1のUbuntu 10.04 LTS(ext4ファイルシステム).データの救出が必要だと判明した時点で既に時間が経っていたので,あまり望みはないことはわかっていましたが,やるだけやってみることに.

経過

HDDクローンの作成

まずはUbuntuを停止させました.Webサーバなのでできるだけ早く再開させる必要があったため,ディスクのクローンを作り,そのクローンからデータ救出を試みることにしました.

クローン作成に使ったのはフリーウェアのEaseus Disk Copy https://www.easeus.com/disk-copy/ .Windows機でEXEファイルをダウンロードし,ブータブルディスクを作成します.クローン用のHDDを接続して,作成したブータブルディスクから起動し,セクターごとのコピーをとります.これでHDDのクローンが完成です.

Windows機でのデータ救出

作成したHDDクローンはファイルシステムがext4なので,そのままではWindows機で読み込めません.そのため,「憩いの場」さんのこちらの記事

https://linux.ikoinoba.net/index.php?UID=1297182890

を参考にExt2Fsdを使って読み込めるようにします.

Ext2Fsdの詳しい使い方はこちら

https://ftlabo.sakura.ne.jp/win/ext2fsd/ext2fsd.html

にありました.(ディスクはRead only modeでマウント)

次に, photorec というオープンソースの復元ソフトを使って,ガリガリとデータを読み出します.photorecの詳しい使い方はGigazineさんに掲載されていました.

https://gigazine.net/news/20070720_photorec/

対象とするファイルをDBと*.MYIに限定して,500GのHDDで約6時間回しっぱなし.ファイル名は復元されず,また,領域の重複もあるようで300Gなんて巨大なファイルもみつかりました.で,目的のデータが入っているファイルを特定するため,すべてのファイル群をLinux機に転送し,grepにかけました.(Windowsでgrep的なことをすると経験上ロクなことがないので)

Linux機でのデータ救出

さらに,Linuxでのデータ救出も試みました.ext4でのデータ復元には,extundeleteというGPLのソフトウェアがあり,またも「憩いの場」さんのところに説明書きとUbuntu用のパッケージまで!(普通にソースコードからビルドも出来ました.最初はKnoppixのライブCDでトライしたのですが,ビルドまでの環境設定が面倒だったので,結局もう一台Ubuntuを作りました)

https://linux.ikoinoba.net/index.php?UID=1295979561

ということで,別のUbuntu機からクローンHDDを読み込もうとしたのですが,exundeleteは,read onlyでマウントしたHDDしか走査しない親切設計で,RAIDのパーティションはUSBで接続しただけではマウントすらできません.

なので,まずマウントポイントを /media/hoge とかに作成し,Ubuntuディスクユーティリティーを使って(fdiskでも良し)対象となるパーティションを確認して,

# sudo mount -r -t ext4 /dev/(clone HDD) /media/hoge

とファイルタイプにext4を指定し,リードオンリーでマウントします.

これでextundeleteで走査できるんですが,特定のファイルタイプを探すには recipe が必要です.インストール時に数種類のrecipeが既に用意されていますが,mysqlのデータベースファイルMYDは含まれていなかったので,既存のrecipeを参考に作成しました.recipeの作り方は man extundelete で確認できます.

で,復元したファイルをひたすらgrepすると.

結局,探していたデータは復元出来なかったのですが・・・ね・・・(涙)