2017-04-26 3 views
0

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)に達した後、それが起こる

+0

シャットダウンする前に 'sqlite3_close()'を呼び出していますか? – swdev

+0

私はそうではありません。ほとんどの場合、システム上の予期しないシャットダウンです。 – user353860

+0

http://www.sqlite.org/howtocorrupt.htmlを参照してください。そのファイルシステムはfsync()を正しく実装していない可能性があります。 –

答えて

0

は思えませんでしたそのfsync()はsqliteデータベースに対して何かをしていました。 fsync()機能を使用しても、sqliteの破損は発生しませんでした。また、ダウンロード中にデータベースを開いて読んでいたのと同時に、sqliteデータベースが作成されました。これらの要因またはfsync()だけでも、ファイルシステムが破損していました。私はまだfysnc()を実行するためのよりよい方法を見つけ出す必要がありますが、今は何が破壊を引き起こしているか正確に知っています。