我有一个使用RTOS运行的嵌入式系统,并且正在使用C语言。
我正在使用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 :(得分:0)
似乎fsync()正在对sqlite数据库做一些事情。取出fsync()功能不会导致sqlite损坏。此外,我在下载时打开并读取数据库,同时编写了sqlite数据库。这两个因素或fsync()都导致文件系统损坏。我仍然需要找出一种更好的方法来执行fysnc(),但现在我确切地知道导致损坏的原因。