2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

個人開発者なら知っておきたい!SQLiteデータ消失からの復旧術

Posted at

こんにちは、個人でアプリを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でアプリ開発の発信をしています。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?