本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別涉及一種數(shù)據(jù)庫(kù)修復(fù)方法及裝置。
背景技術(shù):
目前,廣泛應(yīng)用于移動(dòng)終端、pc客戶端等領(lǐng)域的輕量級(jí)文件數(shù)據(jù)庫(kù),如,sqlite或sqlcipher等,在實(shí)際使用時(shí),極易受到客戶端文件系統(tǒng)損壞、設(shè)備斷電等客觀因素的影響,造成數(shù)據(jù)庫(kù)損壞,從而丟失數(shù)據(jù)。并且,輕量級(jí)數(shù)據(jù)庫(kù)由于具有輕量化的特點(diǎn),其本身并未提供一種可靠的修復(fù)機(jī)制,不能從損壞的數(shù)據(jù)庫(kù)讀出數(shù)據(jù),這將導(dǎo)致保存在數(shù)據(jù)庫(kù)里的用戶數(shù)據(jù)丟失,如聯(lián)系人、聊天記錄(微信),電話本、短信(手機(jī)基礎(chǔ)功能)等丟失。
以sqlite或sqlcipher數(shù)據(jù)庫(kù)為例,目前,對(duì)損壞的sqlite或sqlcipher數(shù)據(jù)庫(kù)進(jìn)行修復(fù)的方式是,通過(guò)使用sqlite命令行的“.dump”命令,來(lái)進(jìn)行數(shù)據(jù)修復(fù)。其原理是使用sqlite等數(shù)據(jù)庫(kù)現(xiàn)有的sql接口,通過(guò)執(zhí)行sql語(yǔ)句來(lái)遍歷所有數(shù)據(jù)表,并將現(xiàn)有數(shù)據(jù)轉(zhuǎn)換為新的sql語(yǔ)句輸出,在新的數(shù)據(jù)庫(kù)上執(zhí)行上述輸出的sql語(yǔ)句即可構(gòu)造出等效的數(shù)據(jù)庫(kù)。
但是,采用目前的修復(fù)方式修復(fù)數(shù)據(jù)庫(kù)之前,需要利用數(shù)據(jù)庫(kù)自身的機(jī)制,打開(kāi)數(shù)據(jù)庫(kù),而當(dāng)數(shù)據(jù)庫(kù)的文件頭或者sqlite_master表?yè)p壞時(shí),數(shù)據(jù)庫(kù)將完全不可讀,即無(wú)法打開(kāi)數(shù)據(jù)庫(kù),從而也無(wú)法對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)。且由于數(shù)據(jù)庫(kù)本身的機(jī)制,數(shù)據(jù)庫(kù)的文件頭需要頻繁的讀寫,從而使文件頭的損壞率極高,從而使得現(xiàn)有的修復(fù)方式,修復(fù)的成功率較低。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明旨在至少在一定程度上解決相關(guān)技術(shù)中的技術(shù)問(wèn)題之一。
為此,本發(fā)明的第一個(gè)目的在于提出一種數(shù)據(jù)庫(kù)修復(fù)方法,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
本發(fā)明的第二個(gè)目的在于提出一種數(shù)據(jù)庫(kù)修復(fù)裝置。
本發(fā)明的第三個(gè)目的在于提出一種終端。
本發(fā)明的第四個(gè)目的在于提出一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。
本發(fā)明的第五個(gè)目的在于提出一種計(jì)算機(jī)程序產(chǎn)品。
為達(dá)上述目的,本發(fā)明第一方面實(shí)施例提供一種數(shù)據(jù)庫(kù)修復(fù)方法,該方法包括:
根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定所述數(shù)據(jù)庫(kù)滿足修復(fù)條件;
獲取已備份的元數(shù)據(jù),其中,所述已備份的元數(shù)據(jù)中,包括第一表名組,和與第一表名組分別對(duì)應(yīng)的第一根節(jié)點(diǎn)組;
根據(jù)所述已備份的元數(shù)據(jù),獲取所述數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組;
根據(jù)所述第一表名組和第一用戶數(shù)據(jù)組,對(duì)所述數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名組和第一數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。由此,通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
為達(dá)上述目的,本發(fā)明第二方面實(shí)施例提供一種數(shù)據(jù)庫(kù)修復(fù)裝置,該裝置包括:
第一確定模塊,用于根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定所述數(shù)據(jù)庫(kù)滿足修復(fù)條件;
第一獲取模塊,用于獲取已備份的元數(shù)據(jù),其中,所述已備份的元數(shù)據(jù)中,包括第一表名組,和與第一表名組分別對(duì)應(yīng)的第一根節(jié)點(diǎn)組;
第二獲取模塊,用于根據(jù)所述已備份的元數(shù)據(jù),獲取所述數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組;
處理模塊,用于根據(jù)所述第一表名組和第一用戶數(shù)據(jù)組,對(duì)所述數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)裝置,首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名組和第一數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。由此,通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
為達(dá)上述目的,本發(fā)明第三方面實(shí)施例提供一種終端,包括:
存儲(chǔ)器、處理器及存儲(chǔ)在存儲(chǔ)器上并可在處理器上運(yùn)行的計(jì)算機(jī)程序,當(dāng)所述處理器執(zhí)行所述程序時(shí)實(shí)現(xiàn)如第一方面所述的數(shù)據(jù)庫(kù)修復(fù)方法。
本發(fā)明實(shí)施例提供的終端,首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名組和第一數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。由此,通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
為達(dá)上述目的,本發(fā)明第四方面實(shí)施例提供了一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其上存儲(chǔ)有計(jì)算機(jī)程序,該程序被處理器執(zhí)行時(shí)實(shí)現(xiàn)如第一方面所述的數(shù)據(jù)庫(kù)修復(fù)方法。
本發(fā)明實(shí)施例提供的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名組和第一數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。由此,通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
為達(dá)上述目的,本發(fā)明第五方面實(shí)施例提出了一種計(jì)算機(jī)程序產(chǎn)品,當(dāng)所述計(jì)算機(jī)程序產(chǎn)品中的指令處理器執(zhí)行時(shí),執(zhí)行如第一方面所述的數(shù)據(jù)庫(kù)修復(fù)方法。
本發(fā)明實(shí)施例提供的計(jì)算機(jī)程序產(chǎn)品,首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名組和第一數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。由此,通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不能限制本發(fā)明。
附圖說(shuō)明
此處的附圖被并入說(shuō)明書中并構(gòu)成本說(shuō)明書的一部分,示出了符合本發(fā)明的實(shí)施例,并與說(shuō)明書一起用于解釋本發(fā)明的原理。
圖1是根據(jù)一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖;
圖1a是根據(jù)一示例性實(shí)施例示出的b-tree的結(jié)構(gòu)示意圖;
圖1b是根據(jù)一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的應(yīng)用場(chǎng)景圖;
圖2是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖;
圖3是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖;
圖4是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖;
圖5是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖;
圖5a是根據(jù)一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的應(yīng)用場(chǎng)景圖;
圖6是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖;
圖7是根據(jù)一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)裝置的結(jié)構(gòu)框圖;
圖8是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)裝置的結(jié)構(gòu)框圖。
通過(guò)上述附圖,已示出本發(fā)明明確的實(shí)施例,后文中將有更詳細(xì)的描述。這些附圖和文字描述并不是為了通過(guò)任何方式限制本發(fā)明構(gòu)思的范圍,而是通過(guò)參考特定實(shí)施例為本領(lǐng)域技術(shù)人員說(shuō)明本發(fā)明的概念。
具體實(shí)施方式
這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說(shuō)明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本發(fā)明相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本發(fā)明的一些方面相一致的裝置和方法的例子。
下面參考附圖描述本發(fā)明實(shí)施例的數(shù)據(jù)庫(kù)修復(fù)方法及裝置。
現(xiàn)有的對(duì)損壞的數(shù)據(jù)庫(kù)進(jìn)行修復(fù)時(shí),以sqlite或sqlcipher數(shù)據(jù)庫(kù)為例,修復(fù)方式是通過(guò)使用sqlite命令行的“.dump”命令,來(lái)進(jìn)行數(shù)據(jù)修復(fù)。其原理是使用sqlite等數(shù)據(jù)庫(kù)現(xiàn)有的sql接口,通過(guò)執(zhí)行sql語(yǔ)句來(lái)遍歷所有數(shù)據(jù)表,并將現(xiàn)有數(shù)據(jù)轉(zhuǎn)換為新的sql語(yǔ)句輸出,在新的數(shù)據(jù)庫(kù)上執(zhí)行上述輸出的sql語(yǔ)句即可構(gòu)造出等效的數(shù)據(jù)庫(kù)。
但是,采用上述方式修復(fù)數(shù)據(jù)庫(kù)時(shí),在修復(fù)數(shù)據(jù)庫(kù)前需要使用數(shù)據(jù)庫(kù)自身的機(jī)制打開(kāi)數(shù)據(jù)庫(kù),而當(dāng)數(shù)據(jù)庫(kù)的文件頭或者sqlite_master表?yè)p壞時(shí),數(shù)據(jù)庫(kù)將完全不可讀。且,由于數(shù)據(jù)庫(kù)本身的機(jī)制,數(shù)據(jù)庫(kù)的文件頭需要頻繁的讀寫,這就導(dǎo)致了數(shù)據(jù)庫(kù)的文件頭損壞率極高,從而使得數(shù)據(jù)庫(kù)在損壞時(shí),無(wú)法打開(kāi)的幾率極高,也無(wú)法對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),因此采用現(xiàn)有的方式修復(fù)數(shù)據(jù)庫(kù)時(shí),修復(fù)的成功率較低。
另外,由于數(shù)據(jù)庫(kù)的數(shù)據(jù)之間存在層級(jí)關(guān)系,層級(jí)低的數(shù)據(jù)所處的位置,需要從層級(jí)高的解析數(shù)據(jù)中找到,通過(guò)逐層向下尋找,修復(fù)位于最底層的用戶數(shù)據(jù)。而目前的數(shù)據(jù)庫(kù)修復(fù)方式,在遍歷表的過(guò)程中,遇到錯(cuò)誤將終止遍歷,這就導(dǎo)致了現(xiàn)有的數(shù)據(jù)庫(kù)修復(fù)方式,僅能修復(fù)表開(kāi)頭到損壞處的數(shù)據(jù),剩余的數(shù)據(jù)將丟失。
例如,若一張表的前20%的數(shù)據(jù)是完好的,在20%處的節(jié)點(diǎn)被損壞,后80%的數(shù)據(jù)也是完好的。則利用現(xiàn)有的修復(fù)方式,修復(fù)數(shù)據(jù)庫(kù)時(shí),只能遍歷前20%的數(shù)據(jù),遍歷到20%處的損壞處,將終止遍歷,這就導(dǎo)致了只能修復(fù)前20%的數(shù)據(jù),盡管后80%的數(shù)據(jù)是完好的,仍然無(wú)法修復(fù)。
本發(fā)明針對(duì)采用目前的修復(fù)方式修復(fù)數(shù)據(jù)庫(kù)時(shí),需要打開(kāi)數(shù)據(jù)庫(kù),但由于數(shù)據(jù)庫(kù)的文件頭或者sqlite_master表?yè)p壞率極高,而文件頭損壞時(shí),無(wú)法打開(kāi)數(shù)據(jù)庫(kù),從而也無(wú)法對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),導(dǎo)致修復(fù)的成功率較低的問(wèn)題,提出一種數(shù)據(jù)庫(kù)修復(fù)方法,該方法通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,從而實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
下面結(jié)合附圖,對(duì)本申請(qǐng)?zhí)峁┑臄?shù)據(jù)庫(kù)修復(fù)方法、裝置及終端進(jìn)行詳細(xì)說(shuō)明。
圖1是根據(jù)一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖。
如圖1所示,該數(shù)據(jù)庫(kù)修復(fù)方法,包括以下步驟:
步驟101,根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件。
具體的,本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,可以由本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)裝置執(zhí)行。其中,數(shù)據(jù)庫(kù)修復(fù)裝置,可以被配置在任意終端中,如手機(jī)、電腦等,以對(duì)終端中被損壞的數(shù)據(jù)庫(kù)進(jìn)行修復(fù)。或者,也可以由本發(fā)明實(shí)施例提供的計(jì)算機(jī)程序產(chǎn)品執(zhí)行,其中,該計(jì)算機(jī)程序產(chǎn)品,可以被配置在數(shù)據(jù)庫(kù)中,以對(duì)被損壞的數(shù)據(jù)庫(kù)進(jìn)行修復(fù)。
可以理解的是,如sqlite或sqlcipher等輕量級(jí)文件數(shù)據(jù)庫(kù),在實(shí)際使用時(shí),極易受到客戶端文件系統(tǒng)損壞、設(shè)備斷電等客觀因素的影響,造成數(shù)據(jù)庫(kù)損壞,而根據(jù)數(shù)據(jù)庫(kù)本身的機(jī)制,數(shù)據(jù)庫(kù)損壞時(shí),會(huì)返回?fù)p壞錯(cuò)誤碼。
比如,以sqlite或sqlcipher數(shù)據(jù)庫(kù)為例,當(dāng)數(shù)據(jù)庫(kù)發(fā)生不同的損壞時(shí),會(huì)上報(bào)不同的損壞錯(cuò)誤碼。例如,當(dāng)數(shù)據(jù)庫(kù)被損壞后,可能會(huì)上報(bào)sqlite_corrupt,表示數(shù)據(jù)庫(kù)磁盤映像不正確;或者上報(bào)sqlite_notade,表示被打開(kāi)的不是一個(gè)數(shù)據(jù)庫(kù)文件;或者上報(bào)sqlite_cantopen,表示無(wú)法打開(kāi)數(shù)據(jù)庫(kù)文件;或者上報(bào)sqlite_internal,表示sqlite內(nèi)部邏輯錯(cuò)誤;或者上報(bào)sqlite_protocol,表示數(shù)據(jù)庫(kù)鎖定協(xié)議錯(cuò)誤;或者上報(bào)sqlite_error,表示sql錯(cuò)誤或丟失數(shù)據(jù)庫(kù),等等。
因此,在本發(fā)明實(shí)施例中,可以根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)是否滿足修復(fù)條件。
具體實(shí)現(xiàn)時(shí),可以根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼的數(shù)量和/或類型,確定數(shù)據(jù)庫(kù)是否滿足修復(fù)條件,從而確定數(shù)據(jù)庫(kù)是否需要修復(fù)。
具體的,可以預(yù)先設(shè)置一個(gè)閾值,當(dāng)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼的數(shù)量達(dá)到預(yù)設(shè)的閾值時(shí),則確定數(shù)據(jù)庫(kù)滿足修復(fù)條件。
比如,可以預(yù)先設(shè)置當(dāng)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼達(dá)到2個(gè)時(shí),確定數(shù)據(jù)庫(kù)滿足修復(fù)條件。則若數(shù)據(jù)庫(kù)上報(bào)了任意2個(gè)損壞錯(cuò)誤碼,即可確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,從而確定數(shù)據(jù)庫(kù)需要修復(fù)。
或者,可以預(yù)先設(shè)置一個(gè)損壞錯(cuò)誤碼的類型,當(dāng)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼的類型與預(yù)先設(shè)置的類型相同時(shí),則確定數(shù)據(jù)庫(kù)滿足修復(fù)條件。
比如,可以預(yù)先設(shè)置數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼為sqlite_corrupt類型時(shí),確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,則若數(shù)據(jù)庫(kù)上報(bào)了該類型的損壞錯(cuò)誤碼后,即可確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,從而確定數(shù)據(jù)庫(kù)需要修復(fù)。
或者,可以預(yù)先設(shè)置損壞錯(cuò)誤碼的類型及數(shù)量,當(dāng)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼的類型及數(shù)量與預(yù)先設(shè)置的類型及數(shù)量相同時(shí),則確定數(shù)據(jù)庫(kù)滿足修復(fù)條件。
比如,可以預(yù)先設(shè)置數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼為sqlite_corrupt和sqlite_notade2個(gè)時(shí),確定數(shù)據(jù)庫(kù)滿足修復(fù)條件。則若數(shù)據(jù)庫(kù)上報(bào)了sqlite_corrupt和sqlite_notade2個(gè)損壞錯(cuò)誤碼時(shí),即可確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,從而確定數(shù)據(jù)庫(kù)需要修復(fù)。若數(shù)據(jù)庫(kù)上報(bào)的錯(cuò)誤碼為sqlite_corrupt和sqlite_protocol2個(gè)損壞錯(cuò)誤碼時(shí),則確定數(shù)據(jù)庫(kù)不滿足修復(fù)條件,不需要修復(fù)。
或者,可以預(yù)先設(shè)置數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼為2個(gè),其中一個(gè)為sqlite_corrupt時(shí),確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,則若數(shù)據(jù)庫(kù)上報(bào)了sqlite_corrupt和sqlite_notade2個(gè)損壞錯(cuò)誤碼時(shí),或sqlite_corrupt和sqlite_protocol2個(gè)損壞錯(cuò)誤碼時(shí),都可確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,從而確定數(shù)據(jù)庫(kù)需要修復(fù)等等。
需要說(shuō)明的是,上述判斷數(shù)據(jù)庫(kù)是否滿足修復(fù)條件的實(shí)例,僅是示意性說(shuō)明,不能作為對(duì)本申請(qǐng)技術(shù)方案的限制,本領(lǐng)域技術(shù)人員在此基礎(chǔ)上,可以根據(jù)需要任意設(shè)置數(shù)據(jù)庫(kù)修復(fù)條件,此處對(duì)此不作限定。
步驟102,獲取已備份的元數(shù)據(jù)。
其中,已備份的元數(shù)據(jù)中,包括第一表名組,和與第一表名組分別對(duì)應(yīng)的第一根節(jié)點(diǎn)組。
步驟103,根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組。
其中,第一用戶數(shù)據(jù)組,指數(shù)據(jù)庫(kù)中,第一表名組對(duì)應(yīng)的各表中的全部用戶數(shù)據(jù)。
需要說(shuō)明的是,第一表名組中可以包括一個(gè)或多個(gè)表的名稱,相應(yīng)的第一根節(jié)點(diǎn)組中,也可以包括一個(gè)或多個(gè)根節(jié)點(diǎn)。
可以理解的是,以sqlite或sqlcipher數(shù)據(jù)庫(kù)為例,sqlite_master是sqlite或sqlcipher數(shù)據(jù)庫(kù)自帶的系統(tǒng)表,它存儲(chǔ)了其它所有表的元數(shù)據(jù),元數(shù)據(jù)中的表名組和根節(jié)點(diǎn)組存在對(duì)應(yīng)關(guān)系,根據(jù)對(duì)應(yīng)關(guān)系,即可找到表名對(duì)應(yīng)的表的位置。而表的結(jié)構(gòu)是開(kāi)發(fā)人員自己定義的,表由多個(gè)頁(yè)組成,每一頁(yè)為一個(gè)節(jié)點(diǎn),頁(yè)之間構(gòu)成b-tree,如圖1a所示。b-tree有中間頁(yè)和葉子頁(yè)兩種類型,樹(shù)底部的頁(yè)為葉子頁(yè),除此之外都為中間頁(yè)。中間頁(yè)存儲(chǔ)了其下層節(jié)點(diǎn)的key(密鑰)所在的范圍和在數(shù)據(jù)庫(kù)中的頁(yè)碼,相當(dāng)于索引,葉子頁(yè)存儲(chǔ)了該表真正的數(shù)據(jù)。根據(jù)元數(shù)據(jù)包括的表名組和根節(jié)點(diǎn)組,確定了表的位置后,即可打開(kāi)相應(yīng)的表,進(jìn)而通過(guò)表的中間頁(yè)逐層向下查找,獲取葉子頁(yè)中的數(shù)據(jù)組。
具體實(shí)現(xiàn)時(shí),可以在數(shù)據(jù)庫(kù)未損壞時(shí),對(duì)數(shù)據(jù)庫(kù)中,sqlite_master存儲(chǔ)的其它所有表的元數(shù)據(jù)進(jìn)行備份,從而在數(shù)據(jù)庫(kù)需要修復(fù)時(shí),可以從已備份的數(shù)據(jù)庫(kù)中獲取元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù)中的第一表名組和第一根節(jié)點(diǎn)組,找到第一表名組對(duì)應(yīng)的表的位置,從而獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組。
需要說(shuō)明的是,具體的對(duì)元數(shù)據(jù)進(jìn)行備份的過(guò)程,將在下述實(shí)施例中進(jìn)行詳細(xì)介紹,此處不作說(shuō)明。
步驟104,根據(jù)第一表名組和第一用戶數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
可以理解的是,除了表名組和用戶數(shù)據(jù)組之外,數(shù)據(jù)庫(kù)的索引和表結(jié)構(gòu),對(duì)數(shù)據(jù)庫(kù)起著至關(guān)重要的作用。索引含有關(guān)鍵字段的值和指向?qū)嶋H記錄位置的指針,這些值和指針按照特定的順序存儲(chǔ),從而可以以較快的速度查找到所需要的用戶數(shù)據(jù)。而表結(jié)構(gòu)包括一個(gè)表的字段、類型等基本屬性。因此,獲取了數(shù)據(jù)庫(kù)中的第一表名組和第一用戶數(shù)據(jù)組后,還可以恢復(fù)數(shù)據(jù)庫(kù)的索引和表結(jié)構(gòu)。
具體實(shí)現(xiàn)時(shí),由于表是由開(kāi)發(fā)人員自行定義的,因此在進(jìn)行數(shù)據(jù)庫(kù)修復(fù)時(shí),業(yè)務(wù)層可以根據(jù)表名直接獲得表的數(shù)據(jù)結(jié)構(gòu)和索引。在本發(fā)明實(shí)施例中,確定了第一表名組和第一用戶數(shù)據(jù)組后,即可根據(jù)第一表名組中的各表名,獲得各個(gè)表的表結(jié)構(gòu)和索引,并將第一用戶數(shù)據(jù)組根據(jù)表結(jié)構(gòu)和索引,寫入數(shù)據(jù)庫(kù),從而完成對(duì)數(shù)據(jù)庫(kù)的修復(fù)處理。
可以理解的是,利用現(xiàn)有技術(shù),進(jìn)行數(shù)據(jù)庫(kù)修復(fù)時(shí),由于數(shù)據(jù)庫(kù)本身的機(jī)制,數(shù)據(jù)庫(kù)的文件頭需要頻繁的讀寫,這就導(dǎo)致了數(shù)據(jù)庫(kù)的文件頭損壞率極高,從而使得無(wú)法打開(kāi)數(shù)據(jù)庫(kù),也無(wú)法對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),因此采用現(xiàn)有的方式修復(fù)數(shù)據(jù)庫(kù)時(shí),修復(fù)的成功率較低。而本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,通過(guò)對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份,從而在數(shù)據(jù)庫(kù)的文件頭損壞時(shí),仍然可以根據(jù)已備份的元數(shù)據(jù)中的第一表名組及第一根節(jié)點(diǎn)組,獲取第一用戶數(shù)據(jù)組,以對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率。
另外,利用現(xiàn)有技術(shù),進(jìn)行數(shù)據(jù)庫(kù)修復(fù)時(shí),由于數(shù)據(jù)之間存在層級(jí)關(guān)系,層級(jí)低的數(shù)據(jù)所處的位置,需要從層級(jí)高的解析數(shù)據(jù)找到,通過(guò)逐層向下尋找,修復(fù)位于最底層的用戶數(shù)據(jù),被損壞的節(jié)點(diǎn)層級(jí)越高,丟失的數(shù)據(jù)越多,修復(fù)效果越差。而本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,通過(guò)對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份,從而在數(shù)據(jù)庫(kù)的高層級(jí)節(jié)點(diǎn)被損壞時(shí),也可以根據(jù)備份的元數(shù)據(jù),獲取被損壞的節(jié)點(diǎn)下層的數(shù)據(jù),而不至于丟失大量的數(shù)據(jù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果。
舉例來(lái)說(shuō),假設(shè)若一張表的前20%的數(shù)據(jù)是完好的,在20%處的節(jié)點(diǎn)被損壞,后80%的數(shù)據(jù)也是完好的,則利用現(xiàn)有的修復(fù)方式,修復(fù)數(shù)據(jù)庫(kù)時(shí),只能遍歷前20%的數(shù)據(jù),遍歷到20%處的損壞處,將終止遍歷,這就導(dǎo)致了只能修復(fù)前20%的數(shù)據(jù),盡管后80%的數(shù)據(jù)是完好的,仍然無(wú)法修復(fù)。而本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,可以對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份,只要第一表名組及第一根節(jié)點(diǎn)組中包括了數(shù)據(jù)中的所有表名,那么根據(jù)已備份的元數(shù)據(jù)進(jìn)行數(shù)據(jù)修復(fù)時(shí),不僅可以獲取前20%的用戶數(shù)據(jù),還可以獲取20%的節(jié)點(diǎn)后的80%的用戶數(shù)據(jù),從而對(duì)整個(gè)表的用戶數(shù)據(jù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果。
需要說(shuō)明的是,在本發(fā)明實(shí)施例中,利用第一表名組和第一用戶數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理時(shí),還可以根據(jù)待修復(fù)數(shù)據(jù)的重要性,預(yù)先設(shè)置對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理的方式。例如,可以根據(jù)待修復(fù)數(shù)據(jù)的重要性,將待修復(fù)數(shù)據(jù)分成不同的等級(jí),并預(yù)先設(shè)置待修復(fù)數(shù)據(jù)的等級(jí)與對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理的方式之間的對(duì)應(yīng)關(guān)系,從而在確定數(shù)據(jù)庫(kù)滿足修復(fù)條件時(shí),根據(jù)已備份的元數(shù)據(jù),獲取了第一表名組和第一用戶數(shù)據(jù)組后,可以根據(jù)待修復(fù)數(shù)據(jù)的不同等級(jí),以對(duì)應(yīng)的修復(fù)方式,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
比如,可以根據(jù)待修復(fù)數(shù)據(jù)的重要性,設(shè)置重要性高的待修復(fù)數(shù)據(jù),對(duì)應(yīng)的數(shù)據(jù)庫(kù)修復(fù)處理方式為,在不打擾用戶的情況下,通過(guò)彈窗提示用戶進(jìn)行數(shù)據(jù)修復(fù);重要性低的待修復(fù)數(shù)據(jù),對(duì)應(yīng)的數(shù)據(jù)庫(kù)修復(fù)處理方式為,不通知用戶,在后臺(tái)修復(fù)。則在確定數(shù)據(jù)庫(kù)滿足修復(fù)條件后,若待修復(fù)數(shù)據(jù)重要性高,則通過(guò)彈窗提示用戶進(jìn)行修復(fù)。
舉例來(lái)說(shuō),若數(shù)據(jù)庫(kù)中的文件發(fā)生損壞,可能導(dǎo)致用戶的部分聊天記錄丟失,而用戶的聊天記錄屬于重要數(shù)據(jù),則可以通過(guò)如圖1b所示的彈窗,提示用戶進(jìn)行修復(fù)。在用戶通過(guò)點(diǎn)擊或滑動(dòng)等操作觸控“開(kāi)始修復(fù)”的按鈕后,即可對(duì)待修復(fù)數(shù)據(jù)進(jìn)行修復(fù)?;蛘撸魯?shù)據(jù)庫(kù)中的文件發(fā)生損壞,可能導(dǎo)致用戶的賬號(hào)頭像發(fā)生變化,而用戶的賬號(hào)頭像屬于不重要的數(shù)據(jù),則可以不通知用戶,直接在后臺(tái)進(jìn)行修復(fù),等等。
另外,還可以根據(jù)用戶的需要,由用戶設(shè)置對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理的方式。例如,若用戶認(rèn)為對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)時(shí),通過(guò)彈窗進(jìn)行提示,會(huì)影響用戶對(duì)終端的使用,則可以設(shè)置對(duì)任意待修復(fù)數(shù)據(jù)進(jìn)行修復(fù)時(shí),都在后臺(tái)進(jìn)行,從而避免被打擾。或者,用戶希望了解對(duì)數(shù)據(jù)庫(kù)的修復(fù)過(guò)程,則可以設(shè)置數(shù)據(jù)庫(kù)發(fā)生任意損壞時(shí),都通過(guò)彈窗提示用戶,等等。從而在確定數(shù)據(jù)庫(kù)滿足修復(fù)條件時(shí),根據(jù)已備份的元數(shù)據(jù),獲取了第一表名組和第一用戶數(shù)據(jù)組后,根據(jù)用戶設(shè)置的修復(fù)方式,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名組和第一數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。由此,通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
圖2是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖。
如圖2所示,該數(shù)據(jù)庫(kù)修復(fù)方法,包括以下步驟:
步驟201,在數(shù)據(jù)庫(kù)啟動(dòng)后,以預(yù)設(shè)的時(shí)間間隔對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份。
其中,元數(shù)據(jù)包括表名組和根節(jié)點(diǎn)組。
具體的,本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,可以由本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)裝置執(zhí)行。其中,數(shù)據(jù)庫(kù)修復(fù)裝置,可以被配置在任意終端中,如手機(jī)、電腦等,以對(duì)終端中被損壞的數(shù)據(jù)庫(kù)進(jìn)行修復(fù)?;蛘?,也可以由本發(fā)明實(shí)施例提供的計(jì)算機(jī)程序產(chǎn)品執(zhí)行,其中,該計(jì)算機(jī)程序產(chǎn)品,可以被配置在數(shù)據(jù)庫(kù)中,以對(duì)被損壞的數(shù)據(jù)庫(kù)進(jìn)行修復(fù)。
其中,預(yù)設(shè)的時(shí)間間隔,可以是由開(kāi)發(fā)人員預(yù)先設(shè)定的,或者,也可以是由用戶根據(jù)需要,自行定義的。
例如,開(kāi)發(fā)人員可以預(yù)先設(shè)置對(duì)數(shù)據(jù)庫(kù)中所有的元數(shù)據(jù)以相同時(shí)間間隔進(jìn)行備份;或者,開(kāi)發(fā)人員可以預(yù)先設(shè)置以不同的時(shí)間間隔對(duì)不同數(shù)據(jù)對(duì)應(yīng)的元數(shù)據(jù)進(jìn)行備份;或者,開(kāi)發(fā)人員可以根據(jù)各數(shù)據(jù)的損壞頻率,設(shè)置對(duì)損壞頻率較高的數(shù)據(jù)對(duì)應(yīng)的元數(shù)據(jù)以較短的時(shí)間間隔進(jìn)行備份,設(shè)置對(duì)損壞頻率較低的數(shù)據(jù)對(duì)應(yīng)的元數(shù)據(jù)以較長(zhǎng)的時(shí)間間隔進(jìn)行備份;或者,用戶也可以根據(jù)數(shù)據(jù)的重要性,設(shè)置對(duì)數(shù)據(jù)庫(kù)中重要數(shù)據(jù)對(duì)應(yīng)的元數(shù)據(jù)以較短的時(shí)間間隔進(jìn)行備份,對(duì)數(shù)據(jù)庫(kù)中不太重要的數(shù)據(jù)對(duì)應(yīng)的元數(shù)據(jù)以較長(zhǎng)的時(shí)間間隔進(jìn)行備份,等等。從而在數(shù)據(jù)庫(kù)啟動(dòng)后,以預(yù)設(shè)的時(shí)間間隔,自動(dòng)對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份。
例如,假設(shè)數(shù)據(jù)庫(kù)中包括用戶使用某應(yīng)用過(guò)程中的瀏覽記錄、通訊錄、聊天記錄等等的數(shù)據(jù),則開(kāi)發(fā)人員可以預(yù)先設(shè)置在數(shù)據(jù)庫(kù)啟動(dòng)后,對(duì)瀏覽記錄、通訊錄、聊天記錄分別對(duì)應(yīng)的元數(shù)據(jù)都以2小時(shí)的時(shí)間間隔進(jìn)行備份。或者,開(kāi)發(fā)人員可以預(yù)先設(shè)置在數(shù)據(jù)庫(kù)啟動(dòng)后,對(duì)瀏覽記錄對(duì)應(yīng)的元數(shù)據(jù)以3小時(shí)的時(shí)間間隔進(jìn)行備份,對(duì)通訊錄對(duì)應(yīng)的元數(shù)據(jù)以2小時(shí)的時(shí)間間隔進(jìn)行備份,對(duì)聊天記錄對(duì)應(yīng)的元數(shù)據(jù)以1小時(shí)的時(shí)間間隔進(jìn)行備份?;蛘撸_(kāi)發(fā)人員可以根據(jù)各數(shù)據(jù)的損壞頻率,設(shè)置對(duì)損壞頻率較高的數(shù)據(jù)對(duì)應(yīng)的元數(shù)據(jù)以30分鐘的時(shí)間間隔進(jìn)行備份,設(shè)置對(duì)損壞頻率較低的數(shù)據(jù)對(duì)應(yīng)的元數(shù)據(jù)以2小時(shí)的時(shí)間間隔進(jìn)行備份?;蛘?,用戶認(rèn)為通訊錄很重要,聊天記錄和瀏覽記錄不重要,也可以設(shè)置以30分鐘的時(shí)間間隔對(duì)通訊錄對(duì)應(yīng)的元數(shù)據(jù)進(jìn)行備份,以2小時(shí)的時(shí)間間隔對(duì)聊天記錄和瀏覽記錄分別對(duì)應(yīng)的元數(shù)據(jù)進(jìn)行備份,等等。從而在數(shù)據(jù)庫(kù)啟動(dòng)后,以預(yù)設(shè)的時(shí)間間隔,自動(dòng)對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份。
步驟202,根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼的數(shù)量和/或類型,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件。
步驟203,獲取已備份的元數(shù)據(jù)。
其中,已備份的元數(shù)據(jù)中,包括第一表名組,和與第一表名組分別對(duì)應(yīng)的第一根節(jié)點(diǎn)組。
步驟204,根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組。
步驟205,根據(jù)第一表名組和第一用戶數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
其中,上述步驟202-步驟205的具體實(shí)現(xiàn)過(guò)程和原理,可以參照上述實(shí)施例中步驟101-步驟104的詳細(xì)描述,此處不再贅述。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,首先在數(shù)據(jù)庫(kù)啟動(dòng)后,以預(yù)設(shè)的時(shí)間間隔對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份,然后根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼的數(shù)量和/或類型,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,再獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名和第一用戶數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
通過(guò)上述分析可知,可以在數(shù)據(jù)庫(kù)啟動(dòng)后,以預(yù)設(shè)的時(shí)間間隔對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份,從而在數(shù)據(jù)庫(kù)損壞時(shí),根據(jù)已備份的元數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。在實(shí)際運(yùn)用中,還可以在數(shù)據(jù)庫(kù)中的用戶數(shù)據(jù)發(fā)生改變時(shí),對(duì)新新寫入的用戶數(shù)據(jù)進(jìn)行備份,下面結(jié)合圖3,對(duì)本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法進(jìn)行進(jìn)一步說(shuō)明。
圖3是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖。
如圖3所示,該數(shù)據(jù)庫(kù)修復(fù)方法,包括以下步驟:
步驟301,在確定數(shù)據(jù)庫(kù)有新的葉子頁(yè)數(shù)據(jù)寫入時(shí),對(duì)葉子頁(yè)數(shù)據(jù)進(jìn)行備份。
需要說(shuō)明的是,為實(shí)現(xiàn)本實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,可以通過(guò)在數(shù)據(jù)庫(kù)中增加一個(gè)備份接口,并設(shè)置當(dāng)數(shù)據(jù)庫(kù)中有新的葉子頁(yè)數(shù)據(jù)寫入時(shí),即可將寫入的葉子頁(yè)數(shù)據(jù)發(fā)送至備份接口,從而本申請(qǐng)?zhí)峁┑臄?shù)據(jù)庫(kù)修復(fù)裝置,即可通過(guò)監(jiān)控?cái)?shù)據(jù)庫(kù)的備份接口,來(lái)確定是否有新的葉子頁(yè)數(shù)據(jù)寫入。
具體的,數(shù)據(jù)庫(kù)可以通過(guò)回調(diào)函數(shù)的形式,向備份接口發(fā)送新的葉子頁(yè)數(shù)據(jù)。也就是說(shuō),當(dāng)數(shù)據(jù)庫(kù)寫入一個(gè)新的頁(yè)時(shí),數(shù)據(jù)庫(kù)即可向備份接口發(fā)送回調(diào)函數(shù),在本發(fā)明實(shí)施例中,可以截獲數(shù)據(jù)庫(kù)發(fā)送的回調(diào)函數(shù),并根據(jù)回調(diào)函數(shù)中包括的頁(yè)數(shù)據(jù)的類型,判斷頁(yè)數(shù)據(jù)類型是否為葉子頁(yè),若是,則確定數(shù)據(jù)庫(kù)有新的葉子頁(yè)數(shù)據(jù)寫入,從而對(duì)新寫入的葉子頁(yè)數(shù)據(jù)進(jìn)行備份。
即,步驟301,具體可以包括:
一,截獲數(shù)據(jù)庫(kù)發(fā)送的回調(diào)函數(shù),回調(diào)函數(shù)中包括頁(yè)數(shù)據(jù)的類型。
二,判斷頁(yè)數(shù)據(jù)的類型,是否為葉子頁(yè)。
三,若是,則確定數(shù)據(jù)庫(kù)有新的葉子頁(yè)數(shù)據(jù)寫入。
四,對(duì)葉子頁(yè)數(shù)據(jù)進(jìn)行備份。
舉例來(lái)說(shuō),假設(shè)數(shù)據(jù)庫(kù)中,用戶的通訊錄新增加了聯(lián)系人及其個(gè)人信息,則數(shù)據(jù)庫(kù)即可向備份接口發(fā)送回調(diào)函數(shù),本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)裝置,即可截獲數(shù)據(jù)庫(kù)發(fā)送的回調(diào)函數(shù),并在確定新寫入的數(shù)據(jù)為葉子頁(yè)數(shù)據(jù)后,對(duì)新寫入的葉子頁(yè)數(shù)據(jù),即用戶的聯(lián)系人數(shù)據(jù)進(jìn)行備份。
另外,由于數(shù)據(jù)庫(kù)中不同的表,通常都包含葉子頁(yè),因此,在本發(fā)明實(shí)施例中,數(shù)據(jù)庫(kù)發(fā)送的回調(diào)函數(shù)中,還可以包括表名,從而在確定數(shù)據(jù)庫(kù)有新的葉子頁(yè)數(shù)據(jù)寫入時(shí),可以根據(jù)表名,將葉子頁(yè)數(shù)據(jù)存儲(chǔ)在表名對(duì)應(yīng)的表中。
即,步驟301中,對(duì)葉子頁(yè)數(shù)據(jù)進(jìn)行備份,具體可以包括:
將葉子頁(yè)數(shù)據(jù)存儲(chǔ)在表名對(duì)應(yīng)的表中。
舉例來(lái)說(shuō),假設(shè)用戶的通訊錄為數(shù)據(jù)庫(kù)中的一個(gè)表,用戶的通訊錄新增加了聯(lián)系人及其個(gè)人信息時(shí),數(shù)據(jù)庫(kù)即可向備份接口發(fā)送包含表名為“通訊錄”的回調(diào)函數(shù),數(shù)據(jù)修復(fù)裝置截獲該回調(diào)函數(shù),并確定新寫入的數(shù)據(jù)為葉子頁(yè)數(shù)據(jù)后,即可根據(jù)表名,將葉子頁(yè)數(shù)據(jù)存儲(chǔ)在通訊錄對(duì)應(yīng)的表中。
步驟302,根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼的數(shù)量和/或類型,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件。
步驟303,獲取已備份的元數(shù)據(jù)及葉子頁(yè)數(shù)據(jù)。
其中,已備份的元數(shù)據(jù)中,包括第一表名組,和與第一表名組分別對(duì)應(yīng)的第一根節(jié)點(diǎn)組。
步驟304,根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組。
步驟305,根據(jù)第一表名組、第一用戶數(shù)據(jù)組和葉子頁(yè)數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
其中,上述步驟302-步驟305的具體實(shí)現(xiàn)過(guò)程和原理,可以參照上述實(shí)施例中步驟101-步驟104的詳細(xì)描述,此處不再贅述。
具體的,通過(guò)在數(shù)據(jù)庫(kù)有新的葉子頁(yè)數(shù)據(jù)寫入時(shí),對(duì)葉子頁(yè)數(shù)據(jù)進(jìn)行備份,則可以在葉子頁(yè)數(shù)據(jù)發(fā)生損壞時(shí),直接從備份中,獲取葉子頁(yè)數(shù)據(jù),以直接根據(jù)葉子頁(yè)數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)。
需要說(shuō)明的是,在本發(fā)明實(shí)施例中,可以僅在確定數(shù)據(jù)庫(kù)有新的葉子頁(yè)數(shù)據(jù)寫入時(shí),對(duì)新寫入的葉子頁(yè)數(shù)據(jù)進(jìn)行備份,也可以將上述實(shí)施例中,步驟201的對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份的方法,與本發(fā)明實(shí)施例步驟301中,對(duì)葉子頁(yè)數(shù)據(jù)進(jìn)行備份的方法結(jié)合,即,在數(shù)據(jù)庫(kù)啟動(dòng)后,以預(yù)設(shè)的時(shí)間間隔,對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份,并在每次元數(shù)據(jù)備份后,下次元數(shù)據(jù)備份前,數(shù)據(jù)庫(kù)中新增的葉子頁(yè)數(shù)據(jù)進(jìn)行備份,從而盡量保證根據(jù)備份數(shù)據(jù)可以最大限度的對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)。
進(jìn)一步的,由于根據(jù)元數(shù)據(jù),即可獲取該元數(shù)據(jù)中包括的所有葉子頁(yè)數(shù)據(jù),因此,為了節(jié)省內(nèi)存,還可以在每次元數(shù)據(jù)備份后,將此次元數(shù)據(jù)備份之前存儲(chǔ)的葉子頁(yè)數(shù)據(jù)刪除,僅保留最后一次進(jìn)行元數(shù)據(jù)備份之后,數(shù)據(jù)庫(kù)中新增的葉子頁(yè)數(shù)據(jù),從而在占有最小內(nèi)存的情況下,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的最大限度的修復(fù)。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,首先在確定數(shù)據(jù)庫(kù)有新的葉子頁(yè)數(shù)據(jù)寫入時(shí),對(duì)葉子頁(yè)數(shù)據(jù)進(jìn)行備份,然后根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼的數(shù)量和/或類型,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,再獲取已備份的元數(shù)據(jù)及葉子頁(yè)數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名、第一用戶數(shù)據(jù)組和葉子頁(yè)數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)及新寫入的葉子頁(yè)數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
通過(guò)上述分析可知,可以在數(shù)據(jù)庫(kù)運(yùn)行時(shí),通過(guò)對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份,進(jìn)而在數(shù)據(jù)庫(kù)損壞時(shí),根據(jù)備份的元數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)。在本申請(qǐng)一種可能的實(shí)現(xiàn)形式中,若備份的元數(shù)據(jù)并不包括數(shù)據(jù)庫(kù)中所有的元數(shù)據(jù),那么根據(jù)備份的數(shù)據(jù)進(jìn)行數(shù)據(jù)庫(kù)修復(fù)時(shí),得到的修復(fù)后的數(shù)據(jù)庫(kù)中,也僅包括部分?jǐn)?shù)據(jù)。為了實(shí)現(xiàn)對(duì)數(shù)據(jù)的最大限度的修復(fù),本申請(qǐng)實(shí)施例中,還可以采用圖4所示的形式,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)。
圖4是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖。
如圖4所示,該數(shù)據(jù)庫(kù)修復(fù)方法,包括以下步驟:
步驟401,根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件。
步驟402,獲取數(shù)據(jù)庫(kù)的系統(tǒng)表。
其中,數(shù)據(jù)庫(kù)的系統(tǒng)表,指數(shù)據(jù)庫(kù)自帶的表。以sqlite或sqlcipher數(shù)據(jù)庫(kù)為例,數(shù)據(jù)庫(kù)自帶的sqlite_master即為數(shù)據(jù)庫(kù)的系統(tǒng)表。
具體實(shí)現(xiàn)時(shí),可以根據(jù)數(shù)據(jù)庫(kù)的文件頭,獲取數(shù)據(jù)庫(kù)的系統(tǒng)表。
舉例來(lái)說(shuō),以sqlite數(shù)據(jù)庫(kù)為例,sqlite數(shù)據(jù)庫(kù)在第一頁(yè)0偏移地址處存儲(chǔ)了100字節(jié)的文件頭記錄,文件頭記錄描述了數(shù)據(jù)庫(kù)文件的數(shù)據(jù)結(jié)構(gòu),在本發(fā)明實(shí)施例中,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件后,若數(shù)據(jù)庫(kù)的文件頭未發(fā)生損壞,則可根據(jù)數(shù)據(jù)庫(kù)的文件頭,獲取數(shù)據(jù)庫(kù)的系統(tǒng)表。
可以理解的是,當(dāng)數(shù)據(jù)庫(kù)的文件頭損壞時(shí),將導(dǎo)致數(shù)據(jù)庫(kù)完全不可讀,也無(wú)法獲取數(shù)據(jù)庫(kù)的系統(tǒng)表,針對(duì)上述情況,在本發(fā)明實(shí)施例中,還可以根據(jù)預(yù)設(shè)的默認(rèn)值,獲取數(shù)據(jù)庫(kù)的系統(tǒng)表。
其中,預(yù)設(shè)的默認(rèn)值,可以是根據(jù)數(shù)據(jù)庫(kù)所在的終端對(duì)應(yīng)的操作系統(tǒng)類型確定的,也可以是由開(kāi)發(fā)人員根據(jù)經(jīng)驗(yàn),預(yù)先設(shè)置的,此處不作限制。
相應(yīng)的,在進(jìn)行數(shù)據(jù)庫(kù)修復(fù)時(shí),若數(shù)據(jù)庫(kù)的文件頭已損壞,則在上述步驟402之前,還可以包括:
根據(jù)數(shù)據(jù)庫(kù)所在的終端對(duì)應(yīng)的操作系統(tǒng)類型,確定預(yù)設(shè)的默認(rèn)值。
舉例來(lái)說(shuō),假設(shè)數(shù)據(jù)庫(kù)所在的終端對(duì)應(yīng)的操作系統(tǒng)為安卓系統(tǒng),則可以根據(jù)安卓系統(tǒng)中數(shù)據(jù)庫(kù)的文件頭,預(yù)先設(shè)置默認(rèn)值,從而在操作系統(tǒng)為安卓系統(tǒng)的終端中,數(shù)據(jù)庫(kù)文件頭損壞時(shí),以預(yù)設(shè)的默認(rèn)值代替數(shù)據(jù)庫(kù)的文件頭,用以獲取數(shù)據(jù)庫(kù)的系統(tǒng)表。
步驟403,根據(jù)系統(tǒng)表,確定數(shù)據(jù)庫(kù)中包括的第二表名組和與第二表名組分別對(duì)應(yīng)的第二根節(jié)點(diǎn)組。
其中,上述第二表名組與第一表名組可能不同,也可能相同。
舉例來(lái)說(shuō),若在數(shù)據(jù)庫(kù)運(yùn)行過(guò)程中,以每30分鐘為間隔,對(duì)數(shù)據(jù)庫(kù)進(jìn)行了元數(shù)據(jù)備份,在最后一次備份后的20分鐘后,數(shù)據(jù)庫(kù)損壞了。且在最后一次備份后,數(shù)據(jù)庫(kù)中增加了新的表文件a,那么備份的第一表名組中,就未包括新增的表文件a對(duì)應(yīng)的表名和根節(jié)點(diǎn),而此時(shí),若數(shù)據(jù)庫(kù)中損壞的節(jié)點(diǎn)并非表a,那么根據(jù)系統(tǒng)表,確定的第二表名組中,就包括表a的名稱和對(duì)應(yīng)的根節(jié)點(diǎn)。
步驟404,根據(jù)第二表名組和第二根節(jié)點(diǎn)組,獲取第二用戶數(shù)據(jù)組。
其中,第二用戶數(shù)據(jù)組,指數(shù)據(jù)庫(kù)中,第二表名組對(duì)應(yīng)的各表中的全部用戶數(shù)據(jù)。
可以理解的是,以sqlite或sqlcipher數(shù)據(jù)庫(kù)為例,sqlite_master是sqlite或sqlcipher數(shù)據(jù)庫(kù)自帶的系統(tǒng)表,它存儲(chǔ)了其它所有表的元數(shù)據(jù),元數(shù)據(jù)中的表名組和根節(jié)點(diǎn)組存在對(duì)應(yīng)關(guān)系,根據(jù)對(duì)應(yīng)關(guān)系,即可找到表名對(duì)應(yīng)的表的位置。而表的結(jié)構(gòu)是開(kāi)發(fā)人員自己定義的,表由多個(gè)頁(yè)組成,每個(gè)頁(yè)為一個(gè)節(jié)點(diǎn),頁(yè)之間構(gòu)成b-tree。b-tree有中間頁(yè)和葉子頁(yè)兩種類型,中間頁(yè)存儲(chǔ)了其下層節(jié)點(diǎn)的key(密鑰)所在的范圍和在數(shù)據(jù)庫(kù)中的頁(yè)碼,相當(dāng)于索引,葉子頁(yè)存儲(chǔ)了該表真正的數(shù)據(jù)。根據(jù)元數(shù)據(jù)包括的表名組和根節(jié)點(diǎn)組,確定了表的位置后,即可打開(kāi)相應(yīng)的表,進(jìn)而通過(guò)表的中間頁(yè)逐層向下查找,獲取葉子頁(yè)中的數(shù)據(jù)組。
具體實(shí)現(xiàn)時(shí),在本發(fā)明實(shí)施例中,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件后,可以首先獲取數(shù)據(jù)庫(kù)的系統(tǒng)表,從而根據(jù)系統(tǒng)表,獲取數(shù)據(jù)庫(kù)中包括的第二表名組和與第二表名組分別對(duì)應(yīng)的第二根節(jié)點(diǎn)組,并根據(jù)第二表名組和第二根節(jié)點(diǎn)組,找到第二表名組對(duì)應(yīng)的表的位置,從而通過(guò)表的中間頁(yè)逐層向下查找,獲取數(shù)據(jù)庫(kù)中的第二用戶數(shù)據(jù)。
步驟405,根據(jù)第二表名組和第二用戶數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
可以理解的是,除了表名組和用戶數(shù)據(jù)組之外,數(shù)據(jù)庫(kù)的索引和表結(jié)構(gòu),對(duì)數(shù)據(jù)庫(kù)起著至關(guān)重要的作用。索引含有關(guān)鍵字段的值和指向?qū)嶋H記錄位置的指針,這些值和指針按照特定的順序存儲(chǔ),從而可以以較快的速度查找到所需要的用戶數(shù)據(jù)。而表結(jié)構(gòu)包括一個(gè)表的字段、類型等基本屬性。因此,獲取了數(shù)據(jù)庫(kù)中的第二表名組和第二用戶數(shù)據(jù)組后,還可以恢復(fù)數(shù)據(jù)庫(kù)的索引和表結(jié)構(gòu)。
具體實(shí)現(xiàn)時(shí),由于表是由開(kāi)發(fā)人員自行定義的,因此數(shù)據(jù)庫(kù)的業(yè)務(wù)層可以根據(jù)表名直接獲得表的數(shù)據(jù)結(jié)構(gòu)和索引。在本發(fā)明實(shí)施例中,確定了第二表名組和第二用戶數(shù)據(jù)組后,即可根據(jù)第二表名組中的各表名,獲得各個(gè)表的表結(jié)構(gòu)和索引,并將第二用戶數(shù)據(jù)組根據(jù)表結(jié)構(gòu)和索引,寫入數(shù)據(jù)庫(kù),從而完成對(duì)數(shù)據(jù)庫(kù)的修復(fù)處理。
需要說(shuō)明的是,在本發(fā)明實(shí)施例中,利用第二表名組和第二用戶數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理時(shí),還可以根據(jù)待修復(fù)數(shù)據(jù)的重要性,預(yù)先設(shè)置對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理的方式。例如,可以根據(jù)待修復(fù)數(shù)據(jù)的重要性,將待修復(fù)數(shù)據(jù)分成不同的等級(jí),并預(yù)先設(shè)置待修復(fù)數(shù)據(jù)的等級(jí)與對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理的方式之間的對(duì)應(yīng)關(guān)系。從而在確定數(shù)據(jù)庫(kù)滿足修復(fù)條件時(shí),可以根據(jù)數(shù)據(jù)庫(kù)的系統(tǒng)表,獲取了第二表名組和第二用戶數(shù)據(jù)后,可以根據(jù)待修復(fù)數(shù)據(jù)的不同等級(jí),以對(duì)應(yīng)的修復(fù)方式,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。具體的實(shí)現(xiàn)過(guò)程和原理,可以參照上訴實(shí)施例步驟104的詳細(xì)描述,此處不再贅述。
可以理解的是,本發(fā)明實(shí)施例中,通過(guò)根據(jù)預(yù)設(shè)的默認(rèn)值,獲取數(shù)據(jù)庫(kù)的系統(tǒng)表,從而在文件頭損壞時(shí),仍然可以獲取數(shù)據(jù)庫(kù)的系統(tǒng)表,并根據(jù)數(shù)據(jù)庫(kù)的系統(tǒng)表,獲取第二表名組和第二用戶數(shù)據(jù)組,從而對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。相比現(xiàn)有技術(shù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)的方式,在數(shù)據(jù)庫(kù)的文件頭損壞時(shí),無(wú)法對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方式,提高了數(shù)據(jù)庫(kù)修復(fù)的成功率。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件后,首先獲取數(shù)據(jù)庫(kù)的系統(tǒng)表,然后根據(jù)系統(tǒng)表,確定數(shù)據(jù)庫(kù)中包括的第二表名組和與第二表名組分別對(duì)應(yīng)的第二根節(jié)點(diǎn)組,再根據(jù)第二表名組和第二根節(jié)點(diǎn)組,獲取第二用戶數(shù)據(jù)組,最后根據(jù)第二表名組和第二用戶數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。通過(guò)根據(jù)數(shù)據(jù)庫(kù)的系統(tǒng)表,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
通過(guò)上述分析可知,既可以對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份,從而在數(shù)據(jù)庫(kù)損壞時(shí),根據(jù)已備份的元數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理?;蛘撸部梢愿鶕?jù)預(yù)設(shè)的文件頭,打開(kāi)數(shù)據(jù)庫(kù)的系統(tǒng)表,來(lái)確定數(shù)據(jù)庫(kù)中的元數(shù)據(jù),進(jìn)而對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。然而,在實(shí)際運(yùn)用中,在數(shù)據(jù)庫(kù)損壞之前,可能并沒(méi)有將所有的元數(shù)據(jù)都進(jìn)行備份,并且,利用預(yù)設(shè)的文件頭,打開(kāi)的數(shù)據(jù)庫(kù)的系統(tǒng)表中,可能也未包括完整的元數(shù)據(jù)。因此,在本申請(qǐng)一種較優(yōu)的實(shí)現(xiàn)形式中,還可以利用備份的元數(shù)據(jù)和打開(kāi)的數(shù)據(jù)庫(kù)的系統(tǒng)表,同時(shí)對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),下面結(jié)合圖5,對(duì)上述情況進(jìn)行詳細(xì)說(shuō)明。
圖5是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖。
如圖5所示,該數(shù)據(jù)庫(kù)修復(fù)方法,可以包括以下步驟:
步驟501,根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件。
步驟502,獲取已備份的元數(shù)據(jù)。
其中,已備份的元數(shù)據(jù)中,包括第一表名組,和與第一表名組分別對(duì)應(yīng)的第一根節(jié)點(diǎn)組。
步驟503,根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組。
具體實(shí)現(xiàn)時(shí),可以在數(shù)據(jù)庫(kù)未損壞時(shí),對(duì)數(shù)據(jù)庫(kù)中,sqlite_master存儲(chǔ)的其它所有表的元數(shù)據(jù)進(jìn)行備份,從而在確定數(shù)據(jù)庫(kù)需要修復(fù)時(shí),可以從已備份的數(shù)據(jù)庫(kù)中獲取元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù)中的第一表名組和第一根節(jié)點(diǎn)組,找到第一表名組對(duì)應(yīng)的表的位置,從而通過(guò)表的中間頁(yè)逐層向下查找,獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組。
步驟504,獲取數(shù)據(jù)庫(kù)的系統(tǒng)表。
步驟505,根據(jù)系統(tǒng)表,確定數(shù)據(jù)庫(kù)中包括的第二表名組和與第二表名組分別對(duì)應(yīng)的第二根節(jié)點(diǎn)組。
步驟506,根據(jù)第二表名組和第二根節(jié)點(diǎn)組,獲取第二用戶數(shù)據(jù)組。
具體實(shí)現(xiàn)時(shí),在本發(fā)明實(shí)施例中,可以首先獲取數(shù)據(jù)庫(kù)的系統(tǒng)表,從而根據(jù)系統(tǒng)表,獲取數(shù)據(jù)庫(kù)中包括的第二表名組和與第二表名組分別對(duì)應(yīng)的第二根節(jié)點(diǎn)組,并根據(jù)第二表名組和第二根節(jié)點(diǎn)組,找到第二表名組對(duì)應(yīng)的表的位置,從而通過(guò)表的中間頁(yè)逐層向下查找,獲取數(shù)據(jù)庫(kù)中的第二用戶數(shù)據(jù)。
需要說(shuō)明的是,步驟502-步驟503,也可以在步驟506之后執(zhí)行,或者同步驟504-步驟506同時(shí)執(zhí)行,此處不作限制。
其中,上述步驟501-步驟503的具體實(shí)現(xiàn)過(guò)程和原理,可以參照上述實(shí)施例中步驟101-步驟103的詳細(xì)描述,步驟504-步驟506的具體實(shí)現(xiàn)過(guò)程和原理,可以參照上述實(shí)施例中步驟402-步驟404的詳細(xì)描述,此處不再贅述。
步驟507,根據(jù)第二表名組和第二用戶數(shù)據(jù)組,及第一表名組和第一用戶數(shù)據(jù)組對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
可以理解的是,除了表名組和用戶數(shù)據(jù)組之外,數(shù)據(jù)庫(kù)的索引和表結(jié)構(gòu),對(duì)數(shù)據(jù)庫(kù)起著至關(guān)重要的作用,索引含有關(guān)鍵字段的值和指向?qū)嶋H記錄位置的指針,這些值和指針按照特定的順序存儲(chǔ),從而可以以較快的速度查找到所需要的用戶數(shù)據(jù),而表結(jié)構(gòu)包括一個(gè)表的字段、類型等基本屬性。因此,獲取了數(shù)據(jù)庫(kù)中的第一表名組、第二表名組、第一用戶數(shù)據(jù)組和第二用戶數(shù)據(jù)組后,還可以恢復(fù)數(shù)據(jù)庫(kù)的索引和表結(jié)構(gòu)。
具體實(shí)現(xiàn)時(shí),由于表是由開(kāi)發(fā)人員自行定義的,因此數(shù)據(jù)庫(kù)的業(yè)務(wù)層可以根據(jù)表名直接獲得表的數(shù)據(jù)結(jié)構(gòu)和索引。在本發(fā)明實(shí)施例中,確定了第一表名組、第二表名組、第一用戶數(shù)據(jù)組和第二用戶數(shù)據(jù)組后,即可根據(jù)第一表名組和第二表名組的并集,獲得數(shù)據(jù)庫(kù)對(duì)應(yīng)的表結(jié)構(gòu)和索引,并根據(jù)創(chuàng)建的數(shù)據(jù)庫(kù)的表結(jié)構(gòu)和索引,將第一用戶數(shù)據(jù)組和第二用戶數(shù)據(jù)組的并集,寫入數(shù)據(jù)庫(kù),從而完成對(duì)數(shù)據(jù)庫(kù)的修復(fù)處理。
值得注意的是,在本發(fā)明實(shí)施例中,第一表名組和第二表名組,可能是不同的,也可能是部分相同,或全部相同的,對(duì)應(yīng)的,第一用戶數(shù)據(jù)和第二用戶數(shù)據(jù),也可能是不同的,也可能是部分相同,或全部相同的。
可以理解的是,對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份時(shí),可能存在在數(shù)據(jù)庫(kù)損壞前,未將所有的元數(shù)據(jù)都進(jìn)行備份的情況,則根據(jù)已備份的元數(shù)據(jù),獲取第一表名組和第一用戶數(shù)據(jù)組后,利用第一表名組和第一用戶數(shù)據(jù)組,修復(fù)的可能僅是數(shù)據(jù)庫(kù)中的一部分。而通過(guò)獲取數(shù)據(jù)庫(kù)的系統(tǒng)表,獲取第二表名組和第二用戶數(shù)據(jù)組后,若第一表名組、第二表名組和第一用戶數(shù)據(jù)組、第二用戶數(shù)據(jù)組,不是分別全部相同時(shí),通過(guò)第一表名組、第二表名組、第一用戶數(shù)據(jù)組、第二用戶數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),即可對(duì)數(shù)據(jù)庫(kù)中的更多數(shù)據(jù)進(jìn)行修復(fù)。
舉例來(lái)說(shuō),如圖5a所示,假設(shè)數(shù)據(jù)庫(kù)共包括100個(gè)表名和1000個(gè)用戶數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份時(shí),在數(shù)據(jù)庫(kù)損壞之前,僅備份了數(shù)據(jù)庫(kù)中一部分的元數(shù)據(jù)。根據(jù)已備份的元數(shù)據(jù),可以獲取數(shù)據(jù)庫(kù)中的第一表名組和第一用戶數(shù)據(jù)組,其中,第一表名組包括50個(gè)表名,第一用戶數(shù)據(jù)組包括500個(gè)用戶數(shù)據(jù),利用第一表名組和第一用戶數(shù)據(jù)組,可能僅可以修復(fù)50%的數(shù)據(jù)庫(kù)。若根據(jù)數(shù)據(jù)庫(kù)的系統(tǒng)表,獲取了數(shù)據(jù)庫(kù)包括的的第二表名組和第二用戶數(shù)據(jù)組,其中,第二表名組包括數(shù)據(jù)庫(kù)中的40個(gè)表名,而40個(gè)表名和第一表名組中的表名是相同的,第二用戶數(shù)據(jù)組包括數(shù)據(jù)庫(kù)中的400個(gè)用戶數(shù)據(jù),而400個(gè)用戶數(shù)據(jù)和第一用戶數(shù)據(jù)組中的用戶數(shù)據(jù)是相同的。則根據(jù)第一表名組、第二表名組、第一用戶數(shù)據(jù)組和第二用戶數(shù)據(jù)組,可以修復(fù)50%的數(shù)據(jù)庫(kù)。
或者,假設(shè)數(shù)據(jù)庫(kù)共包括100個(gè)表名和1000個(gè)用戶數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份時(shí),在數(shù)據(jù)庫(kù)損壞之前,僅備份了數(shù)據(jù)庫(kù)中一部分的元數(shù)據(jù)。根據(jù)已備份的元數(shù)據(jù),可以獲取數(shù)據(jù)庫(kù)中的第一表名組和第一用戶數(shù)據(jù)組,其中,第一表名組包括50個(gè)表名,第一用戶數(shù)據(jù)組包括500個(gè)用戶數(shù)據(jù),利用第一表名組和第一用戶數(shù)據(jù)組,可能僅可以修復(fù)50%的數(shù)據(jù)庫(kù)。若根據(jù)數(shù)據(jù)庫(kù)的系統(tǒng)表,獲取了數(shù)據(jù)庫(kù)包括的的第二表名組和第二用戶數(shù)據(jù)組,其中,第二表名組包括數(shù)據(jù)庫(kù)中的40個(gè)表名,其中,10個(gè)表名和第一表名組中的表名是相同的,第二用戶數(shù)據(jù)組包括數(shù)據(jù)庫(kù)中的400個(gè)用戶數(shù)據(jù),其中100個(gè)用戶數(shù)據(jù)和第一用戶數(shù)據(jù)組中的用戶數(shù)據(jù)是相同的。則根據(jù)第一表名組、第二表名組、第一用戶數(shù)據(jù)組和第二用戶數(shù)據(jù)組的并集,可以修復(fù)80%的數(shù)據(jù)庫(kù)。
或者,假設(shè)數(shù)據(jù)庫(kù)共包括100個(gè)表名和1000個(gè)用戶數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份時(shí),在數(shù)據(jù)庫(kù)損壞之前,僅備份了數(shù)據(jù)庫(kù)中一部分的元數(shù)據(jù)。根據(jù)已備份的元數(shù)據(jù),可以獲取數(shù)據(jù)庫(kù)中的第一表名組和第一用戶數(shù)據(jù)組,其中,第一表名組包括50個(gè)表名,第一用戶數(shù)據(jù)組包括500個(gè)用戶數(shù)據(jù),利用第一表名組和第一用戶數(shù)據(jù)組,可能僅可以修復(fù)50%的數(shù)據(jù)庫(kù)。若根據(jù)數(shù)據(jù)庫(kù)的系統(tǒng)表,獲取了數(shù)據(jù)庫(kù)包括的的第二表名組和第二用戶數(shù)據(jù)組,其中,第二表名組包括數(shù)據(jù)庫(kù)中的40個(gè)表名,其中,所有的表名和第一表名組中的表名都是不相同的,第二用戶數(shù)據(jù)組包括數(shù)據(jù)庫(kù)中的400個(gè)用戶數(shù)據(jù),其中所有的用戶數(shù)據(jù)和第一用戶數(shù)據(jù)組中的用戶數(shù)據(jù)都是不相同的。則根據(jù)第一表名組、第二表名組、第一用戶數(shù)據(jù)組和第二用戶數(shù)據(jù)組,可以修復(fù)90%的數(shù)據(jù)庫(kù)。
需要說(shuō)明的是,在本發(fā)明實(shí)施例中,利用第一表名組、第一用戶數(shù)據(jù)組、第二表名組、第二用戶數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理時(shí),還可以根據(jù)待修復(fù)數(shù)據(jù)的重要性,預(yù)先設(shè)置對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理的方式。例如,可以根據(jù)待修復(fù)數(shù)據(jù)的重要性,將待修復(fù)數(shù)據(jù)分成不同的等級(jí),并預(yù)先設(shè)置待修復(fù)數(shù)據(jù)的等級(jí)與對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理的方式之間的對(duì)應(yīng)關(guān)系,從而在確定數(shù)據(jù)庫(kù)滿足修復(fù)條件時(shí),根據(jù)已備份的元數(shù)據(jù),獲取了第一表名組和第一用戶數(shù)據(jù)組,根據(jù)數(shù)據(jù)庫(kù)的系統(tǒng)表,獲取了第二表名組和第二用戶數(shù)據(jù)后,可以根據(jù)待修復(fù)數(shù)據(jù)的不同等級(jí),以對(duì)應(yīng)的修復(fù)方式,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。具體的實(shí)現(xiàn)過(guò)程和原理,可以參照上訴實(shí)施例步驟104的詳細(xì)描述,此處不再贅述。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,再獲取數(shù)據(jù)庫(kù)的系統(tǒng)表,然后根據(jù)系統(tǒng)表,確定數(shù)據(jù)庫(kù)中包括的第二表名組和與第二表名組分別對(duì)應(yīng)的第二根節(jié)點(diǎn)組,再根據(jù)第二表名組和第二根節(jié)點(diǎn)組,獲取第二用戶數(shù)據(jù)組,最后根據(jù)第二表名組和第二用戶數(shù)據(jù)組、及第一表名組和第一用戶數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。通過(guò)根據(jù)數(shù)據(jù)庫(kù)的系統(tǒng)表及已備份的元數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
圖6是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)方法的流程示意圖。
如圖6所示,該數(shù)據(jù)庫(kù)修復(fù)方法,可以包括以下步驟:
步驟601,根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼的數(shù)量和/或類型,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件。
步驟602,獲取已備份的元數(shù)據(jù)。
其中,已備份的元數(shù)據(jù)中,包括第一表名組,和與第一表名組分別對(duì)應(yīng)的第一根節(jié)點(diǎn)組。
步驟603,根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組。
步驟604,根據(jù)數(shù)據(jù)庫(kù)所在的終端對(duì)應(yīng)的操作系統(tǒng)類型,確定預(yù)設(shè)的默認(rèn)值。
步驟505,根據(jù)預(yù)設(shè)的默認(rèn)值,獲取數(shù)據(jù)庫(kù)的系統(tǒng)表。
步驟606,根據(jù)系統(tǒng)表,確定數(shù)據(jù)庫(kù)中包括的第二表名組和與第二表名組分別對(duì)應(yīng)的第二根節(jié)點(diǎn)組。
步驟607,根據(jù)第二表名組和第二根節(jié)點(diǎn)組,獲取第二用戶數(shù)據(jù)組。
需要說(shuō)明的是,步驟602-步驟603,也可以在步驟607之后執(zhí)行,或者同步驟604-步驟607同時(shí)執(zhí)行,此處不作限制。
其中,上述步驟601-步驟603的具體實(shí)現(xiàn)過(guò)程和原理,可以參照上述實(shí)施例中步驟101-步驟103的詳細(xì)描述,步驟604-步驟607的具體實(shí)現(xiàn)過(guò)程和原理,可以參照上述實(shí)施例中步驟402-步驟404的詳細(xì)描述,此處不再贅述。
步驟608,根據(jù)第一表名組和第二表名組的并集,創(chuàng)建數(shù)據(jù)庫(kù)對(duì)應(yīng)的表結(jié)構(gòu)和索引。
步驟609,根據(jù)創(chuàng)建的數(shù)據(jù)庫(kù)的表結(jié)構(gòu)和索引,將第一用戶數(shù)據(jù)組和第二用戶數(shù)據(jù)組的并集,分別寫入創(chuàng)建的數(shù)據(jù)庫(kù)中。
其中,上述步驟601-步驟609的具體實(shí)現(xiàn)過(guò)程和原理,可以參照上述實(shí)施例中的詳細(xì)描述此處不再贅述。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼的數(shù)量和/或類型,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,再根據(jù)預(yù)設(shè)的默認(rèn)值,獲取數(shù)據(jù)庫(kù)的系統(tǒng)表,然后根據(jù)系統(tǒng)表,確定數(shù)據(jù)庫(kù)中包括的第二表名組和與第二表名組分別對(duì)應(yīng)的第二根節(jié)點(diǎn)組,再根據(jù)第二表名組和第二根節(jié)點(diǎn)組,獲取第二用戶數(shù)據(jù)組,最后根據(jù)第二表名組和第二用戶數(shù)據(jù)組、及第一表名組和第一用戶數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。通過(guò)根據(jù)數(shù)據(jù)庫(kù)的系統(tǒng)表及已備份的元數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
下述為本發(fā)明裝置實(shí)施例,可以用于執(zhí)行本發(fā)明方法實(shí)施例。對(duì)于本發(fā)明裝置實(shí)施例中未披露的細(xì)節(jié),請(qǐng)參照本發(fā)明方法實(shí)施例。
圖7是根據(jù)一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)裝置的結(jié)構(gòu)框圖。該數(shù)據(jù)庫(kù)修復(fù)裝置700,可以包括:
第一確定模塊701,用于根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定所述數(shù)據(jù)庫(kù)滿足修復(fù)條件;
第一獲取模塊702,用于獲取已備份的元數(shù)據(jù),其中,所述已備份的元數(shù)據(jù)中,包括第一表名組,和與第一表名組分別對(duì)應(yīng)的第一根節(jié)點(diǎn)組;
第二獲取模塊703,用于根據(jù)所述已備份的元數(shù)據(jù),獲取所述數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組;
處理模塊704,用于根據(jù)所述第一表名組和第一用戶數(shù)據(jù)組,對(duì)所述數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
具體的,本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)裝置,可以用來(lái)執(zhí)行本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,其中,該裝置可以被配置在任意終端中,如手機(jī)、電腦等。
在一種可能的實(shí)現(xiàn)形式中,上述第一確定模塊701,具體用于:
根據(jù)所述數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼的數(shù)量和/或類型,確定所述數(shù)據(jù)庫(kù)滿足修復(fù)條件。
可選地,該數(shù)據(jù)庫(kù)修復(fù)裝置700,還可以包括:
第一備份模塊,用于在所述數(shù)據(jù)庫(kù)啟動(dòng)后,以預(yù)設(shè)的時(shí)間間隔對(duì)所述數(shù)據(jù)庫(kù)中的元數(shù)據(jù)進(jìn)行備份;
或者,
第二備份模塊,用于在確定所述數(shù)據(jù)庫(kù)有新的葉子頁(yè)數(shù)據(jù)寫入時(shí),對(duì)所述葉子頁(yè)數(shù)據(jù)進(jìn)行備份。
在另一種可能的實(shí)現(xiàn)形式中,上述第二備份模塊,具體用于:
截獲數(shù)據(jù)庫(kù)發(fā)送的回調(diào)函數(shù),所述回調(diào)函數(shù)中包括頁(yè)數(shù)據(jù)的類型;
判斷所述頁(yè)數(shù)據(jù)的類型,是否為葉子頁(yè);
若是,則確定所述數(shù)據(jù)庫(kù)有新的葉子頁(yè)數(shù)據(jù)寫入。
在另一種可能的實(shí)現(xiàn)形式中,上述回調(diào)函數(shù)中還包括:表名;
進(jìn)一步的,上述第二備份模塊,還用于:
將所述葉子頁(yè)數(shù)據(jù)存儲(chǔ)在所述表名對(duì)應(yīng)的表中。
需要說(shuō)明的是,前述對(duì)數(shù)據(jù)庫(kù)修復(fù)方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的數(shù)據(jù)庫(kù)修復(fù)裝置,此處不再贅述。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)裝置,首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名組和第一數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。由此,通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
圖8是根據(jù)另一示例性實(shí)施例示出的一種數(shù)據(jù)庫(kù)修復(fù)裝置的結(jié)構(gòu)框圖。
如圖8所示,在圖7所示的基礎(chǔ)上,該數(shù)據(jù)庫(kù)修復(fù)裝置700,還可以包括:
第三獲取模塊801,用于獲取所述數(shù)據(jù)庫(kù)的系統(tǒng)表;
第二確定模塊802,用于根據(jù)所述系統(tǒng)表,確定所述數(shù)據(jù)庫(kù)中包括的第二表名組和與第二表名組分別對(duì)應(yīng)的第二根節(jié)點(diǎn)組;
第四獲取模塊803,用于根據(jù)所述第二表名組和第二根節(jié)點(diǎn)組,獲取第二用戶數(shù)據(jù)組;
具體的,本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)裝置,可以用來(lái)執(zhí)行本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)方法,其中,該裝置可以被配置在任意終端中,如手機(jī)、電腦等。
相應(yīng)的,上述處理模塊704,還用于:
根據(jù)所述第二表名組和第二用戶數(shù)據(jù)組、及第一表名組和第一用戶數(shù)據(jù)組,對(duì)所述數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
進(jìn)一步的,上述處理模塊704,還用于:
根據(jù)所述第一表名組和第二表名組的并集,創(chuàng)建所述數(shù)據(jù)庫(kù)對(duì)應(yīng)的表結(jié)構(gòu)和索引;
根據(jù)所述創(chuàng)建的所述數(shù)據(jù)庫(kù)的表結(jié)構(gòu)和索引,將所述第一用戶數(shù)據(jù)組和第二用戶數(shù)據(jù)組的并集,分別寫入創(chuàng)建的數(shù)據(jù)庫(kù)中。
在一種可能的實(shí)現(xiàn)形式中,上述第三獲取模塊801,具體用于:
根據(jù)所述數(shù)據(jù)庫(kù)的文件頭,獲取所述數(shù)據(jù)庫(kù)的系統(tǒng)表;
或者,
根據(jù)預(yù)設(shè)的默認(rèn)值,獲取所述數(shù)據(jù)庫(kù)的系統(tǒng)表。
進(jìn)一步的,上述第三獲取模塊801,還用于:
根據(jù)所述數(shù)據(jù)庫(kù)所在的終端對(duì)應(yīng)的操作系統(tǒng)類型,確定所述預(yù)設(shè)的默認(rèn)值。
需要說(shuō)明的是,前述對(duì)數(shù)據(jù)庫(kù)修復(fù)方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的數(shù)據(jù)庫(kù)修復(fù)裝置,此處不再贅述。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)修復(fù)裝置,首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名組和第一數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。由此,通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
在示例性實(shí)施例中,還提供了一種終端,包括:
存儲(chǔ)器、處理器及存儲(chǔ)在存儲(chǔ)器上并可在處理器上運(yùn)行的計(jì)算機(jī)程序,處理器執(zhí)行所述程序時(shí)實(shí)現(xiàn)如上述實(shí)施例所述的數(shù)據(jù)庫(kù)修復(fù)方法。
具體的,數(shù)據(jù)庫(kù)修復(fù)方法包括:
根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定所述數(shù)據(jù)庫(kù)滿足修復(fù)條件;
獲取已備份的元數(shù)據(jù),其中,所述已備份的元數(shù)據(jù)中,包括第一表名組,和與第一表名組分別對(duì)應(yīng)的第一根節(jié)點(diǎn)組;
根據(jù)所述已備份的元數(shù)據(jù),獲取所述數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組;
根據(jù)所述第一表名組和第一用戶數(shù)據(jù)組,對(duì)所述數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
需要說(shuō)明的是,前述對(duì)數(shù)據(jù)庫(kù)修復(fù)方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的終端,此處不再贅述。
本發(fā)明實(shí)施例提供的終端,首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名組和第一數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。由此,通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
在示例性實(shí)施例中,還提供了一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其上存儲(chǔ)有計(jì)算機(jī)程序,該程序被處理器執(zhí)行時(shí)實(shí)現(xiàn)如上述實(shí)施例所述的數(shù)據(jù)庫(kù)修復(fù)方法。
具體的,數(shù)據(jù)庫(kù)修復(fù)方法包括:
根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定所述數(shù)據(jù)庫(kù)滿足修復(fù)條件;
獲取已備份的元數(shù)據(jù),其中,所述已備份的元數(shù)據(jù)中,包括第一表名組,和與第一表名組分別對(duì)應(yīng)的第一根節(jié)點(diǎn)組;
根據(jù)所述已備份的元數(shù)據(jù),獲取所述數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組;
根據(jù)所述第一表名組和第一用戶數(shù)據(jù)組,對(duì)所述數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
需要說(shuō)明的是,前述對(duì)數(shù)據(jù)庫(kù)修復(fù)方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),此處不再贅述。
本發(fā)明實(shí)施例提供的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名組和第一數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。由此,通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
在示例性實(shí)施例中,還提供了一種計(jì)算機(jī)程序產(chǎn)品,當(dāng)所述計(jì)算機(jī)程序產(chǎn)品中的指令處理器執(zhí)行時(shí),執(zhí)行如上述實(shí)施例所述的數(shù)據(jù)庫(kù)修復(fù)方法。
具體的,數(shù)據(jù)庫(kù)修復(fù)方法包括:
根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定所述數(shù)據(jù)庫(kù)滿足修復(fù)條件;
獲取已備份的元數(shù)據(jù),其中,所述已備份的元數(shù)據(jù)中,包括第一表名組,和與第一表名組分別對(duì)應(yīng)的第一根節(jié)點(diǎn)組;
根據(jù)所述已備份的元數(shù)據(jù),獲取所述數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組;
根據(jù)所述第一表名組和第一用戶數(shù)據(jù)組,對(duì)所述數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。
需要說(shuō)明的是,前述對(duì)數(shù)據(jù)庫(kù)修復(fù)方法實(shí)施例的解釋說(shuō)明也適用于該實(shí)施例的計(jì)算機(jī)程序產(chǎn)品,此處不再贅述。
本發(fā)明實(shí)施例提供的計(jì)算機(jī)程序產(chǎn)品,首先根據(jù)數(shù)據(jù)庫(kù)上報(bào)的損壞錯(cuò)誤碼,確定數(shù)據(jù)庫(kù)滿足修復(fù)條件,然后獲取已備份的元數(shù)據(jù),并根據(jù)已備份的元數(shù)據(jù),獲取數(shù)據(jù)庫(kù)中包括的第一用戶數(shù)據(jù)組,最后根據(jù)第一表名組和第一數(shù)據(jù)組,對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù)處理。由此,通過(guò)對(duì)解析數(shù)據(jù)所需的元數(shù)據(jù)進(jìn)行備份,實(shí)現(xiàn)了在數(shù)據(jù)庫(kù)損壞甚至是數(shù)據(jù)庫(kù)的文件頭損壞時(shí),對(duì)數(shù)據(jù)庫(kù)進(jìn)行修復(fù),提高了數(shù)據(jù)庫(kù)修復(fù)的成功率,改善了數(shù)據(jù)庫(kù)修復(fù)的效果,從而提高了數(shù)據(jù)庫(kù)的可靠性和實(shí)用性。
在本發(fā)明的描述中,需要理解的是,術(shù)語(yǔ)“第一”、“第二”僅用于描述目的,而不能理解為指示或暗示相對(duì)重要性或者隱含指明所指示的技術(shù)特征的數(shù)量。由此,限定有“第一”、“第二”的特征可以明示或者隱含地包括一個(gè)或者更多個(gè)該特征。在本發(fā)明的描述中,“多個(gè)”的含義是兩個(gè)或兩個(gè)以上,除非另有明確具體的限定。
在本說(shuō)明書的描述中,參考術(shù)語(yǔ)“一個(gè)實(shí)施例”、“一些實(shí)施例”、“示例”、“具體示例”、或“一些示例”等的描述意指結(jié)合該實(shí)施例或示例描述的具體特征或者特點(diǎn)包含于本發(fā)明的至少一個(gè)實(shí)施例或示例中。在本說(shuō)明書中,對(duì)上述術(shù)語(yǔ)的示意性表述不必須針對(duì)的是相同的實(shí)施例或示例。而且,描述的具體特征或者特點(diǎn)可以在任一個(gè)或多個(gè)實(shí)施例或示例中以合適的方式結(jié)合。此外,在不相互矛盾的情況下,本領(lǐng)域的技術(shù)人員可以將本說(shuō)明書中描述的不同實(shí)施例或示例以及不同實(shí)施例或示例的特征進(jìn)行結(jié)合和組合。
流程圖中或在此以其他方式描述的任何過(guò)程或方法描述可以被理解為,表示包括一個(gè)或更多個(gè)用于實(shí)現(xiàn)特定邏輯功能或過(guò)程的步驟的可執(zhí)行指令的代碼的模塊、片段或部分,并且本發(fā)明的優(yōu)選實(shí)施方式的范圍包括另外的實(shí)現(xiàn),其中可以不按所示出或討論的順序,包括根據(jù)所涉及的功能按基本同時(shí)的方式或按相反的順序,來(lái)執(zhí)行功能,這應(yīng)被本發(fā)明的實(shí)施例所屬技術(shù)領(lǐng)域的技術(shù)人員所理解。
在流程圖中表示或在此以其他方式描述的邏輯和/或步驟,例如,可以被認(rèn)為是用于實(shí)現(xiàn)邏輯功能的可執(zhí)行指令的定序列表,可以具體實(shí)現(xiàn)在任何計(jì)算機(jī)可讀介質(zhì)中,以供指令執(zhí)行系統(tǒng)、裝置或設(shè)備(如基于計(jì)算機(jī)的系統(tǒng)、包括處理器的系統(tǒng)或其他可以從指令執(zhí)行系統(tǒng)、裝置或設(shè)備取指令并執(zhí)行指令的系統(tǒng))使用,或結(jié)合這些指令執(zhí)行系統(tǒng)、裝置或設(shè)備而使用。就本說(shuō)明書而言,"計(jì)算機(jī)可讀介質(zhì)"可以是任何可以包含、存儲(chǔ)、通信、傳播或傳輸程序以供指令執(zhí)行系統(tǒng)、裝置或設(shè)備或結(jié)合這些指令執(zhí)行系統(tǒng)、裝置或設(shè)備而使用的裝置。計(jì)算機(jī)可讀介質(zhì)的更具體的示例(非窮盡性列表)包括以下:具有一個(gè)或多個(gè)布線的電連接部(電子裝置),便攜式計(jì)算機(jī)盤盒(磁裝置),隨機(jī)存取存儲(chǔ)器(ram),只讀存儲(chǔ)器(rom),可擦除可編輯只讀存儲(chǔ)器(eprom或閃速存儲(chǔ)器),光纖裝置,以及便攜式光盤只讀存儲(chǔ)器(cdrom)。另外,計(jì)算機(jī)可讀介質(zhì)甚至可以是可在其上打印所述程序的紙或其他合適的介質(zhì),因?yàn)榭梢岳缤ㄟ^(guò)對(duì)紙或其他介質(zhì)進(jìn)行光學(xué)掃描,接著進(jìn)行編輯、解譯或必要時(shí)以其他合適方式進(jìn)行處理來(lái)以電子方式獲得所述程序,然后將其存儲(chǔ)在計(jì)算機(jī)存儲(chǔ)器中。
應(yīng)當(dāng)理解,本發(fā)明的各部分可以用硬件、軟件、固件或它們的組合來(lái)實(shí)現(xiàn)。在上述實(shí)施方式中,多個(gè)步驟或方法可以用存儲(chǔ)在存儲(chǔ)器中且由合適的指令執(zhí)行系統(tǒng)執(zhí)行的軟件或固件來(lái)實(shí)現(xiàn)。例如,如果用硬件來(lái)實(shí)現(xiàn),和在另一實(shí)施方式中一樣,可用本領(lǐng)域公知的下列技術(shù)中的任一項(xiàng)或他們的組合來(lái)實(shí)現(xiàn):具有用于對(duì)數(shù)據(jù)信號(hào)實(shí)現(xiàn)邏輯功能的邏輯門電路的離散邏輯電路,具有合適的組合邏輯門電路的專用集成電路,可編程門陣列(pga),現(xiàn)場(chǎng)可編程門陣列(fpga)等。
本技術(shù)領(lǐng)域的普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例方法攜帶的全部或部分步驟是可以通過(guò)程序來(lái)指令相關(guān)的硬件完成,所述的程序可以存儲(chǔ)于一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),包括方法實(shí)施例的步驟之一或其組合。
此外,在本發(fā)明各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理模塊中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)模塊中。上述集成的模塊既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能模塊的形式實(shí)現(xiàn)。所述集成的模塊如果以軟件功能模塊的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),也可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。
上述提到的存儲(chǔ)介質(zhì)可以是只讀存儲(chǔ)器,磁盤或光盤等。盡管上面已經(jīng)示出和描述了本發(fā)明的實(shí)施例,可以理解的是,上述實(shí)施例是示例性的,不能理解為對(duì)本發(fā)明的限制,本領(lǐng)域的普通技術(shù)人員在本發(fā)明的范圍內(nèi)可以對(duì)上述實(shí)施例進(jìn)行變化、修改、替換和變型。