SQLite3数据库恢复方法总结

最近做SQLite 3数据库的恢复,找了比较多相关方面的论文,在这里记录一下。

一、基于SQLite 文件系统的恢复

  上一篇文章中,记录了SQLite 3的文件结构,里面提到了一点数据库中记录单元删除前后的底层变化,但是不太详细。在这里详细讲一下。

  SQLite 3数据库的删除与PC的文件系统数据的删除有些类似,就是删除的过程中,原始数据是不会被删除的,它会存留在底层,直到新的数据存储时覆盖掉。另外,在删除的过程中,当删除的记录单元较多时,数据库会整合自由块,这样一个自由块就可能包含多个记录单元,当某个页的数据都被删除时,给页就会形成空闲页。总的来说,记录单元被删除后形成的自由块就可能有这几种情况:

  1、一个自由块包含一个记录单元的一部分(部分覆盖的情况)

  2、一个自由块包含一个完整的记录单元

  3、一个自由块包含多个完整的记录单元

另外,就是形成空闲页的情况。

  方法一

  基于SQLite 3数据库文件系统结构的恢复步骤通常是:

  准备阶段:读取数据库头,得到数据库的页大小和编码方式。

       读取系统表,得到要恢复目标表的根页。

       从根页开始,递归遍历所有的叶子页。

       遍历所有的叶子页,找到该表所有的自由块。

  判断阶段:针对上面提到的自由块情形2,判断阶段的目的就是确定是否一个自由块是一个完整的记录单元。判断的方法是:推算:n值+type区域的字节数+data区域的字节数是否和自由块记录的大小相同。(n的初始值为4,也就是两个字节的下一个自由块偏移和连个字节的本自由块大小,n最大为28)。当判断结果相同时,就进入下一个阶段,恢复数据。

  在这一阶段中,关键的地方是要分析清楚记录单元变成自由块前后,原始记录单元的type区域有没有被覆盖。在这个问题上,白晋国、孙红胜、胡泽明《一种基于SQLite3文件格式的删除数据恢复方法》一文中做了详细分析,他们说,n的值范围在3-6之间,因此删除前后type区域是否被覆盖的情况就分三种情况:

    1、单元大小+rowID+headersize=3个字节时,这种情况显示是数据库数据较少,这时n=4,type区域被覆盖一个字节,但是在追踪底层的时候,我发现,每个记录单元的type区域第一个字节的值始终为0x00,也就是对应的数据区域的长度为0,因此覆盖一个字节影响不大,但是计算type的字节数显示要从2开始。

    2、单元大小+rowID+headersize=4个字节时,这时n=4,type区域没有被覆盖,并且计算整个自由块的时候,正好可以领type从1开始

    3、第三种情况就是当数据库数据较多时,单元大小+rowID+headersize>4个字节时,这时n值就要大于4了,并且type区域同样没有被覆盖且从1开始

    关于上述三点,只是记录了结论,没有具体的分析原因,可以看一下那篇论文,就很清楚了。

  恢复阶段:恢复阶段要做的工作就是根据type区域的记录将data区域的每个元素进行编码,这一步比较麻烦的是type区域记录了后面相对应data域的长度和类型。

  这种方式只能是针对上述的第二种情况,恢复的结果不是很理想。我做的实验结果是:

        

  

  以上是几个表的恢复情况,可以看到,当表的记录量较小、删除数据较少的时候,恢复的情况还可以;但是当表的记录量增加、删除数据量较多时,符合第二种情况的自由块就没有那么多了,因此恢复的情况就不理想。

  鉴于上述情况,继续查阅SQLite恢复方面的论文,发现有一篇论文中提到了一种方法:相似类型匹配估算方法

  方法二 相似类型匹配估算方法

  这种方法本质上也是基于SQLite数据库的文件结构,准备阶段和方法一一样,也是要遍历所有的叶子页,以便找到所有的自由块,除此之外还需要得到正常的记录单元的type区域类型。但是在判断阶段,不再是针对一个单一的自由块,而是和存在的记录单元进行比较,从这里我们也能明白该方法名字的来源:比较自由块的type类型和记录单元的type类型是否相似。

  判断阶段:从自由块第n个字节开始(n值在方法一种也做了讨论),相似类型匹配成功?恢复阶段:n++;在一个自由块恢复完成后,针对自由块的第三中情况,要判断自由块是否结束?存储恢复信息:继续相似类型匹配。

  恢复阶段和方法一类型,就不在赘述。

  这种方法是陈飞在他的论文《智能移动终端应用数据取证技术研究》中提出来的。后面我将尝试以这种方法恢复自由块,想来应该比方法一好很多。

时间: 2024-10-01 03:23:47

SQLite3数据库恢复方法总结的相关文章

【转】SQLServer 2008以上误操作数据库恢复方法——日志尾部备份

4号,公司的生产数据表被全部删除,目前没有找到原因,由于刚接触SQL不久,所以短时间内不会还原,也不敢动被原服务器,于是就将原服务器停掉,拷贝出里面的PPD数据库文件,留作备份:近几天在自己的电脑上尝试修复,一直没有成功,细读了一下<SQL2005技术内幕——存储引擎>了解到删除列.删除表这些操作不会直接对每一行数据进行操作,而是直接改变他们的物理指向地址的ID,专业术语我也不是很清楚,我的理解是这样的,有时间再弄清楚,不过这足以让我明白被删除的表还是存在mdf文件中,其改变的便宜地址记录在日

