こんにちは、個人でアプリを15本リリースしているYuKiOです。
個人開発をしていると、ユーザーから「データが消えた!」と問い合わせを受けることがあるかもしれません。通常、アプリではバックアップを取っていますが、先日、一部のユーザー環境で原因不明のトラブルによりバックアップが取得できず、さらにデータが欠損するという不具合に遭遇しました。
今回は、その状況から なんとかデータを復旧した方法 を共有します。SQLiteデータベースの破損を修復し、削除されたデータを可能な限り取り戻す方法を解説します。アプリは事前に不具合が出た特定のユーザーのみデータベースを引っこ抜けるようにしています。今回はそちらを送ってもらいました。使用環境はMacです。
1. 破損したデータの確認
最初に、データベースに freelist が含まれているかを確認します。これは、削除されたデータがまだディスク上に残っている可能性を示します。
DB Browser for SQLite の準備
SQLiteデータベースを視覚的に管理するために DB Browser for SQLite をダウンロード・インストールします。
DB Browser for SQLite
freelist の確認方法
DB Browser for SQLite で対象のデータベース (database.sqlite など) を開き、「実行」タブで以下の SQL を実行してください。
PRAGMA freelist_count;
結果が 0 ならば、削除されたデータはありません。
0 以外の値ならば、削除されたデータが復旧できる可能性があります。
2. 破損データを復旧する準備
sqlite3 の .recover コマンドを使用して、削除データを含む SQL スクリプトを出力します。
sqlite3 database.sqlite .recover > recovered_data.sql
database.sqlite は対象のデータベースファイル名に変更してください。
recovered_data.sql には復旧可能なデータが SQL 形式で出力されます。
3. 新しいデータベースを作成し、修復データを適用する
新しい sqlite データベースを作成し、修復データを適用します。
sqlite3 repaired_database.sqlite < recovered_data.sql
これにより、 repaired_database.sqlite に復旧データが反映されます。ここで、lost_and_found というテーブルが作成され、削除されたデータが含まれていることを確認できます。
4. 削除データの確認と整理
修復後の repaired_database.sqlite を DB Browser for SQLite で開き、lost_and_found テーブルを確認します。lost_and_found にはテーブルのレコードが混ざっているため、それらを適切なカテゴリごとに分け、CSVに保存します。
分離したCSVデータをPythonスクリプトなどで、再度SQLファイルに導入します。
Pythonスクリプトの詳細な実装は環境によって異なるため、ChatGPT に依頼してみてください。
5. 修復データを新しいデータベースへ取り込み
修復データを新しいデータベースへ統合します。分離したCSVデータからそれぞれのテーブルに挿入していきます。こちらもPythonスクリプトなどを使うと便利なので、ChatGPTに作成してもらってください。
6. 修復後のデータベースを暗号化して保存
メールなどで渡すことになるのでセキュリティのために、修復した データベースを、セキュリティのために暗号化 ZIP に保存します。こちらをアプリに戻して、データベースに戻すことで、復元できます。
zip -e repaired_database.zip repaired_database.sqlite
実行後に パスワード を入力します。
パスワードはアプリの内部ドキュメントに記載 しておくと安全です。
まとめ
以上の手順で、破損した SQLite データベースを修復し、削除データを復旧することができます。
🔍 おさらい
✅ freelist を確認し、削除データが残っているかチェック
✅ .recover で削除データを含む SQL を取得
✅ 新しいデータベースに復旧データを適用
✅ lost_and_found を CSV でエクスポートし、整理
✅ データを import_cleaned_data.py で統合
✅ 修復後のデータベースを暗号化 ZIP に保存
🚀 この記事が役に立ったら、ぜひシェアしてください!
Xでアプリ開発の発信をしています。
HackerMemoを大幅にアップデートしたので、
— YuKiO|アプリ個人開発|Flutter × Firebase (@oo_forward) January 10, 2021
海外向けのPVを作ってみました😆
夜なべして頑張って作ったので、拡散頂けたら泣いて喜びます😭🙏
音有りがオススメです!
元ネタわかる人いるかな〜🤔
アプリはこちら🔽
■iPhoneの方https://t.co/6T10L94Ld1
■Androidの方https://t.co/uBevCXrNw2 pic.twitter.com/wiGLv46kaG