本申請涉及計算機領(lǐng)域,尤其涉及一種用于恢復樹形數(shù)據(jù)存儲的技術(shù)。
背景技術(shù):
數(shù)據(jù)庫經(jīng)常被用來存儲、管理各類數(shù)據(jù),當數(shù)據(jù)庫中的數(shù)據(jù)文件出現(xiàn)損壞時,通常會給數(shù)據(jù)庫運維人員造成不小的麻煩。雖然可以通過日志來保護數(shù)據(jù)庫中的數(shù)據(jù)文件,但依然存在一些可能導致數(shù)據(jù)文件損壞的情況,比如:物理備份的軟件漏洞會在備份的過程中造成數(shù)據(jù)頁損壞;磁盤有一定的故障概率,某個磁盤壞塊可能會造成這個范圍內(nèi)的數(shù)據(jù)損壞;用戶出于性能方面的考慮,未將數(shù)據(jù)庫配置成強持久化,導致宕機丟失數(shù)據(jù)。
對于采用B-tree(B樹,多路搜索樹)、B-樹、B+樹等數(shù)據(jù)結(jié)構(gòu)存儲的數(shù)據(jù),由于在磁盤上具有嚴格的存儲結(jié)構(gòu),當某個關(guān)鍵節(jié)點出現(xiàn)損壞時,可能導致存儲的數(shù)據(jù)無法被訪問。在MySQL數(shù)據(jù)庫場景下,則表現(xiàn)為只要訪問到損壞數(shù)據(jù),數(shù)據(jù)庫就會不斷崩潰重啟。通常運維人員無法發(fā)現(xiàn)哪些數(shù)據(jù)損壞了,唯一的辦法就是將整個數(shù)據(jù)庫實例重做,從而影響了數(shù)據(jù)庫的可用性。
技術(shù)實現(xiàn)要素:
本申請的一個目的是提供一種用于恢復樹形數(shù)據(jù)存儲的方法與設(shè)備,以解決恢復樹形數(shù)據(jù)存儲的問題。
根據(jù)本申請的一個方面,提供了一種用于恢復樹形數(shù)據(jù)存儲的方法,其中,該方法包括:
深度優(yōu)先遍歷數(shù)據(jù)存儲對應的索引樹,其中,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點;
當所述索引樹中存在所述壞節(jié)點時,根據(jù)對應的遍歷結(jié)果信息重建所述索引樹。
根據(jù)本申請的另一個方面,提供了一種用于恢復樹形數(shù)據(jù)存儲的設(shè)備,其中,該設(shè)備包括:
索引樹遍歷裝置,用于深度優(yōu)先遍歷數(shù)據(jù)存儲對應的索引樹,其中,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點;
索引樹重建裝置,用于當所述索引樹中存在所述壞節(jié)點時,根據(jù)對應的遍歷結(jié)果信息重建所述索引樹。
與現(xiàn)有技術(shù)相比,本申請按照深度優(yōu)先的方式遍歷數(shù)據(jù)存儲對應的索引樹,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點,當所述索引樹中存在所述壞節(jié)點時,根據(jù)對應的遍歷結(jié)果信息重建所述索引樹,從而檢查并盡可能地恢復樹形數(shù)據(jù)存儲。進一步地,本申請通過在遍歷過程中記錄所述壞節(jié)點的數(shù)據(jù)損壞范圍,并向用戶報告所述數(shù)據(jù)損壞范圍,方便用戶從備份中查找所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù),簡化了用戶操作,提升了用戶體驗。
附圖說明
通過閱讀參照以下附圖所作的對非限制性實施例所作的詳細描述,本申請的其它特征、目的和優(yōu)點將會變得更明顯:
圖1示出根據(jù)本申請一個方面的一種用于恢復樹形數(shù)據(jù)存儲的方法流程圖;
圖2示出根據(jù)本申請一個優(yōu)選實施例的一種用于恢復樹形數(shù)據(jù)存儲的方法流程圖;
圖3示出根據(jù)本申請另一個優(yōu)選實施例的一種用于恢復樹形數(shù)據(jù)存儲的方法流程圖;
圖4示出根據(jù)本申請另一個方面的一種用于恢復樹形數(shù)據(jù)存儲的設(shè)備示意圖;
圖5示出根據(jù)本申請一個優(yōu)選實施例的一種用于恢復樹形數(shù)據(jù)存儲的設(shè)備示意圖;
圖6示出根據(jù)本申請又一個優(yōu)選實施例的一種用于恢復樹形數(shù)據(jù)存儲的設(shè)備示意圖;
圖7示出根據(jù)本申請一個實施例的一種B樹結(jié)構(gòu)示意圖;
圖8示出根據(jù)本申請另一個實施例的一種構(gòu)建B樹的過程示意圖。
附圖中相同或相似的附圖標記代表相同或相似的部件。
具體實施方式
下面結(jié)合附圖對本申請作進一步詳細描述。
在本申請一個典型的配置中,終端、服務網(wǎng)絡(luò)的設(shè)備和可信方均包括一個或多個處理器(CPU)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
內(nèi)存可能包括計算機可讀介質(zhì)中的非永久性存儲器,隨機存取存儲器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲器(ROM)或閃存(flash RAM)。內(nèi)存是計算機可讀介質(zhì)的示例。
計算機可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實現(xiàn)信息存儲。信息可以是計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計算機的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機存取存儲器(SRAM)、動態(tài)隨機存取存儲器(DRAM)、其他類型的隨機存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲器(CD-ROM)、數(shù)字多功能光盤(DVD)或其他光學存儲、磁盒式磁帶,磁帶磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計算設(shè)備訪問的信息。按照本文中的界定,計算機可讀介質(zhì)不包括非暫存電腦可讀媒體(transitory media),如調(diào)制的數(shù)據(jù)信號和載波。
圖1示出根據(jù)本申請一個方面的一種用于恢復樹形數(shù)據(jù)存儲的方法流程圖。
該方法包括步驟S11和步驟S12。具體地,在步驟S11中,設(shè)備1深度優(yōu)先遍歷數(shù)據(jù)存儲對應的索引樹,其中,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點;在步驟S12中,設(shè)備1當所述索引樹中存在所述壞節(jié)點時,根據(jù)對應的遍歷結(jié)果信息重建所述索引樹。
在此,所述設(shè)備1包括但不限于用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備。所述用戶設(shè)備其包括但不限于任何一種可與用戶通過觸摸板進行人機交互的移動電子產(chǎn)品,例如智能手機、平板電腦等,所述移動電子產(chǎn)品可以采用任意操作系統(tǒng),如android操作系統(tǒng)、iOS操作系統(tǒng)等。其中,所述網(wǎng)絡(luò)設(shè)備包括一種能夠按照事先設(shè)定或存儲的指令,自動進行數(shù)值計算和信息處理的電子設(shè)備,其硬件包括但不限于微處理器、專用集成電路(ASIC)、可編程門陣列(FPGA)、數(shù)字處理器(DSP)、嵌入式設(shè)備等。所述網(wǎng)絡(luò)設(shè)備其包括但不限于計算機、網(wǎng)絡(luò)主機、單個網(wǎng)絡(luò)服務器、多個網(wǎng)絡(luò)服務器集或多個服務器構(gòu)成的云;在此,云由基于云計算(Cloud Computing)的大量計算機或網(wǎng)絡(luò)服務器構(gòu)成,其中,云計算是分布式計算的一種,由一群松散耦合的計算機集組成的一個虛擬超級計算機。所述網(wǎng)絡(luò)包括但不限于互聯(lián)網(wǎng)、廣域網(wǎng)、城域網(wǎng)、局域網(wǎng)、VPN網(wǎng)絡(luò)、無線自組織網(wǎng)絡(luò)(Ad Hoc網(wǎng)絡(luò))等。優(yōu)選地,設(shè)備1還可以是運行于所述用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)設(shè)備、觸摸終端或網(wǎng)絡(luò)設(shè)備與觸摸終端通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備上的腳本程序。當然,本領(lǐng)域技術(shù)人員應能理解上述設(shè)備1僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的設(shè)備1如可適用于本申請,也應包含在本申請保護范圍以內(nèi),并在此以引用方式包含于此。
設(shè)備1的各個步驟之間是持續(xù)不斷工作的。具體地,在步驟S11中,設(shè)備1持續(xù)深度優(yōu)先遍歷數(shù)據(jù)存儲對應的索引樹;在步驟S12中,設(shè)備1持續(xù)當所述索引樹中存在所述壞節(jié)點時,根據(jù)對應的遍歷結(jié)果信息重建所述索引樹;直至所述設(shè)備1停止工作。
在步驟S11中,設(shè)備1深度優(yōu)先遍歷數(shù)據(jù)存儲對應的索引樹,其中,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點。
優(yōu)選地,所述索引樹包括B樹、B-樹或B+樹。其中,B樹(B-tree,多路搜索樹)是一種常用的數(shù)據(jù)庫數(shù)據(jù)組織結(jié)構(gòu),它是MySQL數(shù)據(jù)庫最常用的索引結(jié)構(gòu),MySQL數(shù)據(jù)庫的存儲引擎InnoDB支持B-tree索引。在本實施例中,主要以B-tree為例進行詳細說明。
當然,本領(lǐng)域技術(shù)人員應能理解上述樹形結(jié)構(gòu)僅為舉例,其他現(xiàn)有的或 今后可能出現(xiàn)的樹形結(jié)構(gòu)如可適用于本申請,也應包含在本申請保護范圍以內(nèi),并在此以引用方式包含于此。
例如,參照圖7,以B-tree結(jié)構(gòu)存儲的每個索引樹都具有一個根節(jié)點,圖7中的Level 0(第0層)就是該索引樹的根節(jié)點。根節(jié)點向下又衍生出子節(jié)點,Level 1(第1層)是Level 0的子節(jié)點,葉子節(jié)點Level 2(第2層)是Level 1的子節(jié)點。方框中的50、25等數(shù)字表示對應的鍵值,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在圖7中,根節(jié)點Level 0的鍵值為50,其左指針指向鍵值小于等于50的數(shù)據(jù),右指針指向鍵值大于50的數(shù)據(jù)。如果非葉子節(jié)點損壞了,就無法從該節(jié)點尋路到其指向的子節(jié)點。假設(shè)Level 1的左節(jié)點(25,45)丟失,那么就無法檢索到鍵值小于等于50的數(shù)據(jù)。在此,非葉子節(jié)點只記錄鍵值范圍,葉子節(jié)點記錄全數(shù)據(jù)。
在此,可以采用遞歸算法深度優(yōu)先遍歷所述索引樹。
例如,假設(shè)采用的遞歸函數(shù)名為f(Level,page),其中,Level的初始值設(shè)為0,page指針初始時指向root(根)頁(例如圖7中的page 0),從根節(jié)點開始按照深度優(yōu)先的方式遞歸調(diào)度檢查。如果圖7所示的B-tree結(jié)構(gòu)的索引樹沒有損壞,那么用所述遞歸算法對其進行遍歷的順序為page 0、page 1、page 3、page 4、page 5、page 2、page 6、page 7。如果所述索引樹出現(xiàn)損壞,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點。用所述遞歸算法對圖7所示的B-tree結(jié)構(gòu)的索引樹進行遍歷,假設(shè)page 0損壞,即根節(jié)點損壞,那么不再向下層遍歷所述索引樹;假設(shè)page 1損壞,無法訪問其子節(jié)點page3、page 4、page 5,那么對所述索引樹進行遍歷的順序為page 0、page 1、page 2、page 6、page 7;假設(shè)page 4損壞,那么對所述索引樹進行遍歷的順序為page 0、page 1、page 3、page 4、page 5、page 2、page 6、page 7。
優(yōu)選地,所述索引樹包括聚集索引。
在此,所述聚集索引是根據(jù)聚集索引鍵構(gòu)建的索引樹。相應地,二級索引是根據(jù)二級索引鍵構(gòu)建的索引樹。
優(yōu)選地,在步驟S11中,設(shè)備1當接收到用戶修復數(shù)據(jù)存儲的指令信息,深度優(yōu)先遍歷所述數(shù)據(jù)存儲對應的索引樹,其中,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞 的壞節(jié)點。
例如,所示指令信息可以是SQL語句“REPAIR TABLE tbname”,其中,tbname指的是待修復數(shù)據(jù)的表名。
與現(xiàn)有技術(shù)相比,在本申請中,僅需要通過用戶發(fā)出的簡單的指令信息,就可以按照深度優(yōu)先遍歷所述數(shù)據(jù)存儲對應的索引樹。為用戶提供了簡單方便的操作方式,提升了用戶體驗。
在步驟S12中,設(shè)備1當所述索引樹中存在所述壞節(jié)點時,根據(jù)對應的遍歷結(jié)果信息重建所述索引樹。
例如,參照圖7,假設(shè)在遍歷過程中發(fā)現(xiàn)page 4損壞,那么在遍歷結(jié)束后根據(jù)page 3、page 5、page 6、page 7記錄的數(shù)據(jù)重建所述索引樹;假設(shè)在遍歷過程中發(fā)現(xiàn)page 1損壞,無法訪問其子節(jié)點page 3、page 4、page5,那么在遍歷結(jié)束后根據(jù)page 5、page 6記錄的數(shù)據(jù)重建所述索引樹;假設(shè)在遍歷過程中發(fā)現(xiàn)page 1和page 5損壞,那么在遍歷結(jié)束后根據(jù)page 6記錄的數(shù)據(jù)重建所述索引樹;假設(shè)在遍歷過程中發(fā)現(xiàn)page 0損壞,即根節(jié)點損壞,那么認為無法恢復所述索引樹,不再向下層遍歷所述索引樹,而是直接重建所述索引樹。在此,均通過已有的B-tree構(gòu)建算法重建所述索引樹。例如,參照圖8,假設(shè)在構(gòu)建B樹的過程中依次插入鍵值分別為1、3、6、4、9、11、12的數(shù)據(jù),其中,每個葉子節(jié)點可以存儲2條數(shù)據(jù),然后根據(jù)葉子節(jié)點確定對應的非葉子節(jié)點的鍵值范圍,圖8簡單地示出該B樹的構(gòu)建過程。
然而,針對數(shù)據(jù)損壞場景,現(xiàn)有的數(shù)據(jù)恢復工具通常是根據(jù)表結(jié)構(gòu),離線從ibd文件(MySQL數(shù)據(jù)庫的數(shù)據(jù)文件、索引文件)中提取有效數(shù)據(jù),并生成數(shù)據(jù)集文件,用戶再重建表并導入數(shù)據(jù)。在恢復損壞數(shù)據(jù)之前,數(shù)據(jù)庫實例處于離線狀態(tài),無法提供服務。
與現(xiàn)有技術(shù)相比,當所述索引樹中存在所述壞節(jié)點時,本申請根據(jù)對應的遍歷結(jié)果信息重建所述索引樹,僅讓損壞數(shù)據(jù)離線,重建后的所述索引樹依然可以為用戶提供服務。
圖2示出根據(jù)本申請一個優(yōu)選實施例的一種用于恢復樹形數(shù)據(jù)存儲的方法流程圖。
該方法包括步驟S21、步驟S22、步驟S23和步驟S24。具體地,在步 驟S21中,設(shè)備1深度優(yōu)先遍歷數(shù)據(jù)存儲對應的索引樹,在遍歷過程中記錄所述壞節(jié)點的數(shù)據(jù)損壞范圍,報告所述數(shù)據(jù)損壞范圍,其中,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點;在步驟S22中,設(shè)備1當所述索引樹中存在所述壞節(jié)點時,根據(jù)對應的遍歷結(jié)果信息重建所述索引樹;在步驟S23中,設(shè)備1接收所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù);在步驟S24中,設(shè)備1根據(jù)所述備份數(shù)據(jù)更新重建后的所述索引樹。
在此,所述步驟S22與圖1中步驟S12的內(nèi)容相同或基本相同。
相比圖1中步驟S11,步驟S21中設(shè)備1在遍歷過程中還記錄所述壞節(jié)點的數(shù)據(jù)損壞范圍,報告所述數(shù)據(jù)損壞范圍。
例如,用所述遞歸算法對圖7所示的B-tree結(jié)構(gòu)的索引樹進行遍歷,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點。假設(shè)page 0損壞,即根節(jié)點損壞,那么不再向下層遍歷所述索引樹,并記錄page 0涉及的數(shù)據(jù)范圍,即所述數(shù)據(jù)損壞范圍包括所述索引樹中的全部數(shù)據(jù);假設(shè)page 1損壞,無法訪問其子節(jié)點page 3、page 4、page 5,根據(jù)圖7所示的鍵值,那么所述數(shù)據(jù)損壞范圍包括所有鍵值小于等于50的數(shù)據(jù),記錄所述數(shù)據(jù)損壞范圍;假設(shè)page 4損壞,根據(jù)圖7所示的鍵值,那么所述數(shù)據(jù)損壞范圍可能為(25,45],記錄所述數(shù)據(jù)損壞范圍。在此,可以在結(jié)束遍歷所述索引樹之后,將遍歷過程中檢查到的所述數(shù)據(jù)損壞范圍返回至用戶設(shè)備(數(shù)據(jù)庫管理員所使用的設(shè)備),報告給用戶(數(shù)據(jù)庫管理員);也可以在發(fā)現(xiàn)數(shù)據(jù)損壞時,即報告所述數(shù)據(jù)損壞范圍。
優(yōu)選地,在步驟S23中,設(shè)備1接收所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù);在步驟S24中,設(shè)備1根據(jù)所述備份數(shù)據(jù)更新重建后的所述索引樹。
例如,用戶可以根據(jù)所述數(shù)據(jù)損壞范圍,從備份或者備庫實例中拉取所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù)。具體地,用戶可以根據(jù)所述數(shù)據(jù)損壞范圍對應的B-tree鍵值,從備份或者備庫實例中找到對應的備份數(shù)據(jù)。在接收到用戶設(shè)備發(fā)送的所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù)之后,通過已有的B-tree算法將所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù)插入重建后的聚集索引(所述索引樹)中,以更新重建后的所述索引樹。
與現(xiàn)有技術(shù)相比,本申請向用戶報告所述數(shù)據(jù)損壞范圍,指導用戶從備份或者備庫實例中拉取所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù),便于用戶操作,提升了用戶體驗。
圖3示出根據(jù)本申請另一個優(yōu)選實施例的一種用于恢復樹形數(shù)據(jù)存儲的方法流程圖。
該方法包括步驟S31、步驟S32、步驟S35、步驟S36、步驟S33和步驟S34。在此,所述步驟S31、步驟S32、步驟S33、步驟S34與圖2中步驟S21、步驟S22、步驟S23、步驟S24的內(nèi)容相同或基本相同,為簡明起見,不再贅述。
具體地,在步驟S35中,設(shè)備1深度優(yōu)先遍歷所述數(shù)據(jù)存儲對應的二級索引,其中,所述二級索引中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍;在步驟S36中,設(shè)備1在遍歷過程中,若發(fā)現(xiàn)所述二級索引中存在數(shù)據(jù)損壞的節(jié)點,根據(jù)所述索引樹或重建后的所述索引樹重建所述二級索引。
在此,所述二級索引是根據(jù)二級索引鍵構(gòu)建的索引樹。在具體的實施例中,在深度優(yōu)先遍歷所述數(shù)據(jù)存儲對應的根據(jù)聚集索引鍵構(gòu)建的索引樹(即聚集索引)之后,再深度優(yōu)先遍歷所述數(shù)據(jù)存儲對應的根據(jù)二級索引鍵構(gòu)建的索引樹(即二級索引)。優(yōu)選地,所述根據(jù)二級索引鍵構(gòu)建的索引樹包括B樹、B-樹或B+樹。只要在遍歷二級索引的過程中發(fā)現(xiàn)數(shù)據(jù)損壞的節(jié)點,不再繼續(xù)遍歷,根據(jù)所述聚集索引重建所述二級索引。
例如,聚集索引包含了行的全部數(shù)據(jù),假設(shè)表t1上包含列(c1,c2,c3,c4),將c1定義為聚集索引鍵,c2、c3定義為二級索引鍵。聚集索引包含列為(c1,c2,c3,c4),也即全部數(shù)據(jù);二級索引包含(c2,c3,c1),包含二級索引鍵值和聚集索引鍵值,其中,聚集索引鍵值用于快速定位到全部數(shù)據(jù)記錄。假設(shè)查詢條件包含c2、c3,但想得到的數(shù)據(jù)是c4,就可以通過c2、c3查詢二級索引,找到對應的聚集索引鍵值c1,再通過c1查詢聚集索引,找到c4的值。那么在根據(jù)所述聚集索引重建所述二級索引時,因為聚集索引包含了全行的數(shù)據(jù),所以可以讀取聚集索引中包含的二級索引鍵值列,然后通過已有的B-tree算法(參照圖8)重建所述二級索引。
圖4示出根據(jù)本申請另一個方面的一種用于恢復樹形數(shù)據(jù)存儲的設(shè)備1, 其中,設(shè)備1包括索引樹遍歷裝置11和索引樹重建裝置12。
具體地,所述索引樹遍歷裝置11深度優(yōu)先遍歷數(shù)據(jù)存儲對應的索引樹,其中,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點;所述索引樹重建裝置12當所述索引樹中存在所述壞節(jié)點時,根據(jù)對應的遍歷結(jié)果信息重建所述索引樹。
在此,所述設(shè)備1包括但不限于用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備。所述用戶設(shè)備其包括但不限于任何一種可與用戶通過觸摸板進行人機交互的移動電子產(chǎn)品,例如智能手機、平板電腦等,所述移動電子產(chǎn)品可以采用任意操作系統(tǒng),如android操作系統(tǒng)、iOS操作系統(tǒng)等。其中,所述網(wǎng)絡(luò)設(shè)備包括一種能夠按照事先設(shè)定或存儲的指令,自動進行數(shù)值計算和信息處理的電子設(shè)備,其硬件包括但不限于微處理器、專用集成電路(ASIC)、可編程門陣列(FPGA)、數(shù)字處理器(DSP)、嵌入式設(shè)備等。所述網(wǎng)絡(luò)設(shè)備其包括但不限于計算機、網(wǎng)絡(luò)主機、單個網(wǎng)絡(luò)服務器、多個網(wǎng)絡(luò)服務器集或多個服務器構(gòu)成的云;在此,云由基于云計算(Cloud Computing)的大量計算機或網(wǎng)絡(luò)服務器構(gòu)成,其中,云計算是分布式計算的一種,由一群松散耦合的計算機集組成的一個虛擬超級計算機。所述網(wǎng)絡(luò)包括但不限于互聯(lián)網(wǎng)、廣域網(wǎng)、城域網(wǎng)、局域網(wǎng)、VPN網(wǎng)絡(luò)、無線自組織網(wǎng)絡(luò)(Ad Hoc網(wǎng)絡(luò))等。優(yōu)選地,設(shè)備1還可以是運行于所述用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)設(shè)備、觸摸終端或網(wǎng)絡(luò)設(shè)備與觸摸終端通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備上的腳本程序。當然,本領(lǐng)域技術(shù)人員應能理解上述設(shè)備1僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的設(shè)備1如可適用于本申請,也應包含在本申請保護范圍以內(nèi),并在此以引用方式包含于此。
上述各裝置之間是持續(xù)不斷工作的,在此,本領(lǐng)域技術(shù)人員應理解“持續(xù)”是指上述各裝置分別實時地或者按照設(shè)定的或?qū)崟r調(diào)整的工作模式要求,例如所述索引樹遍歷裝置11持續(xù)深度優(yōu)先遍歷數(shù)據(jù)存儲對應的索引樹;所述索引樹重建裝置12持續(xù)當所述索引樹中存在所述壞節(jié)點時,根據(jù)對應的遍歷結(jié)果信息重建所述索引樹;直至所述設(shè)備1停止工作。
所述索引樹遍歷裝置11深度優(yōu)先遍歷數(shù)據(jù)存儲對應的索引樹,其中,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在遍歷過程中跳過 所述索引樹中數(shù)據(jù)損壞的壞節(jié)點。
優(yōu)選地,所述索引樹包括B樹、B-樹或B+樹。其中,B樹(B-tree,多路搜索樹)是一種常用的數(shù)據(jù)庫數(shù)據(jù)組織結(jié)構(gòu),它是MySQL數(shù)據(jù)庫最常用的索引結(jié)構(gòu),MySQL數(shù)據(jù)庫的存儲引擎InnoDB支持B-tree索引。在本實施例中,主要以B-tree為例進行詳細說明。
當然,本領(lǐng)域技術(shù)人員應能理解上述樹形結(jié)構(gòu)僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的樹形結(jié)構(gòu)如可適用于本申請,也應包含在本申請保護范圍以內(nèi),并在此以引用方式包含于此。
例如,參照圖7,以B-tree結(jié)構(gòu)存儲的每個索引樹都具有一個根節(jié)點,圖7中的Level 0(第0層)就是該索引樹的根節(jié)點。根節(jié)點向下又衍生出子節(jié)點,Level 1(第1層)是Level 0的子節(jié)點,葉子節(jié)點Level 2(第2層)是Level 1的子節(jié)點。方框中的50、25等數(shù)字表示對應的鍵值,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在圖7中,根節(jié)點Level 0的鍵值為50,其左指針指向鍵值小于等于50的數(shù)據(jù),右指針指向鍵值大于50的數(shù)據(jù)。如果非葉子節(jié)點損壞了,就無法從該節(jié)點尋路到其指向的子節(jié)點。假設(shè)Level 1的左節(jié)點(25,45)丟失,那么就無法檢索到鍵值小于等于50的數(shù)據(jù)。在此,非葉子節(jié)點只記錄鍵值范圍,葉子節(jié)點記錄全數(shù)據(jù)。
在此,可以采用遞歸算法深度優(yōu)先遍歷所述索引樹。
例如,假設(shè)采用的遞歸函數(shù)名為f(Level,page),其中,Level的初始值設(shè)為0,page指針初始時指向root(根)頁(例如圖7中的page 0),從根節(jié)點開始按照深度優(yōu)先的方式遞歸調(diào)度檢查。如果圖7所示的B-tree結(jié)構(gòu)的索引樹沒有損壞,那么用所述遞歸算法對其進行遍歷的順序為page 0、page 1、page 3、page 4、page 5、page 2、page 6、page 7。如果所述索引樹出現(xiàn)損壞,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點。用所述遞歸算法對圖7所示的B-tree結(jié)構(gòu)的索引樹進行遍歷,假設(shè)page 0損壞,即根節(jié)點損壞,那么不再向下層遍歷所述索引樹;假設(shè)page 1損壞,無法訪問其子節(jié)點page3、page 4、page 5,那么對所述索引樹進行遍歷的順序為page 0、page 1、page 2、page 6、page 7;假設(shè)page 4損壞,那么對所述索引樹進行遍歷的順序為page 0、page 1、page 3、page 4、page 5、page 2、page 6、page 7。
優(yōu)選地,所述索引樹包括聚集索引。
在此,所述聚集索引是根據(jù)聚集索引鍵構(gòu)建的索引樹。相應地,二級索引是根據(jù)二級索引鍵構(gòu)建的索引樹。
優(yōu)選地,所述索引樹遍歷裝置11當接收到用戶修復數(shù)據(jù)存儲的指令信息,深度優(yōu)先遍歷所述數(shù)據(jù)存儲對應的索引樹,其中,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點。
例如,所示指令信息可以是SQL語句“REPAIR TABLE tbname”,其中,tbname指的是待修復數(shù)據(jù)的表名。
與現(xiàn)有技術(shù)相比,在本申請中,僅需要通過用戶發(fā)出的簡單的指令信息,就可以按照深度優(yōu)先遍歷所述數(shù)據(jù)存儲對應的索引樹。為用戶提供了簡單方便的操作方式,提升了用戶體驗。
所述索引樹重建裝置12當所述索引樹中存在所述壞節(jié)點時,根據(jù)對應的遍歷結(jié)果信息重建所述索引樹。
例如,參照圖7,假設(shè)在遍歷過程中發(fā)現(xiàn)page 4損壞,那么在遍歷結(jié)束后根據(jù)page 3、page 5、page 6、page 7記錄的數(shù)據(jù)重建所述索引樹;假設(shè)在遍歷過程中發(fā)現(xiàn)page 1損壞,無法訪問其子節(jié)點page 3、page 4、page5,那么在遍歷結(jié)束后根據(jù)page 5、page 6記錄的數(shù)據(jù)重建所述索引樹;假設(shè)在遍歷過程中發(fā)現(xiàn)page 1和page 5損壞,那么在遍歷結(jié)束后根據(jù)page 6記錄的數(shù)據(jù)重建所述索引樹;假設(shè)在遍歷過程中發(fā)現(xiàn)page 0損壞,即根節(jié)點損壞,那么認為無法恢復所述索引樹,不再向下層遍歷所述索引樹,而是直接重建所述索引樹。在此,均通過已有的B-tree構(gòu)建算法重建所述索引樹。例如,參照圖8,假設(shè)在構(gòu)建B樹的過程中依次插入鍵值分別為1、3、6、4、9、11、12的數(shù)據(jù),其中,每個葉子節(jié)點可以存儲2條數(shù)據(jù),然后根據(jù)葉子節(jié)點確定對應的非葉子節(jié)點的鍵值范圍,圖8簡單地示出該B樹的構(gòu)建過程。
然而,針對數(shù)據(jù)損壞場景,現(xiàn)有的數(shù)據(jù)恢復工具通常是根據(jù)表結(jié)構(gòu),離線從ibd文件(MySQL數(shù)據(jù)庫的數(shù)據(jù)文件、索引文件)中提取有效數(shù)據(jù),并生成數(shù)據(jù)集文件,用戶再重建表并導入數(shù)據(jù)。在恢復損壞數(shù)據(jù)之前,數(shù)據(jù)庫實例處于離線狀態(tài),無法提供服務。
與現(xiàn)有技術(shù)相比,當所述索引樹中存在所述壞節(jié)點時,本申請根據(jù)對應的遍歷結(jié)果信息重建所述索引樹,僅讓損壞數(shù)據(jù)離線,重建后的所述索引樹依然可以為用戶提供服務。
圖5示出根據(jù)本申請一個優(yōu)選實施例的一種用于恢復樹形數(shù)據(jù)存儲的設(shè)備1,其中,設(shè)備1包括索引樹遍歷裝置11’、索引樹重建裝置12’、備份數(shù)據(jù)接收裝置13’和更新裝置14’。
具體地,所述索引樹遍歷裝置11’深度優(yōu)先遍歷數(shù)據(jù)存儲對應的索引樹,在遍歷過程中記錄所述壞節(jié)點的數(shù)據(jù)損壞范圍,報告所述數(shù)據(jù)損壞范圍,其中,所述索引樹中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點;所述索引樹重建裝置12’當所述索引樹中存在所述壞節(jié)點時,根據(jù)對應的遍歷結(jié)果信息重建所述索引樹;所述備份數(shù)據(jù)接收裝置13’接收所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù);所述更新裝置14’根據(jù)所述備份數(shù)據(jù)更新重建后的所述索引樹。
在此,所述索引樹重建裝置12’與圖4中索引樹重建裝置12的內(nèi)容相同或基本相同。
相比圖4中索引樹遍歷裝置11,所述索引樹遍歷裝置11’在遍歷過程中還記錄所述壞節(jié)點的數(shù)據(jù)損壞范圍,報告所述數(shù)據(jù)損壞范圍。
例如,用所述遞歸算法對圖7所示的B-tree結(jié)構(gòu)的索引樹進行遍歷,在遍歷過程中跳過所述索引樹中數(shù)據(jù)損壞的壞節(jié)點。假設(shè)page 0損壞,即根節(jié)點損壞,那么不再向下層遍歷所述索引樹,并記錄page 0涉及的數(shù)據(jù)范圍,即所述數(shù)據(jù)損壞范圍包括所述索引樹中的全部數(shù)據(jù);假設(shè)page 1損壞,無法訪問其子節(jié)點page 3、page 4、page 5,根據(jù)圖7所示的鍵值,那么所述數(shù)據(jù)損壞范圍包括所有鍵值小于等于50的數(shù)據(jù),記錄所述數(shù)據(jù)損壞范圍;假設(shè)page 4損壞,根據(jù)圖7所示的鍵值,那么所述數(shù)據(jù)損壞范圍可能為(25,45],記錄所述數(shù)據(jù)損壞范圍。在此,可以在結(jié)束遍歷所述索引樹之后,將遍歷過程中檢查到的所述數(shù)據(jù)損壞范圍返回至用戶設(shè)備(數(shù)據(jù)庫管理員所使用的設(shè)備),報告給用戶(數(shù)據(jù)庫管理員);也可以在發(fā)現(xiàn)數(shù)據(jù)損壞時,即報告所述數(shù)據(jù)損壞范圍。
優(yōu)選地,所述備份數(shù)據(jù)接收裝置13’接收所述數(shù)據(jù)損壞范圍對應的備份數(shù) 據(jù);所述更新裝置14’根據(jù)所述備份數(shù)據(jù)更新重建后的所述索引樹。
例如,用戶可以根據(jù)所述數(shù)據(jù)損壞范圍,從備份或者備庫實例中拉取所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù)。具體地,用戶可以根據(jù)所述數(shù)據(jù)損壞范圍對應的B-tree鍵值,從備份或者備庫實例中找到對應的備份數(shù)據(jù)。在接收到用戶設(shè)備發(fā)送的所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù)之后,通過已有的B-tree算法將所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù)插入重建后的聚集索引(所述索引樹)中,以更新重建后的所述索引樹。
與現(xiàn)有技術(shù)相比,本申請向用戶報告所述數(shù)據(jù)損壞范圍,指導用戶從備份或者備庫實例中拉取所述數(shù)據(jù)損壞范圍對應的備份數(shù)據(jù),便于用戶操作,提升了用戶體驗。
圖6示出根據(jù)本申請另一個優(yōu)選實施例的一種用于恢復樹形數(shù)據(jù)存儲的設(shè)備1,其中,設(shè)備1包括索引樹遍歷裝置11”、索引樹重建裝置12”、二級索引遍歷裝置15”、二級索引重建裝置16”、備份數(shù)據(jù)接收裝置13”和更新裝置14”。
在此,所述索引樹遍歷裝置11”、索引樹重建裝置12”、備份數(shù)據(jù)接收裝置13”、更新裝置14”與圖5中索引樹遍歷裝置11’、索引樹重建裝置12’、備份數(shù)據(jù)接收裝置13’、更新裝置14’的內(nèi)容相同或基本相同,為簡明起見,不再贅述。
具體地,所述二級索引遍歷裝置15”深度優(yōu)先遍歷所述數(shù)據(jù)存儲對應的二級索引,其中,所述二級索引中的上層節(jié)點描述了對應下層節(jié)點的數(shù)據(jù)范圍;所述二級索引重建裝置16”在遍歷過程中,若發(fā)現(xiàn)所述二級索引中存在數(shù)據(jù)損壞的節(jié)點,根據(jù)所述索引樹或重建后的所述索引樹重建所述二級索引。
在此,所述二級索引是根據(jù)二級索引鍵構(gòu)建的索引樹。在具體的實施例中,在深度優(yōu)先遍歷所述數(shù)據(jù)存儲對應的根據(jù)聚集索引鍵構(gòu)建的索引樹(即聚集索引)之后,再深度優(yōu)先遍歷所述數(shù)據(jù)存儲對應的根據(jù)二級索引鍵構(gòu)建的索引樹(即二級索引)。優(yōu)選地,所述根據(jù)二級索引鍵構(gòu)建的索引樹包括B樹、B-樹或B+樹。只要在遍歷二級索引的過程中發(fā)現(xiàn)數(shù)據(jù)損壞的節(jié)點,不再繼續(xù)遍歷,根據(jù)所述聚集索引重建所述二級索引。
例如,聚集索引包含了行的全部數(shù)據(jù),假設(shè)表t1上包含列(c1,c2,c3,c4), 將c1定義為聚集索引鍵,c2、c3定義為二級索引鍵。聚集索引包含列為(c1,c2,c3,c4),也即全部數(shù)據(jù);二級索引包含(c2,c3,c1),包含二級索引鍵值和聚集索引鍵值,其中,聚集索引鍵值用于快速定位到全部數(shù)據(jù)記錄。假設(shè)查詢條件包含c2、c3,但想得到的數(shù)據(jù)是c4,就可以通過c2、c3查詢二級索引,找到對應的聚集索引鍵值c1,再通過c1查詢聚集索引,找到c4的值。那么在根據(jù)所述聚集索引重建所述二級索引時,因為聚集索引包含了全行的數(shù)據(jù),所以可以讀取聚集索引中包含的二級索引鍵值列,然后通過已有的B-tree算法(參照圖8)重建所述二級索引。
需要注意的是,本申請可在軟件和/或軟件與硬件的組合體中被實施,例如,可采用專用集成電路(ASIC)、通用目的計算機或任何其他類似硬件設(shè)備來實現(xiàn)。在一個實施例中,本申請的軟件程序可以通過處理器執(zhí)行以實現(xiàn)上文所述步驟或功能。同樣地,本申請的軟件程序(包括相關(guān)的數(shù)據(jù)結(jié)構(gòu))可以被存儲到計算機可讀記錄介質(zhì)中,例如,RAM存儲器,磁或光驅(qū)動器或軟磁盤及類似設(shè)備。另外,本申請的一些步驟或功能可采用硬件來實現(xiàn),例如,作為與處理器配合從而執(zhí)行各個步驟或功能的電路。
另外,本申請的一部分可被應用為計算機程序產(chǎn)品,例如計算機程序指令,當其被計算機執(zhí)行時,通過該計算機的操作,可以調(diào)用或提供根據(jù)本申請的方法和/或技術(shù)方案。而調(diào)用本申請的方法的程序指令,可能被存儲在固定的或可移動的記錄介質(zhì)中,和/或通過廣播或其他信號承載媒體中的數(shù)據(jù)流而被傳輸,和/或被存儲在根據(jù)所述程序指令運行的計算機設(shè)備的工作存儲器中。在此,根據(jù)本申請的一個實施例包括一個裝置,該裝置包括用于存儲計算機程序指令的存儲器和用于執(zhí)行程序指令的處理器,其中,當該計算機程序指令被該處理器執(zhí)行時,觸發(fā)該裝置運行基于前述根據(jù)本申請的多個實施例的方法和/或技術(shù)方案。
對于本領(lǐng)域技術(shù)人員而言,顯然本申請不限于上述示范性實施例的細節(jié),而且在不背離本申請的精神或基本特征的情況下,能夠以其他的具體形式實現(xiàn)本申請。因此,無論從哪一點來看,均應將實施例看作是示范性的,而且是非限制性的,本申請的范圍由所附權(quán)利要求而不是上述說明限定,因此旨在將落在權(quán)利要求的等同要件的含義和范圍內(nèi)的所有變化涵括 在本申請內(nèi)。不應將權(quán)利要求中的任何附圖標記視為限制所涉及的權(quán)利要求。此外,顯然“包括”一詞不排除其他單元或步驟,單數(shù)不排除復數(shù)。裝置權(quán)利要求中陳述的多個單元或裝置也可以由一個單元或裝置通過軟件或者硬件來實現(xiàn)。第一,第二等詞語用來表示名稱,而并不表示任何特定的順序。