首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sqlite查询报表SQLITE_CORRUPT

Sqlite查询报表SQLITE_CORRUPT
EN

Stack Overflow用户
提问于 2017-04-27 04:19:16
回答 1查看 551关注 0票数 0

我有一个运行RTOS的嵌入式系统,使用的是C语言。

我正在使用Sqlite在一个驻留在NAND上的文件系统上维护一个文件(让我们称之为sqlLiteFile.db)。Sqlite版本为3.8.5

早些时候,每次系统启动时,我都会为这个文件创建一个新数据库。所以,这是一个易失性文件。我当时没有任何问题。

但是,现在我将sqlLiteFile.db设置为持久化。因此,每次系统重新启动时,它都会打开相同的文件并开始写入。这在一段时间内工作得很好,并且很少重启。但是,过了一段时间,Sqlite查询开始报告SQLITE_CORRUPT错误。但是,对sqlite的写操作仍然可以正常工作,它是开始报告错误的查询。使用调试器,我可以看到写操作成功。此外,文件系统中的文件大小也在不断增加。

当我下载该文件并使用Sqlite浏览器时,我无法再打开该文件。当我使用其他工具将sqlLiteFile.db转换为sqlLiteFile.txt时,我可以在底部看到一个错误: /**** ERROR:(11)数据库磁盘映像格式错误*/

任何关于如何防止这种腐败的建议都将是有帮助的。

编辑:此外,我还尝试了干净的关闭,在重启之前使用sqlite3_close()关闭数据库。这一次,数据库通过重新启动存活了一段时间,但它最终再次遭到破坏。因此,它似乎不仅仅是在退出应用程序之前关闭数据库。可能是大小吧?

更新:系统重新启动(并重新打开/关闭sqlite数据库)不会导致损坏,但在数据库大小达到一定数量(~55KB)后会发生损坏

EN

回答 1

Stack Overflow用户

发布于 2017-05-31 02:08:55

看起来fsync()确实对sqlite数据库做了一些事情。去掉fsync()功能并不会导致sqlite损坏。另外,我在下载的时候打开和读取数据库,同时也在写sqlite数据库。这些因素或fsync()本身都会导致文件系统损坏。我仍然需要找出一种更好的方法来执行fysnc(),但现在我确切地知道是什么导致了损坏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43643800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档