2017-04-26 48 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時,可以在底部看到一個錯誤:/ ****錯誤:(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(),但現在我確切地知道是什麼導致了腐敗。