2015-03-25 15 views
1

我正在做一个处理数据库损坏的任务,所以我已经通过SQLite的How to corrupt an SQLite database和SO的How to verify if a database file is valid/consistent当Sqlite数据库损坏以及如何检测时,技术上会发生什么?

但我有更具体的问题,这可能也会帮助其他人。布尔回答是好的

  1. 如果sqlite数据库文件损坏,我能打开它吗?有时或永远?
  2. 如果答案1是肯定的,我打开它,可以读/写操作崩溃我的应用程序或只会返回错误,可以处理?
  3. 如果腐败发生,我的一些下一个(下一个)读取/写入是否成功,或者每个读取/写入都会返回错误?
  4. 成功创建并关闭数据库文件后,如果我想避免quick_checkintegrity_check,因为它们较慢,我可以使用md5sum来检测下一次打开文件时是否有损坏?
+0

请在此上下文中定义“腐败”一词。是的,我确实知道这个词的传统含义,但我需要知道在这个问题的背景下,你将哪些概念包含到单词中。 – 2015-03-25 07:42:36

回答

3

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

问题的答案:

  1. 有时,是的。由于SQLite在打开时没有验证整个数据库,因此无法知道文件已损坏,除非在打开过程中偶然读取损坏的数据。
  2. 最可能的崩溃操作将以您可以处理的方式崩溃。如果SQLite中有可利用的错误,比如缓冲区溢出错误或类似错误,那么所有投注都关闭,但没有迹象表明存在这种情况。
  3. 有些可以工作,有些可能会失败,事先没有办法知道。
  4. 您无法使用MD5检测损坏的SQLite数据库。对于初学者来说,正确的MD5值应该是什么?要知道的唯一方法是从文件中计算出来,这也是你要做的事情。

简而言之,定期执行pragma integrity_check;的短缺,您不能保证SQLite如何处理损坏的数据库。

作为一个例子,如果腐败使数据库看起来有效,除了它不再包含用户存储在其中的原始数据?

+1

谢谢。得到它了。但对于最后一个问题(4),如果我成功关闭了数据库文件,并且知道直到关闭为止没有问题,如果在文件处于休眠状态时发生任何错误,“md5sum”将会改变,我可以说腐败发生了。 – 2015-03-25 08:04:36

+0

是的,你是对的,但我个人更关注文件发生了什么,以及如何防止,而不是发现腐败。为什么这种数据腐败的恐惧? – 2015-03-25 08:05:43

相关问题