web-dev-qa-db-ja.com

Sqliteデータベースの.db-shmおよび.db-wal拡張子は何ですか?

データベースを閉じて削除し、テストフィクスチャで置き換えるテストを実行した後、アプリケーションとそのデータベースファイルの状態で奇妙な動作が見られます。デバッグ用PCのツールでデータベースファイルを調べると、アプリケーション自体が報告しているようには見えません。この奇妙な動作は このバグ に関連している可能性があります。

データベースと同じベース名(通常の.db拡張子。ファイル拡張子は.db-shmおよび.db-wal、およびそれぞれが.dbファイルのタイムスタンプ。

これらはある種の一時ファイルだと思います。しかし、アプリケーションが終了した場合、それらを削除すべきではありませんか?さらに重要なことは、それらに格納されているデータはすべて.dbファイルがオペレーティングシステムによってアプリケーションが終了される前に。これは正しいです?

51
Jeff Axelrod

正しい、これらはSQLiteによって作成された一時ファイルです。メインデータベースを手動で削除する場合は、おそらくこれらも削除する必要があります。 WALを収集できるのは、トランザクションが失敗したときにSQLiteが変更をロールバックできるようにするロールバックジャーナルの代替です。 SQLiteがそれらをどのように使用し、なぜ長い間保持されているのかは、SQLiteの作成者次第ですが、一般にSQLiteは非常に堅実であるため、あまり心配しません。詳細については、こちらをご覧ください。

http://www.sqlite.org/fileformat2.html#walindexformat

これらのファイルは、SQLite 3.7の新しい機能です。それらの存在があなたが指摘するバグに関連するかどうかはわかりませんが、バグレポートはいずれにせよ回避策を示唆しています。

28
satur9nine

Satur9nineの答えにコメントを追加するだけの評判はまだないので、ここで積み上げていきます。

SQLite docs に従って、DB-SHMファイルは共有メモリファイルであり、SQLiteがWAL(先行書き込みログ)モードで実行されている場合にのみ存在します。これは、WALモードでは、同じdbファイルを共有するdb接続はすべて、競合を防ぐために、WALファイルのインデックスとして使用される同じメモリ位置を更新する必要があるためです。

上記で示唆したように、WALファイルに関しては、コミット/ロールバックの目的に役立つ書き込みログ/ジャーナルです。 DBが実行されていない場合、このファイルを削除しても問題ありません。実際、DBが存在する場合は、DBを再起動すると自動的に削除されます(DBがアクティブにデータを書き込み/コミットしている場合にのみ役立つため)。

4
Tiede