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

时间:2015-03-25 06:14:02

标签: database sqlite corruption

我正在处理数据库损坏的任务,因此我已经通过SQLite的How to corrupt an SQLite database和SO的How to verify if a database file is valid/consistent

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

  1. 如果sqlite数据库文件已损坏,我可以打开它吗?有时还是永远?
  2. 如果answer1为yes并且我打开它,可以读取/写入操作会使我的应用程序崩溃,还是只返回可以处理的错误?
  3. 如果发生了损坏,我的一些(下一个)读/写是否会成功,或者每次读/写都会返回错误?
  4. 在成功创建和关闭数据库文件后,我可以使用md5sum检测下一个文件打开中的任何损坏,前提是我要避免使用quick_checkintegrity_check慢?

1 个答案:

答案 0 :(得分:4)

损坏数据的本质是,除非您运行彻底的验证过程,否则所有投注均已关闭。任何事情都可能发生。猪可以飞。谁知道呢。

您的问题的答案:

  1. 有时,是的。由于SQLite在打开时没有验证整个数据库,因此除非在打开期间读取损坏的数据,否则无法知道该文件已损坏。
  2. 最有可能崩溃的操作会以您可以处理的方式崩溃。如果SQLite中存在可利用的错误,例如缓冲区溢出错误或类似错误,则所有投注都会关闭,但没有迹象表明存在这样的错误。
  3. 有些人可以工作,有些人可能会失败,事先无法知道。
  4. 您无法使用MD5检测到损坏的SQLite数据库。对于初学者来说,正确的MD5值应该是多少?要知道的唯一方法是从文件中计算它,这也是你要验证的。
  5. 简而言之,如果没有定期执行pragma integrity_check;,则无法保证SQLite如何处理损坏的数据库。

    作为一个例子,如果损坏发生使数据库看起来有效,除了它不再包含用户存储在其中的原始数据之外怎么办?