当Sqlite数据库损坏时会发生什么技术问题,如何检测?

3

我正在处理数据库损坏任务,因此我已经阅读了SQLite的如何破坏SQLite数据库和SO的如何验证数据库文件是否有效/一致

但我有更具体的问题,这可能也有助于他人。布尔答案可以接受。

  1. 如果sqlite数据库文件损坏了,我能打开它吗?有时还是总是?
  2. 如果答案1是肯定的并且我打开它,读/写操作会导致我的应用程序崩溃还是只会返回可以处理的错误?
  3. 如果发生损坏,我的后续(下一个)读/写操作是否会成功,还是每个读/写操作都会返回错误?
  4. 在成功创建和关闭数据库文件后,我是否可以使用md5sum来检测文件下次打开时的任何损坏,前提是我想避免quick_checkintegrity_check,因为它们速度较慢?

请在此上下文中定义“corruption”一词。是的,我知道这个词的传统含义,但我需要知道您在此问题的上下文中将哪些概念打包到该词中。 - Lasse V. Karlsen
1个回答

5
损坏数据的本质特点是,除非你运行彻底的验证过程,否则一切都不确定。任何事情都可能发生。猪会飞。谁知道呢。
您的问题答案如下:
1.有时候会。由于SQLite在打开数据库时不会验证整个数据库,因此它没有办法知道文件是否损坏,除非在打开时恰好读取到损坏的数据。
2.大多数情况下,崩溃操作会以你可以处理的方式崩溃。如果SQLite中存在可利用的漏洞,例如缓冲区溢出漏洞或类似漏洞,则一切都无法预料,但没有迹象表明存在这样的漏洞。
3.有些操作可以成功,有些操作可能失败,没有预先知道。
4.使用MD5无法检测SQLite数据库的损坏。首先,正确的MD5值应该是什么?唯一的方法是从文件中计算它,这也是您进行验证的方法。
总之,除非定期执行"pragma integrity_check;",否则无法保证SQLite如何处理损坏的数据库。
例如,如果损坏导致数据库看起来有效,但不再包含用户存储在其中的原始数据,那该怎么办?

1
谢谢。我懂了。但对于最后一个问题(4),如果我成功关闭了DB文件并且在关闭之前没有任何问题,如果文件在不活动状态下发生任何错误,md5sum将会改变,我可以说文件已经损坏。 - Naveen
是的,您说得对,但我个人更关注文件发生了什么以及如何预防发生这种情况,而不是检测数据损坏。为什么会害怕数据损坏呢? - Lasse V. Karlsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接