2009-09-21 53 views
8

データベースファイルを開き、sqlite3のopen()メソッドを使用してデータベース接続を取得し、プログラムが終了するまで接続が閉じられません。コンピュータの突然の電源切断やOSクラッシュなどの予期しないエラーが発生した場合、データベースファイルのモードが破損するか、ハンドルが失われますか?具体的には、コンピュータを再起動しても書き込み可能な状態にできますか?ところで、私はエラーが発生したときにデータの損失については気にしません。突然電源オフやOSクラッシュ時にSQLite3のデータベースファイルが破損しますか?

ありがとうございました!

答えて

12

SQLiteはこれを防ぐために特にです。公式SQLite is Transactionalページから:

SQLiteの中の単一 のトランザクション内のすべての変更のいずれか ディスクへの変更の書き込みが 行為が

によって中断されていても、全く完全かどうか を発生
  • プログラムがクラッシュし、
  • オペレーティングシステムのクラッシュ、または
  • 停電。

前項の請求が広く オペレーティングシステムのクラッシュや電源 障害のデータベースファイルへの 影響をシミュレートする特殊な テストハーネスを使用してSQLiteの 回帰テストスイートでチェック あります。

上記のようなクラッシュからの保護方法の詳細については、SQLiteの記事Atomic Commit in SQLiteを参照してください。クラッシュ後に書き込みに関して


:( File Locking and Concurrencyから)

プロセスは、データベースの更新の途中で、プログラムまたはオペレーティングシステムのクラッシュ又は停電を防止するときにホットジャーナルが作成され完了から更新。ホットジャーナルは例外条件です。クラッシュや停電から回復するためにホットジャーナルが存在します。すべてが正しく動作している場合(つまり、クラッシュや停電がない場合)、ホットジャーナルを取得することはありません。

最悪の場合、クラッシュ後に残っているホットジャーナルを削除する必要があります。

+0

ありがとうございます! また、データベースに書き込まれている変更がある間に停電が発生した場合、データベースファイル(* .db)が書き込み可能なままであるかどうかを知りたいと思います。 – quantity

+0

@quantityロックはOSレベルで行われるため、突然の障害や再起動後にfschkコードがそれをクリアし、ファイルに再びアクセスできるようにします。ロックは、ファイルの属性を変更することによって行われません。また、この記事の記事の参考文献から、「ホットジャーナル」はDBファイルにアクセスするときに自動的に処理されることが明らかです。 – Ber

+0

ホットジャーナルファイルを削除しないでください。公式のドキュメント:[SQLiteデータベースファイルを破壊する方法](http://www.sqlite.org/howtocorrupt.html)、1.3節を参照してください。 –

1

突然の電源切断時に何かが起こる可能性があります。しかし、私はどんなリスクを軽減するためにUPSを提案します。

+0

宇宙線のために何かが起こることがありますが、実際には、予想可能なファイルシステムの電源が突然失われた場合、sqlite3データベースは一般的に一貫性があります。 – Arelius

4

SqliteはACIDに準拠しているため、電源を切っても問題にはなりません。

http://en.wikipedia.org/wiki/ACID

+0

私は電源オフがファイルのプロパティに影響を及ぼし、それがまったく開かれない、あるいはデータを書き込めないことを恐れています。 – quantity

+0

@quantity、なぜあなたはそれを恐れていますか?ジャーナルファイルを削除しない限り、sqlite3は突然電源が切れた場合にデータベースを修復できるはずです。 – Arelius

関連する問題