sqlite3
シェルプログラムを使用して少しテストを実行しました。
sqlite3 Pythonモジュールが同じように動作すると仮定すると、コミットされていないトランザクションを確実に回復する方法はないようです。
比較的少数のステートメントの場合、コミットされていないトランザクションは完全にアプリケーションメモリにのみ残り、ファイルシステムにデータは書き込まれません。DB接続が閉じられるか、アプリケーションが終了すると、これらの挿入は完全に失われます。
より大きなトランザクションブロックの場合、データはファイルシステムに書き込まれますが、DB接続が閉じられるか、(アプリケーションがクラッシュした場合は)DBを次に開いたときにクリーンアップされます。簡単に言うと、新しいDBページはコミットされていないトランザクションに割り当てられますが、トランザクションがコミットされていない場合は空き領域と見なされるためVACUUM
、DBサイズが小さくなります。これらのページは、DBファイルへの次の書き込み時に書き込まれます(およびそれらのデータは失われます)。それらがDBファイルの最後にある場合、ファイルはクリーンアップ時に切り捨てられるだけです。
後で他の書き込みトランザクションが実行されない限り、最後に実行されたコミットされていないトランザクションから一部のデータを回復できる場合があります。質問の言い回しからすると、DB全体が作成され、1回のプログラム実行と1回のトランザクションで埋められたように聞こえます(ただし、そのような大きなファイルは生成されません)。その場合、物事は少し簡単になる可能性があります。VACUUM
これは、不正なプログラムがどのように終了したかに大きく依存します。正常に終了することを許可した場合は、クリーンアップする時間があった可能性がありますが、この場合は望ましくありません。あなたはDBジャーナルを持っているので、私はそれがより暴力的な終わりを迎えたと思います。
いずれの場合も、少なくともsqlite3 DBファイル形式を詳しく調べ、ライブラリコードを変更して、コミットされていないデータを解析する必要があります。アプリケーションメモリに残っているトランザクションの部分は引き続き失われます。
DBファイルに空きページ(DELETE
ステートメントなど)があった場合、古いトランザクションのフラグメントも存在する可能性がありますが、それらのフラグメントの解釈は別の話です。
私の意見では、すべての関連する問題とともに、操作全体がコンピュータフォレンジックとデータリカバリの分野に近づきすぎます(完全に参入しない場合)。他の方法では取得できない本当に重要なデータがない限り、問題を起こすだけの簡単なものになるとは思えません。