1731164345
2024-11-09 14:41:00
SQLite はデフォルトではチェックサムを実行しません。私はこれをから学びました アレックス・ミラー。これはどういう意味ですか?ディスクが破損している場合、データベースまたはアプリケーションはデータベースが「破損している」ことを認識できません。
たった 1 ビットの反転でも大混乱を引き起こす可能性があります。これは、ディスクの障害、ディスク ドライバーのバグ、または別のアプリケーション (悪意のあるものであるかどうか) がデータベース ファイルを変更した場合に発生する可能性があります。
これはバグではありません。適切に文書化されています。
SQLite は、宇宙線、熱雑音、量子揺らぎ、デバイス ドライバーのバグ、またはその他のメカニズムによって引き起こされるビット エラーの検出および/または修正が、基盤となるハードウェアとオペレーティング システムの責任であると想定しています。 SQLite は、破損や I/O エラーを検出する目的でデータベース ファイルに冗長性を追加しません。 SQLite は、読み取ったデータが以前に書き込んだデータとまったく同じであると想定します。
私が作成したのは、 単純なスクリプト これを実証するには:
-
次を使用してサンプル データベースを作成します。 このスクリプト。銀行データベースを作成し、83,000 ドルのアリスの行を追加します。
-
1 ビットを反転します。
printf '\x00\x00\x00\x00\x00\x80' | dd of=bank.db bs=1 seek=$((0x1ffd)) count=1 conv=notrunc -
アリスの残高はゼロになりました。ごめんなさい、アリス。
通ります PRAGMA integrity_check あまりにも。 ASCII アニメーションがお好みの場合は、次のとおりです。
WAL とチェックサム
SQLite には WAL フレームのチェックサムがあります。ただし、破損したフレームを検出すると、そのフレームと後続のすべてのフレームを黙って無視します。エラーも発生しません。
フレームを無視することは許容できるかもしれませんが、エラーを発生させないことが私にとって問題です。
チェックサム VFS シム
使用できます チェックサム VFS シムただし、重要な注意点が 1 つあります。
チェックサムは、予約バイト値がちょうど 8 であるデータベースでのみ機能します。
の 予約バイトの文書化 説明します:
SQLite には、拡張機能で使用するために各ページの末尾に少数の追加バイトを確保する機能があります。これらの追加バイトは、たとえば SQLite 暗号化拡張機能によって、各ページに関連付けられたノンスや暗号化チェックサムを保存するために使用されます。オフセット 20 の 1 バイト整数の「予約スペース」サイズは、拡張用に予約される各ページの末尾のスペースのバイト数です。通常、この値は 0 です。値は奇数になる可能性があります。
これは、予約バイトを使用する拡張機能を使用している場合は、チェックサム シムを使用できないことを意味します。
繰り返しますが、これはバグではありません。ほとんどのデータベース (一部を除く) は、OS、ファイルシステム、ディスクが正常であることを前提としています。これが重要かどうかは、アプリケーションと必要な保証によって異なります。
#PSA #SQLite #はチェックサムを実行しません