SQLServer 2008以上误操作数据库恢复方法——日志尾部备份

问题: 经常看到有人误删数据,或者误操作,特别是update和delete的时候没有加where,然后就喊爹喊娘了.人非圣贤孰能无过,做错可以理解,但不能纵容,这个以后再说,现在先来解决问题. 遇到这种情况,一般都是没有做备份,不然也不会来发问了.首先要冷静,否则会有更大的灾难.直到你放弃. 解决方法: 对于这类问题,主要是找回误操作之前的数据,在2008之前,有个很出名的工具Log Exploer,听说还挺好用的,这个网上大把教程,这里就不多说了.但是唯一遗憾的是,不支持2008及更高版本,这

Xcode7.2使用sqlite3数据库的方法

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 之前版本的Xcode是可以直接连接sqlite3的库文件的,但是Xcode7.2中虽然有sqlite3.tbd文件,但是在编译连接时会报错无法找到该文件. 如果要在Xcode7.2中使用sqlite数据库,我们可以手动添加sqlite3的库文件,具体做法如下: 选择项目目标的Build Phases栏: 点击+按钮,在弹出的窗口中点击Add Other-按钮

数据库 - 恢复策略与数据库镜像

登记日志文件 基本原则 登记的次序严格按并行事务执行的时间次序 必须先写日志文件,后写数据库 写日志文件操作:把表示这个修改的日志记录 写到日志文件 写数据库操作:把对数据的修改写到数据库中 为什么要先写日志文件 (The Write-Ahead Log) 写数据库和写日志文件是两个不同的操作 在这两个操作之间可能发生故障 如果先写了数据库修改,而在日志文件中没有登记下这个修改,则以后就无法恢复这个修改了 如果先写日志,但没有修改数据库,按日志文件恢复时只不过是多执行一次不必要的UNDO操作,并

Oracle数据库常见的误操作恢复方法(上)

实验环境:Linux6.4 + Oracle 11g 面向读者:Oracle开发维护人员 本文以Oracle自带的scott用户进行演示: 首先逻辑备份导出scott的对象数据 $ exp scott/tiger file='/u01/app/backup/scott.dmp' log='/u01/app/backup/scott.log' owner=scott; 1.误操作drop了emp表 利用表级闪回恢复,只要回收站中有就可以恢复. SQL> drop table emp; Table

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 工具 方法

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 硬盘误格式化.重分区.重装操作系统覆盖 SQL数据解决方法 [客户名称]:贵州铜仁市开天驾驶人培训中心 [软件名称]:用友T3普及版 [数据库版本]:MS SQL server 2000  [数据库大小]:1GB X 6  (3个账套 总共6个年度). [问题描述]:由于服务器中毒或卡顿,客户将服务器电脑送到 装机店 重做操作系统.未详细告知电脑用途,导致整个硬盘被维修店技术员 全盘格式化重新分区,并且重新做好了新的操作系统,

数据库学习之(8)数据库恢复的实现--各种数据转储方法

数据转储:是数据库恢复中采用的基本技术.所谓转储即DBA 定期地将数据库复制到磁带或另一个磁盘上保存起来的过程.当数据库遭到破坏后可以将后备副本重新装入,将数据库恢复到转储时的状态. 静态转储:在系统中无运行事务时进行的转储操作.静态转储简单,但必须等待正运行的用户事务结束才能进行.同样,新的事务必须等待转储结束才能执行.这会降低数据库的可用性. 动态转储:指转储期间允许对数据库进行存取或修改.动态转储可克服静态转储的缺点,它不用等待正在运行的用户事务结束,也不会影响新事务的运行.但是,转储结束

Mssql企业实战之数据库恢复

数据库完整还原的目的是还原整个数据库. 整个数据库在还原期间处于脱机状态.在数据库的任何部分变为联机之前,必须将所有数据恢复到同一点,即数据库的所有部分都处于同一时间点并且不存在未提交的事务. 在完整恢复模式下,数据库可以还原到特定时间点.时间点可以是最新的可用备份.特定的日期和时间或者标记的事务. 还原完整数据库步骤 通常,将数据库恢复到故障点分为以下几个步骤: 1. 备份活动事务日志(称为尾部日志).此操作将创建结尾日志备份.如果活动日志不可用,则该日志部分的所有事务将全部丢失. 注:在完整

Cocos移植到Android的一些问题-SQLite3数据库移植问题

首选我们讨论一下SQLite3数据库移植问题.我们在第14章节介绍了在Win32平台使用SQLite3数据库,我们介绍了两种配置环境的方法:一种是使用Cocos2d-x提供的SQLite3库配置,另一种是从SQLite官网下载源代码拷贝的工程中.第一种方法配置起来比较麻烦,关键是Cocos2d-x提供的SQLite3库只是Win32没有其它平台的,目录结构如下所示.<游戏工程目录>\cocos2d\external\sqlite3│  Android.mk│├─include│      sq