一種SQLite空閑頁上被刪數(shù)據(jù)表的記錄分析方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)數(shù)據(jù)處理技術(shù)領(lǐng)域,特別涉及一種SQLite空閑頁上被刪數(shù)據(jù)表的記錄分析方法和裝置。
【背景技術(shù)】
[0002]SQLite是一款輕型的數(shù)據(jù)庫。它的設(shè)計(jì)目標(biāo)是嵌入式的,廣泛運(yùn)用于各種嵌入式設(shè)備中,具有占用資源小的特點(diǎn)。相比于MysqUPostgreSQL這兩款開源的世界著名數(shù)據(jù)庫管理系統(tǒng),具有更快的處理速度。
[0003]傳統(tǒng)的SQLite刪除數(shù)據(jù)解析方法是根據(jù)記錄數(shù)據(jù)的特征來識別記錄關(guān)鍵數(shù)據(jù)的起始和終止標(biāo)志,從而解析某些關(guān)鍵數(shù)據(jù),但是這種方法的弊端是只能針對某一類數(shù)據(jù)庫文件的某些關(guān)鍵數(shù)據(jù),而無法提取全部數(shù)據(jù),并且對于其他的數(shù)據(jù)庫文件則需要重新提取數(shù)據(jù)特征并重新解析,無法保證通用性。
[0004]SQLite數(shù)據(jù)庫刪除數(shù)據(jù)的通用解析,當(dāng)前國內(nèi)外研究比較少;目前市場上的通用解析產(chǎn)品具有很大的局限性,其空閑頁刪除記錄挖掘,由于對于記錄特征提取不夠精確,對于整表刪除的數(shù)據(jù),基本無法恢復(fù)出任何數(shù)據(jù),這樣影響了刪除記錄解析的準(zhǔn)確性和全面性。
[0005]目前現(xiàn)有專利中對于刪除數(shù)據(jù)的通用解析均為對于未刪除數(shù)據(jù)表的恢復(fù),如專利CN201110266852.1以及CN201110266852.1,而不適用于已刪除數(shù)據(jù)表。
【發(fā)明內(nèi)容】
[0006]本發(fā)明提出一種SQLite空閑頁上被刪數(shù)據(jù)表的記錄分析方法和裝置,可以快速、準(zhǔn)確地挖掘SQLite的空閑頁上刪除記錄,主要包括被刪除的數(shù)據(jù)表上的記錄。
[0007]具體方案如下:
[0008]一種SQLite空閑頁上被刪數(shù)據(jù)表的記錄分析方法,包括以下步驟:
[0009]S1:讀取主表的B+tree樹以及空閑頁鏈表;
[0010]S2:若被刪數(shù)據(jù)表已知,直接手動(dòng)構(gòu)造FTLIST,若被刪數(shù)據(jù)表未知,則從步驟S1得到的主表B+tree和空閑頁鏈表中,解析得到刪除的完整的建表記錄集合FTLIST ;
[0011]S3:讀取FTLIST中的下一個(gè)未讀節(jié)點(diǎn),記為FTN0DE,并將該節(jié)點(diǎn)標(biāo)記為已讀;
[0012]S4:分析FTNODE節(jié)點(diǎn)中的建表SQL語句,得到該被刪除的數(shù)據(jù)表的結(jié)構(gòu)FTS ;
[0013]S5:獲取空閑頁中符合該FTS結(jié)構(gòu)的刪除記錄。
[0014]進(jìn)一步的,所述的步驟S2中解析得到刪除的完整的建表記錄集合FTLIST的具體步驟是:
[0015]S21:從主表B+tree和空閑頁鏈表中,解析得到初步的刪除建表記錄集合FTLIST1 ;
[0016]S22:從FTLIST1排除重復(fù)記錄并且過濾掉碎片記錄和非建表記錄,得到集合FTLIST2 ;
[0017]S23:從數(shù)據(jù)庫主表中查詢得到所有未刪除的建表記錄集合TLIST ;
[0018]S24:在FTLIST2中排除與TLIST中重復(fù)的記錄,得到的集合FTLIST,該集合FTLIST即為最終的刪除建表記錄集合。
[0019]進(jìn)一步的,所述的步驟S5的具體步驟是:
[0020]S51:讀取SQLite空閑頁鏈表節(jié)點(diǎn);
[0021]S52:從空閑頁鏈表節(jié)點(diǎn)中查找所有與FTS相匹配的記錄關(guān)鍵點(diǎn);
[0022]S53:對關(guān)鍵點(diǎn)進(jìn)行記錄重組。
[0023]其中,所述的步驟S24中FTLIST2中排除與TLIST中重復(fù)的記錄根據(jù)為表名字、根頁號和建表SQL語句的一種或多種。
[0024]其中,所述步驟S52中所述記錄關(guān)鍵點(diǎn)為4個(gè)字節(jié)組成為二元組〈NFP, FTL>或<TL, HL>,其中〈NFP,F(xiàn)TL>對應(yīng)記錄頭部4個(gè)字節(jié)被覆蓋的情況,NFP表示指向下一個(gè)空閑節(jié)點(diǎn)的指針,由2個(gè)字節(jié)組成,F(xiàn)TL是NFP后面的2個(gè)字節(jié),表示該空閑節(jié)點(diǎn)的大小,而<TL,HL>對應(yīng)的是記錄頭部完整的情況,TL表示記錄總長度,是記錄的第一個(gè)變長整數(shù),HL表示頭部總長度,是記錄的第三個(gè)變長整數(shù)。一種SQLite空閑頁上被刪數(shù)據(jù)表的記錄分析裝置,所述的裝置包括:
[0025]讀取單元,用于讀取主表的B+tree樹以及空閑頁鏈表;
[0026]建表記錄獲取單元,用于若被刪數(shù)據(jù)表已知,直接手動(dòng)構(gòu)造FTLIST,若被刪數(shù)據(jù)表未知,則從讀取單元得到的主表B+tree和空閑頁鏈表中,解析得到刪除的完整的建表記錄集合 FTLIST ;
[0027]節(jié)點(diǎn)讀取標(biāo)記單元,用于讀取FTLIST中的下一個(gè)未讀節(jié)點(diǎn),記為FTN0DE,并將該節(jié)點(diǎn)標(biāo)記為已讀;
[0028]數(shù)據(jù)表的結(jié)構(gòu)FTS獲取單元,用于分析FTNODE節(jié)點(diǎn)中的建表SQL語句,得到該被刪除的數(shù)據(jù)表的結(jié)構(gòu)FTS ;
[0029]刪除記錄獲取單元,用于獲取空閑頁中符合該FTS結(jié)構(gòu)的刪除記錄。
[0030]進(jìn)一步的,所述的建表記錄獲取單元包括:
[0031]第一記錄獲取單元,用于從主表B+tree和空閑頁鏈表中,解析得到初步的刪除建表記錄集合FTLIST 1 ;
[0032]第二記錄獲取單元,用于從FTLIST1排除重復(fù)記錄并且過濾掉碎片記錄和非建表記錄,得到集合FTLIST2 ;
[0033]第三記錄獲取單元,用于從數(shù)據(jù)庫主表中查詢得到所有未刪除的建表記錄集合TLIST ;
[0034]最終記錄獲取單元,用于在FTLIST2中排除與TLIST中重復(fù)的記錄,得到的集合,該集合FTLIST即為最終的刪除建表記錄集合。
[0035]進(jìn)一步的,所述的刪除記錄獲取單元包括:
[0036]空閑頁鏈表節(jié)點(diǎn)讀取單元,用于讀取SQLite空閑頁鏈表節(jié)點(diǎn);
[0037]記錄關(guān)鍵點(diǎn)查找單元:用于從空閑頁鏈表節(jié)點(diǎn)中查找所有與FTS相匹配的記錄關(guān)鍵點(diǎn);
[0038]關(guān)鍵點(diǎn)重組單元:用于對關(guān)鍵點(diǎn)進(jìn)行記錄重組。
[0039]其中,所述的最終記錄獲取單元中排除與TLIST中重復(fù)的記錄根據(jù)可以為表名字、根頁號和建表SQL語句的一種或多種。
[0040]其中,所述記錄關(guān)鍵點(diǎn)查找單元中所述記錄關(guān)鍵點(diǎn)為4個(gè)字節(jié)組成的二元組〈NFP,F(xiàn)TL>或<TL,HL>,其中〈NFP,F(xiàn)TL>對應(yīng)記錄頭部4個(gè)字節(jié)被覆蓋的情況,NFP表示指向下一個(gè)空閑節(jié)點(diǎn)的指針,由2個(gè)字節(jié)組成,F(xiàn)TL是NFP后面的2個(gè)字節(jié),表示該空閑節(jié)點(diǎn)的大小,而<TL,HL>對應(yīng)的是記錄頭部完整的情況,TL表示記錄總長度,是記錄的第一個(gè)變長整數(shù),HL表示頭部總長度,是記錄的第三個(gè)變長整數(shù)。
[0041]與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點(diǎn):
[0042]實(shí)用性:無需人工分析介入,自動(dòng)識別主表上刪除的數(shù)據(jù)表的建表記錄并分析數(shù)據(jù)表的結(jié)構(gòu),并且根據(jù)分析到的數(shù)據(jù)表的結(jié)構(gòu)來解析空閑頁上的刪除記錄;由于SQLite的使用呈廣泛化趨勢,該方法的重要性不言而喻,預(yù)計(jì)該方法將對數(shù)據(jù)庫信息安全技術(shù)產(chǎn)生一定影響,也為其它相近數(shù)據(jù)庫類型的自由空間記錄挖掘提供嶄新思路。
[0043]創(chuàng)新性:該方法創(chuàng)造性的從主表去分析被刪除的數(shù)據(jù)表的建表記錄,并且根據(jù)建表記錄來分析空閑頁,增強(qiáng)空閑頁上刪除記錄挖掘的準(zhǔn)確性和全面性,尤其是對于數(shù)據(jù)表被刪除的情況;該方法不僅在算法上體現(xiàn)出簡潔明了的特點(diǎn),更憑借其出色的環(huán)境適應(yīng)性,大大增加了程序的健壯度;并且該方法不局限于某一個(gè)數(shù)據(jù)庫,而是對所有SQLite數(shù)據(jù)庫的自由空間的刪除記錄挖掘都適用,具有很強(qiáng)的通用性。
【附圖說明】
[0044]圖1為一個(gè)SQLite頁面結(jié)構(gòu)示意圖;
[0045]圖2為一個(gè)實(shí)施例的數(shù)據(jù)庫展示圖;
[0046]圖3為本發(fā)明的主流程圖;
[0047]圖4為該實(shí)施例的主表數(shù)據(jù)截圖;
[0048]圖5為該實(shí)施例的food表殘留數(shù)據(jù)截圖;
[0049]圖6為該實(shí)施例的主表恢復(fù)結(jié)果圖;
[0050]圖7為該實(shí)施例的food表的刪除記錄圖。
【具體實(shí)施方式】
[0051]在結(jié)合附圖和【具體實(shí)施方式】對本發(fā)明作進(jìn)一步詳細(xì)的說明之前,首先介紹一下與SQLite數(shù)據(jù)庫有關(guān)的幾個(gè)概念。
[0052]SQLite數(shù)據(jù)庫由系列的數(shù)據(jù)表組成的,而這一系列的數(shù)據(jù)表表及其對應(yīng)的索引表(index)和觸發(fā)器(trigger)均由主表(sqlite_master)來管理,而主表和普通的數(shù)據(jù)表沒有區(qū)別,由一系列頁面來記錄數(shù)據(jù)表、索引表和觸發(fā)器等的變更(創(chuàng)建、刪除等),并且這些頁面組織由B+tree來管理,每個(gè)B+tree節(jié)點(diǎn)對應(yīng)一個(gè)SQLite頁面。
[0053]SQLite主表具有以下3個(gè)特征:
[0054]1)以一棵 B+tree 組織;
[0055]2)以第一頁為根頁;
[0056]3)由 5 個(gè)字段組成:(type text, name text,tbl—name text,rootpageinteger, sql text)
[0057]SQLite主表及其管理的數(shù)據(jù)表由B+tree來組織頁面管理,而數(shù)據(jù)表對應(yīng)的索引表有B-tree來組織頁面管理,在這一系列Btree (包括B+tree和B-tree)之外的頁面統(tǒng)稱為空閑頁。
[0058]空閑頁以鏈表形式組織起來,圖1為SQLite頁面結(jié)構(gòu)示意圖,其中
[0059]a.鏈表首指針存放在文件頭32字節(jié)偏移處的4個(gè)字節(jié);
[0060]b.若只有一個(gè)空閑頁,則沒有主干頁,僅有的一個(gè)空閑頁是葉子頁;
[0061]c.每個(gè)主干頁的第0-3字節(jié),指向下一個(gè)主干頁的頁號,0表示鏈表結(jié)束;
[0062]d.每個(gè)主干頁的第4-7字節(jié),表示該主干頁的葉子頁的數(shù)量;
[0063]e.每個(gè)主干頁的第8個(gè)字節(jié)開始,分別以4字節(jié)表示一個(gè)空閑頁的頁號。
[0064]空閑頁上被刪數(shù)據(jù)表的分析:
[0065]如上述所描述,空閑頁已經(jīng)脫離了 B+tree的管理范圍,已經(jīng)無法得知某一個(gè)空閑頁是歸屬于哪個(gè)B+tree或者歸屬于哪張數(shù)據(jù)表,不過對于數(shù)據(jù)庫中存在的數(shù)據(jù)表,依然可以用嘗試的方式來分析空閑頁,從而把空閑頁中的刪除記錄解析出來,但是對于數(shù)據(jù)庫中已刪除的數(shù)據(jù)表,就無法嘗試分析了。
[0066]基于上述主表的三個(gè)特征可得知,數(shù)據(jù)庫中表格的刪除,依然可以通過主表的B+tree來分析出被刪表格的名稱、根頁和創(chuàng)建表的SQL語句等,其恢復(fù)的方式與一般的表格的刪除記錄恢復(fù)方式類似。
[0067]因此,我們可以通過主表的記錄解析(包括刪除記錄)并且排重得到刪除的表格的基本屬性,包括表格名字、根頁和SQL語句等,然后根據(jù)SQL語句分析出該刪除的數(shù)據(jù)表的表結(jié)構(gòu)屬性,并且根據(jù)分析得到的表結(jié)構(gòu)去解析空閑頁鏈表,從而解決數(shù)據(jù)庫中已刪除數(shù)據(jù)表無法刪除恢復(fù)的問題。
[0068]此外,對于某些特定的已知數(shù)據(jù)庫(比如Android手機(jī)的QQ數(shù)據(jù)庫等),我們可以跳過主表的記錄分析,直接自行構(gòu)造建表記錄來達(dá)到解析空閑頁的目的。
[0069]為進(jìn)一步說明各實(shí)施例,本發(fā)明提供有附圖。這些附圖為本發(fā)明揭露內(nèi)容的一部分,其主要用以說明實(shí)施例,并可配合說明書的相關(guān)描述來解釋實(shí)施例的運(yùn)作原理。配合參考這些內(nèi)容,本領(lǐng)域普通技術(shù)人員應(yīng)能理解其他可能的實(shí)施方式以及本發(fā)明的優(yōu)點(diǎn)?,F(xiàn)結(jié)合附圖和【具體實(shí)施方式】對本發(fā)明進(jìn)一步說明。