本发明专利技术公开了一种Sqlite文件恢复自增主键值的方法及其系统。Sql ite文件恢复自增主键值的方法包括以下步骤:第一步,查找删除单元;根据SQLite删除数据恢复原理,找到已经被删除的删除单元的数据;第二步,定位到删除单元的前面或者后面的存在自增长主键的数据;在删除单元的前或后去查找含有自增长主键的单元数据;第三步,恢复删除数据的自增长键值。本发明专利技术根据数据的存储位置和上下文的关系,推断出删除数据的自增长主键值,由此使得SQLite文件在删除数据之后,能恢复自增长主键值。为SQLite文件的数据恢复提供了一种可行的方案。
【技术实现步骤摘要】
本专利技术涉及一种数据恢复方法,更具体地说是指Sqlite文件恢复自增主键值的方法及其系统。
技术介绍
SQLite是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它是嵌入式的和轻量级的sql数据库,广泛用于包括浏览器(支持html5的大部分浏览器,ie除外)、ios、android以及4E00些便携需求的小型web应用系统。自增主键:在用sqlite设计表时,每个表都有一个自己的整形id值作为主键,其实可以不指定这么一个id值,sqlite内部本来就会为每个表加上一个rowid,这个rowid可以当成一个隐含的字段使用,但是由sqlite引擎来维护的,在3.0以前rowid是32位的整数,3.0以后是64位的整数。Sqlite中,一个自增长字段定义为INTEGER PRIMARY KEY AUTOINCREMENT,那么在插入一个新数据时,只需要将这个字段的值指定为NULL,即可由引擎自动设定其值,引擎会设定为最大的rowid+1。当然,也可以设置为非NULL的数字来自己指定这个值,但这样就必须自己小心,不要引起冲突。当这个rowid的值大于所能表达的最大值9223372036854775807(3.0及以后版本的rowid最大值)后,rowid的新值会这个最大数之前随机找一个没被使用了的值。所以在rowid达到最大值前,rowid的值是严格单调增加的。INTEGER PRIMARY KEY AUTOINCREMENT自增长字段的算法与rowid稍微有些不同。第一,在达到最大值后,rowid会找已被删除的字段对应的rowid作为新值,而自增长字段则会丢出一个SQLITE_FULL的错误。第二,自增长字段在增加新值时,是找一个从没被使用过的rowid作为新值,而rowid则是找最大已存在的rowid+1。这里对应用的影响会比较大,尤其是一些对id值有依赖的元记录,只适合使用自增长字段而不能用rowid。如图1所示。SQLite数据存储:SQLite数据库文件由固定大小的“页(page)”组成。页的大小可以在512~32768之间(包含这两个值,必须是2的指数),默认大小为1024个字节(1KB)。页大小可以在数据库刚刚创建时设置,一旦创建了数据库对象之后,这个值就不能再改变了。页的类型可以是:Btree页、空闲(free)页或溢出(overflow)页。Btree又可以是B-tree或B+tree,每一种树的结点又区分为内部页和叶子页。一个数据库文件中可能没有空闲页或溢出页,但必然有Btree页。每个Btree页由四个部分构成:1.页头2.单元指针数组3.未分配空间4.单元内容区首先介绍“单元”的概念:Btree页内部以单元(cell)为单位来组织数据,一个单元包含一个(或部分,当使用溢出页时)payload(也称为Btree记录)。由于各类数据大小各不相同,每个单元的大小也就是可变的,所以Btree页内部的空间需要进行动态分配(程序内部动态分配,不是动态申请空间),单元是Btree页内部进行空间分配和回收的基本单位。页内所有单元的内容集中在页的底部,称为“单元内容区”,由下向上增长。由于单元的大小可变,因此需要对每个单元在页内的起始位置(称为单元指针)进行记录。单元指针保存在单元指针数组中,位于页头之后。单元指针数组包含0个或多个指针,由上向下增长。单元指针数组和单元内容区相向增长,中间部分为未分配空间。系统尽量保证未分配空间位于最后的指针之后,这样,就很容易增加新的单元,而不需要整理碎片。SQLite的单元被删除的时候,单元指针值会被删除,同时单元内容区的包含自增长主键的区域会被删除填零或是填充随机数,而单元中的数据不会被删除。图2A是一条已存在单元的截图,其中蓝色线条的区域时整个的单元内容,红色的框住的区域时自增长主键值。图2B是对应的删除的单元的数据,看明显看见自增长主键不存在了。
技术实现思路
本专利技术的目的在于克服现有技术的缺陷,提供Sqlite文件恢复自增主键值的方法及其系统。为实现上述目的,本专利技术采用以下技术方案:Sqlite文件恢复自增主键值的方法,该方法包括以下步骤:第一步,查找删除单元;根据SQLite删除数据恢复原理,找到已经被删除的删除单元的数据;第二步,定位到删除单元的前面或者后面的存在自增长主键的数据;在删除单元的前或后去查找含有自增长主键的单元数据;第三步,恢复删除数据的自增长键值。优选地,第三步:如果删除单元存储在紧邻能正确找回自增长主键值单元的高地址位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值减一;如果删除单元存储在紧邻能正确找回自增长主键值单元的低地址位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值加一。优选地,第三步:如果删除单元存储在高于能正确找回自增长主键值单元的N个单元位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值减N;如果删除单元存储在低于能正确找回自增长主键值单元的M个单元位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值加M。Sqlite文件恢复自增主键值的系统,包括:查找模块,用于查找删除单元;根据SQLite删除数据恢复原理,找到已经被删除的删除单元的数据;定位模块,用于定位到删除单元的前面或者后面的存在自增长主键的数据;在删除单元的前或后去查找含有自增长主键的单元数据;恢复模块,用于恢复删除数据的自增长键值。优选地,恢复模块工作时:如果删除单元存储在紧邻能正确找回自增长主键值单元的高地址位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值减一;如果删除单元存储在紧邻能正确找回自增长主键值单元的低地址位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值加一。优选地,恢复模块工作时:如果删除单元存储在高于能正确找回自增长主键值单元的N个单元位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值减N;如果删除单元存储在低于能正确找回自增长主键值单元的M个单元位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值加M。本专利技术与现有技术相比的有益效果是:本专利技术根据数据的存储位置和上下文的关系,推断出删除数据的自增长主键值,由此使得SQLite文件在删除数据之后,能恢复自增长主键值。为SQLite文件的数据恢复提供了一种可行的方案。下面结合附图和具体实施例对本专利技术作进一步描述。附图说明图1为现有技术中的SQLite文件的表格图;图2A为现有技术中的SQLite文件在删除前的数据截图;图2B为图2A所示数据中的第一行被删除的数据截图;图3为采用本专利技术处理的具体实施例的Sqlite文件的数据截图;图4为图3中的数据删除自增长字段为05的单元的示意图;图5为图3中的数据删除自增长字段为05和04的单元的示意图;图6为图3中的数据删除自增长字段为01的单元的示意图;图7为本专利技术Sqlite文件恢复自增主键值的系统的具体实施例方框结构图。具体实施方式为了更充分理解本专利技术的
技术实现思路
,下面结合具体实施例对本专利技术的技术方案进一步介绍和说明,但不局限于此。本专利技术Sqlite文本文档来自技高网...
【技术保护点】
Sqlite文件恢复自增主键值的方法,该方法包括以下步骤:第一步,查找删除单元;根据SQLite删除数据恢复原理,找到已经被删除的删除单元的数据;第二步,定位到删除单元的前面或者后面的存在自增长主键的数据;在删除单元的前或后去查找含有自增长主键的单元数据;第三步,恢复删除数据的自增长键值。
【技术特征摘要】
1.Sqlite文件恢复自增主键值的方法,该方法包括以下步骤:第一步,查找删除单元;根据SQLite删除数据恢复原理,找到已经被删除的删除单元的数据;第二步,定位到删除单元的前面或者后面的存在自增长主键的数据;在删除单元的前或后去查找含有自增长主键的单元数据;第三步,恢复删除数据的自增长键值。2.根据权利要求1所述的Sqlite文件恢复自增主键值的方法,其特征在于第三步:如果删除单元存储在紧邻能正确找回自增长主键值单元的高地址位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值减一;如果删除单元存储在紧邻能正确找回自增长主键值单元的低地址位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值加一。3.根据权利要求1所述的Sqlite文件恢复自增主键值的方法,其特征在于第三步:如果删除单元存储在高于能正确找回自增长主键值单元的N个单元位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值减N;如果删除单元存储在低于能正确找回自增长主键值单元的M个单元位置,那么删除单元的自增长主键值是能正确找回自增长主键值单元的键值加M。4.Sql...
【专利技术属性】
技术研发人员:李亮,
申请(专利权)人:深圳万兴信息科技股份有限公司,
类型:发明
国别省市:广东;44
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。