【问题标题】:Repairing a corrupted sqlite database retrieved from disk data recovery修复从磁盘数据恢复中检索到的损坏的 sqlite 数据库
【发布时间】:2013-01-16 18:50:00
【问题描述】:

所以我使用 testdisk 从格式化磁盘中提取了一个 sqlite 数据库。我有这个文件,但它中间有一堆奇怪的东西,看起来像是来自某物的一些日志。关键是它被严重损坏了。

虽然我确实有早期版本的 sqlite 文件....

该文件的早期版本包含另一个文件中包含奇怪内容的所有数据。损坏的文件具有的较新条目与未损坏的文件似乎没有关系。

我尝试使用各种 echo .dump 方法修复损坏的文件,但我得到一个空文件。

Baxters-MacBook-Pro:desktop bax$ sqlite3 corrupted.sqlite3
SQLite version 3.7.13 2012-06-11 02:05:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> pragma integrity_check;
Error: database disk image is malformed

倾销给了我:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
/****** CORRUPTION ERROR *******/
/****** database disk image is malformed ******/
/****** ERROR: database disk image is malformed ******/
/****** CORRUPTION ERROR *******/
/****** database disk image is malformed ******/
/****** ERROR: database disk image is malformed ******/
/**** ERROR: (11) database disk image is malformed *****/
ROLLBACK; -- due to errors

我尝试在 HEX 中愚蠢地加入他们。我将旧(未损坏的数据库)的内容粘贴到损坏文件中的重叠信息上。也就是说,未损坏文件中的最后一位数据是时间戳,15:15:14.419734(数据库来自旧的 rails 应用程序)。我在损坏的文件中发现了这一点,并将未损坏的文件十六进制粘贴到损坏文件中该点之前的所有内容上。所以现在它打开了,但毫不奇怪,我只能从未损坏的文件中获取数据(大约 160 个条目中的 122 个)。

这两个连接看起来像这样:

15:15:14.419734√Ö√£)    �√ÖYAA{1B, 8B

1B, 8B 是条目的开头。

十六进制:

31353A 31353A31 342E3431 39373334 C3851FC3 A3290900 
01C38501 59014141 7B31422C 203842

有什么办法可以让我加入这两个数据库吗,还是我被坑了?

【问题讨论】:

    标签: sqlite hex corrupt-data


    【解决方案1】:

    在 SQLite 文件中,表数据存储在 b-trees 中;您的连接文件很可能在较高的树级别中不包含正确的指针。

    常见问题解答says:

    根据您的数据库损坏的严重程度,您可以通过使用 CLI 将架构和内容转储到文件然后重新创建来恢复部分数据。不幸的是,一旦矮胖子从墙上掉下来,一般不可能再把他放回去了。

    但你也可以

    • 阅读file format documentation 并尝试手动或使用一些临时工具从文件中提取尽可能多的数据;或
    • 支付 somebody 为您完成这项工作。

    【讨论】:

    • 感谢您的回复!我之前查看了文件格式文档,但无法对其进行正面或反面(没有十六进制编辑的经验)。看起来对我来说回忆数据会便宜很多。所以这就是我要做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2018-06-07
    相关资源
    最近更新 更多