1.一種適用于非整型主鍵與空閑塊合并的SQLite數(shù)據(jù)恢復(fù)方法,其特征在于,包括以下步驟:
步驟1:獲取欲恢復(fù)數(shù)據(jù)的SQLite文件,根據(jù)其包含的系統(tǒng)表sqlite_master確定欲恢復(fù)數(shù)據(jù)表的根頁號以及表的字段結(jié)構(gòu)信息,從根頁與文件頭出發(fā),搜集所有空閑塊與空閑頁;
步驟2:假設(shè)每個空閑塊在被刪除之前包含一條被刪除的數(shù)據(jù)庫記錄的單元,分析整型主鍵與非整型主鍵的單元布局的不同與每個字節(jié)的意義,計算被覆蓋的字段類型信息,解析類型信息與數(shù)據(jù)域,通過估計與驗證的方法進(jìn)行數(shù)據(jù)恢復(fù),判斷單個空閑塊是否能恢復(fù)出有效數(shù)據(jù),若可以,則根據(jù)Type信息提取數(shù)據(jù)域數(shù)據(jù),根據(jù)每個Type的意義對數(shù)據(jù)域信息進(jìn)行解析,提取數(shù)據(jù);
步驟3:對于不能通過步驟2恢復(fù)出有效數(shù)據(jù)的空閑塊,認(rèn)定其包含多個被刪除的單元,則基于拆分與驗證法得出臨時空閑塊集,判斷臨時空閑塊能否恢復(fù)出有效數(shù)據(jù),若能則刪除所有兄弟臨時空閑塊,然后將數(shù)據(jù)加入恢復(fù)結(jié)果集,繼續(xù)判斷下一個臨時空閑塊;否則繼續(xù)判斷下一個臨時空閑塊,直到臨時空閑塊集合為空;
步驟4:通過空閑頁鏈表獲得空閑頁集合,遍歷每個空閑頁,將該頁所有的存儲數(shù)據(jù)庫記錄的單元加入單元集合,對于單元集合中的每個單元,根據(jù)Type信息解析數(shù)據(jù)域獲得數(shù)據(jù),加入恢復(fù)結(jié)果集。
2.根據(jù)權(quán)利要求1所述的適用于非整型主鍵與空閑塊合并的SQLite數(shù)據(jù)恢復(fù)方法,其特征在于,所述步驟2)對于包含一個被刪除的單元的情況的處理步驟為:對于Type被覆蓋的情況,采用基于估計與驗證的計算被覆蓋信息值的方法。
假定每個空閑塊恰包含一個被刪除的單元,對當(dāng)前空閑塊進(jìn)行判斷,由于payloadsize,rowId與headersizes最少一共占3個字節(jié),單元轉(zhuǎn)變?yōu)榭臻e塊后前四個字節(jié)被覆蓋,因此Type域第一個字節(jié)有可能被覆蓋,分為兩種情況討論,即記錄第一個字段的類型信息的Type1被覆蓋的情況與未被覆蓋的情況,假定Type域起點為i,分別以第四個到最后一個字節(jié)為起點i,進(jìn)行判斷,若i=4,認(rèn)為Type1數(shù)據(jù)丟失,則進(jìn)行單獨(dú)判斷,若i>=5,認(rèn)為所有Type信息完整,跳轉(zhuǎn)步驟2.2;
步驟2.1、若起點為第四個字節(jié),令第四個字節(jié)的值從0x00到0xFF遞增,對于當(dāng)前空閑塊獲得的256個值中的每一個值對應(yīng)的狀態(tài),執(zhí)行步驟2.2-2.2.4,任意一個值對應(yīng)的狀態(tài)通過驗證獲得被刪除的單元數(shù)據(jù),則將恢復(fù)出來的數(shù)據(jù)加入恢復(fù)結(jié)果集,終止該空閑塊判斷,繼續(xù)判斷下一個空閑塊;
步驟2.2、以i為第一個Type的起始位置,按照Type的可變長整型存儲規(guī)則,解析所有Type,并根據(jù)其值計算理論的數(shù)據(jù)長度
步驟2.3、根據(jù)步驟2.2結(jié)果,可得Type域所占字節(jié)數(shù)len(T),可得本空閑塊剩余字節(jié)數(shù)realDLen,如果readlDLen=theoryDLen,則根據(jù)Type-Data對應(yīng)關(guān)系提取數(shù)據(jù),恢復(fù)出來的數(shù)據(jù)通過驗證后加入恢復(fù)結(jié)果集,跳轉(zhuǎn)步驟2.5,否則,執(zhí)行步驟2.4;
步驟2.4、令i=i+1,跳轉(zhuǎn)步驟2.1,若i為空閑塊最后一個字節(jié)位置,則將該空閑塊加入失敗空閑塊集,執(zhí)行步驟2.5;
步驟2.5、繼續(xù)判斷下一個空閑塊,跳轉(zhuǎn)到步驟2.1,直到當(dāng)前為最后一個空閑塊。
3.根據(jù)權(quán)利要求1所述的適用于非整型主鍵與空閑塊合并的SQLite數(shù)據(jù)恢復(fù)方法,其特征在于,所述步驟3)基于拆分與驗證的方法對失敗空閑塊集進(jìn)行的恢復(fù)操作包括步驟:
步驟3.1、首先通過循環(huán)獲得臨時空閑塊集:(1)從估計的空閑塊長度len=4開始,截取當(dāng)前失敗空閑塊,加入臨時空閑塊集len++;(2)如果len等于當(dāng)前失敗空閑塊長度,則判斷下一個失敗空閑塊,跳轉(zhuǎn)(1),若當(dāng)前為最后一個失敗空閑塊,結(jié)束當(dāng)前循環(huán),獲得臨時空閑塊集;
步驟3.2、對每一個臨時空閑塊執(zhí)行進(jìn)行數(shù)據(jù)恢復(fù),若未獲得恢復(fù)數(shù)據(jù),繼續(xù)判斷下一個臨時空閑塊;若獲得恢復(fù)的數(shù)據(jù),則刪除該臨時空閑塊與其源自同一個失敗空閑塊的兄弟臨時空閑塊,然后將數(shù)據(jù)加入恢復(fù)結(jié)果集,繼續(xù)判斷下一個臨時空閑塊,直到臨時空閑塊為空。