背景
我有一个数据库被破坏了,我想尽可能多地保存数据。
我曾尝试过用许多工具对数据进行sql转储,但都没有成功。始终相同的错误消息:
错误:数据库磁盘映像格式错误
我确信这确实是由于停电造成的。
方法
现在数据库实际上是一个文件。我在想是否可以这样对待它,并尽可能多地保存数据。
我猜当数据库被一个工具或程序打开时,它首先会检查它的头。在我的情况下,我会立即收到错误消息。我假设标头已损坏或未匹配。因此,没有任何工具会尝试读取有效载荷。
在文件中http://www.sqlite.org/fileformat2.html有关于报头偏移的解释。
问题:这是一种合理的方法吗?如果可以修复、修改或交换损坏数据库上的头。我该怎么做?
尽管SO上的多个线程中有多个回复,但SQLite数据库可以从损坏中恢复!
我在他们的常见问题解答中请求了SQLite团队的更新(http://www.sqlite.org/faq.html#q20),但与此同时,这里有几个选项。
常见问题解答状态:
- "…如果未使用SQLITE_SECURE_DELETE,并且VACUUM尚未运行,则某些删除的内容可能仍在数据库文件中标记为可重复使用的区域中。但是,我们所知道的没有任何过程或工具可以帮助您恢复该数据。"
和:
- "…根据数据库损坏的程度,您可以使用CLI将架构和内容转储到文件中,然后重新创建,从而恢复部分数据。不幸的是,一旦humpty dumpy从墙上掉下来,通常就不可能将其重新组合起来。"
事实上,至少有两种优秀的工具可以为整个SQLite数据库和单个记录进行数据恢复,它们可以在硬件故障、软件错误或人为问题的情况下提供帮助。它不会是100%原始的,但情况是不是无望的
PhotoRec是开源和多平台的。虽然历史上它用于映像和pdf,但现在它支持SQLite恢复(http://www.cgsecurity.org/wiki/File_Formats_Recovered_By_PhotoRec),以及220多种二进制文件类型。如果数据库(或整个目录)被删除,PhotoRec通常可以将数据库文件恢复到足够正常的状态,以便打开和导出。该应用程序的预编译版本可免费用于Windows、Mac和Linux。
此外,CCL Forensics的商业产品Epilog可以进行非常高级的记录恢复,包括从预写日志(WAL)事务文件中检索数据。这是几百美元,但它可以对SQLite数据(包括原生二进制数据库文件和原始磁盘图像)进行相当惊人的取证重建。
以上两项都多次保存了我的隐藏信息,因此将其传递给其他可能对已删除/损坏的SQLite数据库(以及流行用例的真正取证,如手机、浏览器、通讯录等)失去希望的人
一旦您重新生成/导出了数据,最好验证您的备份方案,并定期运行pragma integrity_check
,同时清除。
我已经要求更新官方常见问题解答,至少提到可以在谷歌上搜索"sqlite恢复"或其他什么,如果它被禁止提及其他项目/产品的名称。
干杯。