RTOSで動作する組み込みシステムを使用しており、C言語を使用しています。SqliteクエリレポートSQLITE_CORRUPT
私は、Sqliteを使用して、NAND上のファイルシステム上のファイル(sqlLiteFile.dbと呼ぶ)を維持しています。 Sqliteのバージョンは3.8.5です
私はこのファイルの新しいデータベースをシステムが起動するたびに作成していました。だから、それは揮発性のファイルでした。私は当時問題はなかった。
しかし、今ではsqlLiteFile.dbを永続化しました。したがって、システムを再起動するたびに、同じファイルが開き、書き込みが開始されます。これはしばらくの間うまく動作し、再起動はほとんど発生しません。しかし、しばらくすると、SqliteクエリはSQLITE_CORRUPTエラーの報告を開始します。しかし、sqliteへの書き込み操作は正常に動作しますが、これはエラーの報告を開始するクエリです。デバッガを使用して、書き込み操作が成功したことがわかります。また、ファイルシステム内のファイルのサイズは増加し続ける。
ファイルをダウンロードしてSqliteブラウザを使用すると、ファイルを開くことができません。他のツールを使用してsqlLiteFile.dbをsqlLiteFile.txtに変換すると、エラーが最下部に表示されます。/ **** ERROR:(11)データベースディスクイメージが不正です*****/
この破損を防ぐ方法に関する提案は役に立ちます。
編集: さらに、再起動する前にsqlite3_close()を使用してデータベースを閉じるクリーンなシャットダウンを試みました。今回はデータベースが再起動によってもう少し長く存続しましたが、最終的にもう一度壊れました。したがって、アプリケーションを終了する前にデータベースを閉じているように見えます。おそらくサイズ?
更新:システムが再起動(再開/ sqliteのデータベースを閉じる)が破損を引き起こすことはありませんが、データベースのサイズが一定量(〜55 KB)に達した後、それが起こる
シャットダウンする前に 'sqlite3_close()'を呼び出していますか? – swdev
私はそうではありません。ほとんどの場合、システム上の予期しないシャットダウンです。 – user353860
http://www.sqlite.org/howtocorrupt.htmlを参照してください。そのファイルシステムはfsync()を正しく実装していない可能性があります。 –