Sqlite文件恢復自增主鍵值的方法及其系統(tǒng)的制作方法
【專利摘要】本發(fā)明公開了一種Sqlite文件恢復自增主鍵值的方法及其系統(tǒng)。Sql ite文件恢復自增主鍵值的方法包括以下步驟:第一步,查找刪除單元;根據(jù)SQLite刪除數(shù)據(jù)恢復原理,找到已經(jīng)被刪除的刪除單元的數(shù)據(jù);第二步,定位到刪除單元的前面或者后面的存在自增長主鍵的數(shù)據(jù);在刪除單元的前或后去查找含有自增長主鍵的單元數(shù)據(jù);第三步,恢復刪除數(shù)據(jù)的自增長鍵值。本發(fā)明根據(jù)數(shù)據(jù)的存儲位置和上下文的關系,推斷出刪除數(shù)據(jù)的自增長主鍵值,由此使得SQLite文件在刪除數(shù)據(jù)之后,能恢復自增長主鍵值。為SQLite文件的數(shù)據(jù)恢復提供了一種可行的方案。
【專利說明】
Sq I i te文件恢復自増主鍵值的方法及其系統(tǒng)
技術領域
[0001] 本發(fā)明設及一種數(shù)據(jù)恢復方法,更具體地說是指Sqlite文件恢復自增主鍵值的 方法及其系統(tǒng)。
【背景技術】
[0002] SQLite是遵守ACID的關系型數(shù)據(jù)庫管理系統(tǒng),它包含在一個相對小的C庫中。它 是化化char地ipp建立的公有領域項目。它是嵌入式的和輕量級的sql數(shù)據(jù)庫,廣泛用于 包括瀏覽器(支持html5的大部分瀏覽器,ie除外)、ios、amlroid W及4E00些便攜需求 的小型web應用系統(tǒng)。
[0003] 自增主鍵:在用sqlite設計表時,每個表都有一個自己的整形id值作為主鍵,其 實可W不指定運么一個id值,sqlite內(nèi)部本來就會為每個表加上一個rowid,運個rowid 可W當成一個隱含的字段使用,但是由sqlite引擎來維護的,在3.0 W前rowid是32位的 整數(shù),3.0 W后是64位的整數(shù)。
[0004] Sqlite 中,一個自增長字段定義為 INTEGER PRIMARY KEY AUT0INCREMENT,那 么在插入一個新數(shù)據(jù)時,只需要將運個字段的值指定為NU化,即可由引擎自動設定其 值,引擎會設定為最大的rowid+1。當然,也可W設置為非NU化的數(shù)字來自己指定運個 值,但運樣就必須自己小屯、,不要引起沖突。當運個rowid的值大于所能表達的最大值 9223372036854775807 (3. 0及W后版本的rowid最大值)后,rowid的新值會運個最大數(shù)之 前隨機找一個沒被使用了的值。所W在rowid達到最大值前,rowid的值是嚴格單調(diào)增加 的。 陽005] INTEGER PRIMARY KEY AUT0INCREMENT自增長字段的算法與rowid稍微有些不同。
[0006] 第一,在達到最大值后,rowid會找已被刪除的字段對應的rowid作為新值,而自 增長字段則會丟出一個SQLITE_即化的錯誤。
[0007] 第二,自增長字段在增加新值時,是找一個從沒被使用過的rowid作為新值,而 rowid則是找最大已存在的rowid+l。運里對應用的影響會比較大,尤其是一些對id值有 依賴的元記錄,只適合使用自增長字段而不能用rowid。如圖1所示。
[0008] SQLite數(shù)據(jù)存儲:S化ite數(shù)據(jù)庫文件由固定大小的"頁(page)"組成。頁的大 小可W在512~32768之間(包含運兩個值,必須是2的指數(shù)),默認大小為1024個字節(jié) ακΒ)。頁大小可W在數(shù)據(jù)庫剛剛創(chuàng)建時設置,一旦創(chuàng)建了數(shù)據(jù)庫對象之后,運個值就不能 再改變了。
[0009] 頁的類型可W是:Btree頁、空閑(free)頁或溢出(ove;rflow)頁。Btree又可W 是B-tree或B+tree,每一種樹的結點又區(qū)分為內(nèi)部頁和葉子頁。一個數(shù)據(jù)庫文件中可能沒 有空閑頁或溢出頁,但必然有化ree頁。
[0010] 每個化ree頁由四個部分構成:
[0011]
[0012] 首先介紹"單元"的概念:Btree頁內(nèi)部W單元(cell)為單位來組織數(shù)據(jù),一個單 元包含一個(或部分,當使用溢出頁時)payload (也稱為化ree記錄)。由于各類數(shù)據(jù)大小 各不相同,每個單元的大小也就是可變的,所WBtree頁內(nèi)部的空間需要進行動態(tài)分配(程 序內(nèi)部動態(tài)分配,不是動態(tài)申請空間),單元是化ree頁內(nèi)部進行空間分配和回收的基本單 位。
[001引頁內(nèi)所有單元的內(nèi)容集中在頁的底部,稱為"單元內(nèi)容區(qū)",由下向上增長。由于單 元的大小可變,因此需要對每個單元在頁內(nèi)的起始位置(稱為單元指針)進行記錄。單元 指針保存在單元指針數(shù)組中,位于頁頭之后。單元指針數(shù)組包含0個或多個指針,由上向下 增長。
[0014] 單元指針數(shù)組和單元內(nèi)容區(qū)相向增長,中間部分為未分配空間。系統(tǒng)盡量保證未 分配空間位于最后的指針之后,運樣,就很容易增加新的單元,而不需要整理碎片。
[0015] SQLite的單元被刪除的時候,單元指針值會被刪除,同時單元內(nèi)容區(qū)的包含自增 長主鍵的區(qū)域會被刪除填零或是填充隨機數(shù),而單元中的數(shù)據(jù)不會被刪除。
[0016] 圖2A是一條已存在單元的截圖,其中藍色線條的區(qū)域時整個的單元內(nèi)容,紅色的 框住的區(qū)域時自增長主鍵值。
[0017] 圖2B是對應的刪除的單元的數(shù)據(jù),看明顯看見自增長主鍵不存在了。
【發(fā)明內(nèi)容】
[0018] 本發(fā)明的目的在于克服現(xiàn)有技術的缺陷,提供Sqlite文件恢復自增主鍵值的方 法及其系統(tǒng)。
[0019] 為實現(xiàn)上述目的,本發(fā)明采用W下技術方案:
[0020] Sqlite文件恢復自增主鍵值的方法,該方法包括W下步驟:
[0021] 第一步,查找刪除單元;根據(jù)SQLite刪除數(shù)據(jù)恢復原理,找到已經(jīng)被刪除的刪除 單元的數(shù)據(jù);
[0022] 第二步,定位到刪除單元的前面或者后面的存在自增長主鍵的數(shù)據(jù);
[0023] 在刪除單元的前或后去查找含有自增長主鍵的單元數(shù)據(jù);
[0024] 第Ξ步,恢復刪除數(shù)據(jù)的自增長鍵值。
[00巧]優(yōu)選地,第Ξ步:如果刪除單元存儲在緊鄰能正確找回自增長主鍵值單元的高地 址位置,那么刪除單元的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值減一;如果 刪除單元存儲在緊鄰能正確找回自增長主鍵值單元的低地址位置,那么刪除單元的自增長 主鍵值是能正確找回自增長主鍵值單元的鍵值加一。
[00%] 優(yōu)選地,第Ξ步:如果刪除單元存儲在高于能正確找回自增長主鍵值單元的N個 單元位置,那么刪除單元的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值減N;如 果刪除單元存儲在低于能正確找回自增長主鍵值單元的Μ個單元位置,那么刪除單元的自 增長主鍵值是能正確找回自增長主鍵值單元的鍵值加 Μ。
[0027] Sqlite文件恢復自增主鍵值的系統(tǒng),包括:
[0028] 查找模塊,用于查找刪除單元;根據(jù)SQLite刪除數(shù)據(jù)恢復原理,找到已經(jīng)被刪除 的刪除單元的數(shù)據(jù);
[0029] 定位模塊,用于定位到刪除單元的前面或者后面的存在自增長主鍵的數(shù)據(jù);
[0030] 在刪除單元的前或后去查找含有自增長主鍵的單元數(shù)據(jù);
[0031] 恢復模塊,用于恢復刪除數(shù)據(jù)的自增長鍵值。
[0032] 優(yōu)選地,恢復模塊工作時:如果刪除單元存儲在緊鄰能正確找回自增長主鍵值單 元的高地址位置,那么刪除單元的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值減 一;如果刪除單元存儲在緊鄰能正確找回自增長主鍵值單元的低地址位置,那么刪除單元 的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值加一。
[0033] 優(yōu)選地,恢復模塊工作時:如果刪除單元存儲在高于能正確找回自增長主鍵值單 元的N個單元位置,那么刪除單元的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值 減N ;如果刪除單元存儲在低于能正確找回自增長主鍵值單元的Μ個單元位置,那么刪除單 元的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值加 Μ。
[0034] 本發(fā)明與現(xiàn)有技術相比的有益效果是:本發(fā)明根據(jù)數(shù)據(jù)的存儲位置和上下文的關 系,推斷出刪除數(shù)據(jù)的自增長主鍵值,由此使得SQLite文件在刪除數(shù)據(jù)之后,能恢復自增 長主鍵值。為SQLite文件的數(shù)據(jù)恢復提供了一種可行的方案。
[0035] 下面結合附圖和具體實施例對本發(fā)明作進一步描述。
【附圖說明】
[0036] 圖1為現(xiàn)有技術中的SQLite文件的表格圖;
[0037] 圖2A為現(xiàn)有技術中的SQLite文件在刪除前的數(shù)據(jù)截圖;
[003引圖2B為圖2A所示數(shù)據(jù)中的第一行被刪除的數(shù)據(jù)截圖;
[0039] 圖3為采用本發(fā)明處理的具體實施例的Sqlite文件的數(shù)據(jù)截圖;
[0040] 圖4為圖3中的數(shù)據(jù)刪除自增長字段為05的單元的示意圖;
[0041] 圖5為圖3中的數(shù)據(jù)刪除自增長字段為05和04的單元的示意圖;
[0042] 圖6為圖3中的數(shù)據(jù)刪除自增長字段為01的單元的示意圖;
[0043] 圖7為本發(fā)明Sqlite文件恢復自增主鍵值的系統(tǒng)的具體實施例方框結構圖。
【具體實施方式】
[0044] 為了更充分理解本發(fā)明的技術內(nèi)容,下面結合具體實施例對本發(fā)明的技術方案進 一步介紹和說明,但不局限于此。
[0045] 本發(fā)明Sqlite文件恢復自增主鍵值的方法,該方法包括W下步驟:
[0046] 第一步,查找刪除單元;根據(jù)SQLite刪除數(shù)據(jù)恢復原理,找到已經(jīng)被刪除的刪除 單元的數(shù)據(jù);
[0047] 第二步,定位到刪除單元的前面或者后面的存在自增長主鍵的數(shù)據(jù);
[0048] 在刪除單元的前或后去查找含有自增長主鍵的單元數(shù)據(jù); W例第立步,恢復刪除數(shù)據(jù)的自增長鍵值。
[0050] 第Ξ步:如果刪除單元存儲在緊鄰能正確找回自增長主鍵值單元的高地址位置, 那么刪除單元的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值減一;如果刪除單元 存儲在緊鄰能正確找回自增長主鍵值單元的低地址位置,那么刪除單元的自增長主鍵值是 能正確找回自增長主鍵值單元的鍵值加一?;蛘?,如果刪除單元存儲在高于能正確找回自 增長主鍵值單元的N個單元位置,那么刪除單元的自增長主鍵值是能正確找回自增長主鍵 值單元的鍵值減N ;如果刪除單元存儲在低于能正確找回自增長主鍵值單元的Μ個單元位 置,那么刪除單元的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值加 Μ。
[0051] 如圖3-6所示的實施例。
[0052] 圖3為采用本發(fā)明處理的具體實施例的Sqlite文件的數(shù)據(jù)截圖;
[0053] 圖4為圖3中的數(shù)據(jù)刪除自增長字段為05的單元的示意圖;如圖所示,自增長字 段為05的單位被刪除后,單元頭包含自增長字段的位置已經(jīng)被修改了,不能找到刪除前的 自增長字段值。運時候可W定位到自增長字段為04的單元,此單元的存儲位置和刪除的單 元是緊鄰的,同時被刪除的單元處在04單元的低地址位置,根據(jù)恢復原理,在被刪除單元 的自增長字段為4+1 = 5。
[0054] 圖5為圖3中的數(shù)據(jù)刪除自增長字段為05和04的單元的示意圖;如圖所示,自增 長字段為05和04的單位被刪除后,單元頭包含自增長字段的位置已經(jīng)被修改了,不能找到 刪除前的自增長字段值。運時候可W定位到自增長字段為03的單元,并且03單元的地址處 在刪除單元的高地址位置,那么緊鄰此03單元的存儲位置的刪除字段的自增長字段為3+1 =4,另外一個刪除的單元是4+1 = 5。
[0055] 圖6為圖3中的數(shù)據(jù)刪除自增長字段為01的單元的示意圖;如圖所示,自增長字 段為01的單位被刪除后,單元頭包含自增長字段的位置已經(jīng)被修改了,不能找到刪除前的 自增長字段值。運時候可W定位到自增長字段為02的單元,此單元的存儲位置和刪除的單 元是緊鄰的,同時被刪除的單元處在02單元的高地址位置,根據(jù)恢復原理,在被刪除單元 的自增長字段為2-1 = 1。
[0056] 如圖7所示,本發(fā)明Sqlite文件恢復自增主鍵值的系統(tǒng),包括:
[0057] 查找模塊10,用于查找刪除單元;根據(jù)SQLite刪除數(shù)據(jù)恢復原理,找到已經(jīng)被刪 除的刪除單元的數(shù)據(jù);
[0058] 定位模塊20,用于定位到刪除單元的前面或者后面的存在自增長主鍵的數(shù)據(jù);在 刪除單元的前或后去查找含有自增長主鍵的單元數(shù)據(jù);
[0059] 恢復模塊30,用于恢復刪除數(shù)據(jù)的自增長鍵值。
[0060] 恢復模塊工作時:如果刪除單元存儲在緊鄰能正確找回自增長主鍵值單元的高地 址位置,那么刪除單元的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值減一;如果 刪除單元存儲在緊鄰能正確找回自增長主鍵值單元的低地址位置,那么刪除單元的自增長 主鍵值是能正確找回自增長主鍵值單元的鍵值加一。如果刪除單元存儲在高于能正確找回 自增長主鍵值單元的N個單元位置,那么刪除單元的自增長主鍵值是能正確找回自增長主 鍵值單元的鍵值減N ;如果刪除單元存儲在低于能正確找回自增長主鍵值單元的Μ個單元 位置,那么刪除單元的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值加 Μ。
[0061] 綜上所述,本發(fā)明根據(jù)數(shù)據(jù)的存儲位置和上下文的關系,推斷出刪除數(shù)據(jù)的自增 長主鍵值,由此使得SQLite文件在刪除數(shù)據(jù)之后,能恢復自增長主鍵值。為SQLite文件 的數(shù)據(jù)恢復提供了一種可行的方案。
[0062] 上述僅W實施例來進一步說明本發(fā)明的技術內(nèi)容,W便于讀者更容易理解,但不 代表本發(fā)明的實施方式僅限于此,任何依本發(fā)明所做的技術延伸或再創(chuàng)造,均受本發(fā)明的 保護。本發(fā)明的保護范圍W權利要求書為準。
【主權項】
1. Sqlite文件恢復自增主鍵值的方法,該方法包括以下步驟: 第一步,查找刪除單元;根據(jù)SQLite刪除數(shù)據(jù)恢復原理,找到已經(jīng)被刪除的刪除單元 的數(shù)據(jù); 第二步,定位到刪除單元的前面或者后面的存在自增長主鍵的數(shù)據(jù); 在刪除單元的前或后去查找含有自增長主鍵的單元數(shù)據(jù); 第三步,恢復刪除數(shù)據(jù)的自增長鍵值。2. 根據(jù)權利要求1所述的Sqlite文件恢復自增主鍵值的方法,其特征在于第三步:如 果刪除單元存儲在緊鄰能正確找回自增長主鍵值單元的高地址位置,那么刪除單元的自增 長主鍵值是能正確找回自增長主鍵值單元的鍵值減一;如果刪除單元存儲在緊鄰能正確找 回自增長主鍵值單元的低地址位置,那么刪除單元的自增長主鍵值是能正確找回自增長主 鍵值單元的鍵值加一。3. 根據(jù)權利要求1所述的Sqlite文件恢復自增主鍵值的方法,其特征在于第三步:如 果刪除單元存儲在高于能正確找回自增長主鍵值單元的N個單元位置,那么刪除單元的自 增長主鍵值是能正確找回自增長主鍵值單元的鍵值減N ;如果刪除單元存儲在低于能正確 找回自增長主鍵值單元的Μ個單元位置,那么刪除單元的自增長主鍵值是能正確找回自增 長主鍵值單元的鍵值加 Μ。 4. Sqlite文件恢復自增主鍵值的系統(tǒng),包括: 查找模塊,用于查找刪除單元;根據(jù)SQLite刪除數(shù)據(jù)恢復原理,找到已經(jīng)被刪除的刪 除單元的數(shù)據(jù); 定位模塊,用于定位到刪除單元的前面或者后面的存在自增長主鍵的數(shù)據(jù);在刪除單 元的前或后去查找含有自增長主鍵的單元數(shù)據(jù); 恢復模塊,用于恢復刪除數(shù)據(jù)的自增長鍵值。5. 根據(jù)權利要求4所述的Sqlite文件恢復自增主鍵值的系統(tǒng),其特征在于恢復模塊工 作時:如果刪除單元存儲在緊鄰能正確找回自增長主鍵值單元的高地址位置,那么刪除單 元的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值減一;如果刪除單元存儲在緊鄰 能正確找回自增長主鍵值單元的低地址位置,那么刪除單元的自增長主鍵值是能正確找回 自增長主鍵值單元的鍵值加一。6. 根據(jù)權利要求4所述的Sqlite文件恢復自增主鍵值的系統(tǒng),其特征在于恢復模塊工 作時:如果刪除單元存儲在高于能正確找回自增長主鍵值單元的N個單元位置,那么刪除 單元的自增長主鍵值是能正確找回自增長主鍵值單元的鍵值減N;如果刪除單元存儲在低 于能正確找回自增長主鍵值單元的Μ個單元位置,那么刪除單元的自增長主鍵值是能正確 找回自增長主鍵值單元的鍵值加 Μ。
【文檔編號】G06F17/30GK105989124SQ201510081132
【公開日】2016年10月5日
【申請日】2015年2月13日
【發(fā)明人】李亮
【申請人】深圳萬興信息科技股份有限公司