本申請涉及計算機領(lǐng)域,尤其涉及一種用于修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的技術(shù)。
背景技術(shù):
:隨著數(shù)據(jù)庫技術(shù)的迅猛發(fā)展,數(shù)據(jù)庫的應(yīng)用十分廣泛,深入到各個領(lǐng)域。在數(shù)據(jù)庫系統(tǒng)中,無論是出于容災(zāi)還是讀寫分離等目的,往往對一個數(shù)據(jù)庫實例主庫建立備庫,而由于主機宕機、備庫不慎被設(shè)置為可寫、數(shù)據(jù)庫設(shè)計本身缺陷或人為操作失當?shù)仍颍赡茉斐芍鲙旌推鋫鋷斓臄?shù)據(jù)不一致。目前,為了對不一致的數(shù)據(jù)片段進行修復(fù),許多用戶都有自己的修復(fù)方法,一些廠商也提供了用于修復(fù)的腳本工具,例如,比對主庫與備庫的數(shù)據(jù)塊(chunk)中每一行,對找到的主備不一致的行,采用插入數(shù)據(jù)列表中(repalceinto)語句,在主庫執(zhí)行一遍用以生成該行全量的執(zhí)行日志(binlog),并同步到備庫,這會以主庫數(shù)據(jù)為基準來修復(fù)備庫,對于主庫有的行而備庫沒有的行,采用替代(replace)在主庫上插入,對于備庫有而主庫沒有的行,通過在主庫執(zhí)行刪除,直到修復(fù)該數(shù)據(jù)塊所有不一致的行。一方面,在整個數(shù)據(jù)塊的修復(fù)過程中,需要持有數(shù)據(jù)塊的加鎖(forupdate鎖),備庫的延遲越大,主庫加鎖時間越長,對線上影響就越大。在云計算場景下,面對的是大量的不知具體業(yè)務(wù)場景及使用習(xí)慣的用戶,如采用此工具,會帶來難以彌補的失誤。另一方面,還會存在以下風險:如果數(shù)據(jù)出現(xiàn)亂碼,這一修復(fù)動作將可能無法完成修復(fù),甚至?xí)掊e數(shù)據(jù);被修復(fù)的表必須有唯一主鍵,否則會無法準確定位被修復(fù)的行,這可能造成修復(fù)對象錯誤,表現(xiàn)為替代(replaceinto)錯誤數(shù)據(jù)或者刪除(delete)錯誤數(shù)據(jù),這樣的錯誤是不可挽回的。此外,在云計算情況下,現(xiàn)有腳本工具進行的修復(fù),一旦主備關(guān)系發(fā)生變化,會直接導(dǎo)致數(shù)據(jù)源錯誤。技術(shù)實現(xiàn)要素:本申請的目的是提供一種用于修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的方法與設(shè)備,要解決的技術(shù)問題是在云計算場景下不暫停用戶業(yè)務(wù)時如何精準安全地修復(fù)用戶數(shù)據(jù)的問題。根據(jù)本申請的一個方面,提供了一種用于修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的方法,包括:實時比較主庫的執(zhí)行日志位點信息和備庫的執(zhí)行日志位點信息是否一致,當一致時,對所述主庫進行可讀不可寫的加鎖處理;實時比較所述主庫在完成加鎖處理時執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致,當一致時,停止所述備庫從所述主庫進行的復(fù)制工作;請求所述主庫備份待修復(fù)數(shù)據(jù),并在所述待修復(fù)數(shù)據(jù)備份完成后,對所述主庫進行解鎖處理;獲取所述待修復(fù)數(shù)據(jù),并基于所述待修復(fù)數(shù)據(jù)對所述備庫進行修復(fù),在修復(fù)完成后,開啟所述備庫從所述主庫進行的復(fù)制工作。根據(jù)本申請的另一方面,還提供了一種用于修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的設(shè)備,包括:加鎖裝置,用于實時比較主庫的執(zhí)行日志位點信息和備庫的執(zhí)行日志位點信息是否一致,當一致時,對所述主庫進行可讀不可寫的加鎖處理;備庫停止裝置,用于實時比較所述主庫在完成加鎖處理時執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致,當一致時,停止所述備庫從所述主庫進行的復(fù)制工作;解鎖裝置,用于請求所述主庫備份待修復(fù)數(shù)據(jù),并在所述待修復(fù)數(shù)據(jù)備份完成后,對所述主庫進行解鎖處理;修復(fù)裝置,用于獲取所述待修復(fù)數(shù)據(jù),并基于所述待修復(fù)數(shù)據(jù)對所述備庫進行修復(fù),在修復(fù)完成后,開啟所述備庫從所述主庫進行的復(fù)制工作。與現(xiàn)有技術(shù)相比,根據(jù)本申請的實施例所述方法及設(shè)備,當所述主庫的執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息一致時,即實現(xiàn)主備第 一次等同步,對所述主庫進行可讀不可寫的加鎖處理;接著,所述備庫的執(zhí)行日志位點信息達到所述主庫在完成加鎖處理時執(zhí)行日志位點信息時,即實現(xiàn)主備第二次等同步,停止所述備庫從所述主庫進行的復(fù)制工作;隨后,請求所述主庫備份待修復(fù)數(shù)據(jù),此時備份的數(shù)據(jù)正是所述備庫所需數(shù)據(jù),在所述待修復(fù)數(shù)據(jù)備份完成后,對所述主庫進行解鎖處理,用戶可以正常寫入數(shù)據(jù);獲取所述待修復(fù)數(shù)據(jù),并基于所述待修復(fù)數(shù)據(jù)對所述備庫進行修復(fù),按數(shù)據(jù)塊或數(shù)據(jù)文件修復(fù),無需對數(shù)據(jù)進行逐行分析,就可以完成修復(fù),之后,開啟所述備庫從所述主庫進行的復(fù)制工作。修復(fù)過程控制在數(shù)秒內(nèi),對線上業(yè)務(wù)的影響小,主備兩次等同步使在修復(fù)的位點上修復(fù)了所需修復(fù)的數(shù)據(jù),達到精確修復(fù)的效果;進一步地,記錄對所述主庫進行可讀不可寫加鎖處理的已加鎖時間,當所述已加鎖時間超過設(shè)定超時時間時,停止當前修復(fù)操作,不會存在半修復(fù)半不修復(fù)的情況,達到修復(fù)安全的目的。附圖說明通過閱讀參照以下附圖所作的對非限制性實施例所作的詳細描述,本申請的其它特征、目的和優(yōu)點將會變得更明顯:圖1示出根據(jù)本申請一個方面的一種用于修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的設(shè)備結(jié)構(gòu)示意圖;圖2示出根據(jù)本申請一個方面的一個優(yōu)選實施例的修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的流程示意圖;圖3示出根據(jù)本申請一個方面的又一個優(yōu)選實施例的修復(fù)裝置14的結(jié)構(gòu)示意圖;圖4示出根據(jù)本申請又一個方面的一種用于修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的方法流程示意圖;圖5示出根據(jù)本申請又一個方面的一個優(yōu)選實施例中步驟S14的方法流程示意圖。附圖中相同或相似的附圖標記代表相同或相似的部件。具體實施方式下面結(jié)合附圖對本申請作進一步詳細描述。圖1示出根據(jù)本申請一個方面的一種用于修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的設(shè)備結(jié)構(gòu)示意圖。該設(shè)備包括加鎖裝置11、備庫停止裝置12、解鎖裝置13和修復(fù)裝置14。其中,加鎖裝置11用于實時比較主庫的執(zhí)行日志位點信息和備庫的執(zhí)行日志位點信息是否一致,當一致時,對所述主庫進行可讀不可寫的加鎖處理;備庫停止裝置12實時比較所述主庫在完成加鎖處理時執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致,當一致時,停止所述備庫從所述主庫進行的復(fù)制工作;解鎖裝置13請求所述主庫備份待修復(fù)數(shù)據(jù),并在所述待修復(fù)數(shù)據(jù)備份完成后,對所述主庫進行解鎖處理;修復(fù)裝置14獲取所述待修復(fù)數(shù)據(jù),并基于所述待修復(fù)數(shù)據(jù)對所述備庫進行修復(fù),在修復(fù)完成后,開啟所述備庫從所述主庫進行的復(fù)制工作。在此,所述設(shè)備1包括但不限于用戶設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備。所述用戶設(shè)備其包括但不限于任何一種可與用戶通過觸摸板進行人機交互的移動電子產(chǎn)品,例如智能手機、PDA等,所述移動電子產(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ò)包括但不限于互聯(lián)網(wǎng)、廣域網(wǎng)、城域網(wǎng)、局域網(wǎng)、VPN網(wǎng)絡(luò)、無線自組織網(wǎng)絡(luò)(AdHoc網(wǎng)絡(luò))等。優(yōu)選地,設(shè)備1還可以是運行于所述用戶設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備、觸摸終端或網(wǎng)絡(luò)設(shè)備與觸摸終端通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備上的腳本程序,其中,設(shè)備1可以是獨立于主庫設(shè)備和備庫設(shè)備的第三方設(shè)備、也可以是運行于主庫設(shè)備、備庫設(shè)備,或部分運行于主庫設(shè)備并部分運行于備庫設(shè)備。當然,本領(lǐng)域技術(shù)人員應(yīng)能理解上述設(shè)備1僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的設(shè)備1如可適用于本申請,也應(yīng)包含在本申請保護范圍以內(nèi),并在此以引用方式包含于此。數(shù)據(jù)庫系統(tǒng)中,為解決單點問題,同時為了實現(xiàn)數(shù)據(jù)實例負載均衡,往往建立一個主庫及建立一個或多個對主庫進行復(fù)制的備庫,只有主庫可 以寫入,備庫只可以進行讀取。主從復(fù)制原理往往是通過備庫復(fù)制主庫的執(zhí)行日志(binlog)再進行執(zhí)行來完成的。對于復(fù)制關(guān)系,各種數(shù)據(jù)庫產(chǎn)品都有各自的實現(xiàn)方法,以mysql(一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng))為例,mysql主庫在事務(wù)提交時寫執(zhí)行日志,并通過同步執(zhí)行日志(sync_binlog)參數(shù)來控制執(zhí)行日志刷新到磁盤“落地”,而備庫通過輸入輸出(io)線程從主庫讀取執(zhí)行日志,并記錄到本地的中繼日志(relaylog)中,由本地的sql(結(jié)構(gòu)化查詢語言)線程再將中繼日志的數(shù)據(jù)應(yīng)用到本地數(shù)據(jù)庫。數(shù)據(jù)庫為了效率等原因,數(shù)據(jù)只保存在內(nèi)存中,沒有真正的寫入到磁盤上去。如果數(shù)據(jù)庫響應(yīng)為“提交成功”,但是由于數(shù)據(jù)庫掛掉,操作系統(tǒng),數(shù)據(jù)庫主機等任何問題導(dǎo)致這次“提交成功”的事務(wù)對數(shù)據(jù)庫的修改沒有生效,那么我們認為這個事務(wù)的數(shù)據(jù)丟失了。對于銀行業(yè)務(wù)或者金融業(yè)務(wù)等數(shù)據(jù)一致性要求高的場景來說是不能接受的,所以,保證數(shù)據(jù)不丟失也是數(shù)據(jù)庫選擇的一個重要衡量標準。為了保證數(shù)據(jù)不丟失以及主備間數(shù)據(jù)的一致性,各類數(shù)據(jù)庫系統(tǒng)都做了大量的工作,但是在實際使用過程中,在數(shù)據(jù)可靠性和使用效率上往往要做一個權(quán)衡,這就給主備數(shù)據(jù)不一致的產(chǎn)生創(chuàng)造了可能性,另外,由于雙寫、日志文件損壞等因素,即使運行在完全高可靠的工作模式,仍有可能造成主備間數(shù)據(jù)不一致。本申請一實施例所述設(shè)備1用于修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù),由于主備庫兩次等同步后對主庫短暫的加鎖,通過停止備庫,主庫內(nèi)待修復(fù)數(shù)據(jù)的備份及備庫獲取已備份好的數(shù)據(jù)進行修復(fù)數(shù)據(jù),按數(shù)據(jù)塊或數(shù)據(jù)文件修復(fù),無需對數(shù)據(jù)進行逐行分析,就可以完成修復(fù)。修復(fù)過程控制在數(shù)秒內(nèi),在云計算場景下,可以不暫停業(yè)務(wù)就可以修復(fù)數(shù)據(jù),主備兩次等同步使在修復(fù)的位點上修復(fù)了所需修復(fù)的數(shù)據(jù),達到精確修復(fù)的效果;進一步地,對主庫加鎖時有超時控制,當時間超過設(shè)定的超時時間,停止當前修復(fù)操作,不會存在半修復(fù)半不修復(fù)的情況,達到修復(fù)安全的目的。需要說明的是,一個主庫對應(yīng)一個或多個備庫,主庫和備庫可以分布在同一設(shè)備上,可以分布在不同設(shè)備上。具體地,加鎖裝置11用于實時比較主庫的執(zhí)行日志位點信息和備庫的執(zhí)行日志位點信息是否一致,當一致時,對所述主庫進行可讀不可寫的加鎖處 理。在此,等同步為主庫的執(zhí)行日志位點信息和對應(yīng)的備庫的執(zhí)行日志位點信息一致,實時比較主備庫的位點信息實現(xiàn)第一次等同步,即實時將獲取的主庫的執(zhí)行日志位點信息與獲取的備庫的執(zhí)行日志的位點信息進行比較,若一致,則為主備第一次等同步;當主備第一次等同步后,主備庫位于同一位點,對主庫進行加鎖處理使用戶短時間內(nèi)不可寫入,加鎖時間可為數(shù)秒,短暫時間內(nèi)對線上業(yè)務(wù)影響極小,此時利用中間層阻塞用戶的結(jié)構(gòu)化查詢語言。主庫的加鎖動作有超時控制,控制方式是通過另開線程等待該超時時間,時間到將放棄加鎖動作,并放棄本次修復(fù)。具體地,備庫停止裝置12實時比較所述主庫在完成加鎖處理時執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致,當一致時,停止所述備庫從所述主庫進行的復(fù)制工作。在一具體實施例中,以mysql為例,可在主庫中通過命令顯示主庫執(zhí)行日志文件的狀態(tài)信息(showmasterstatus)獲取到主庫當前位點信息,再等待備庫復(fù)制到該位點,主備庫在實現(xiàn)第一次等同步后的極短時間內(nèi)可實現(xiàn)第二次等同步,此時主庫的數(shù)據(jù)為備庫修復(fù)數(shù)據(jù)所需的,將備庫停止是指停止備庫從主庫進行復(fù)制,備庫停止后能夠獲取到備庫所需的數(shù)據(jù),且能在相應(yīng)的修復(fù)位點上進行修復(fù)。具體地,解鎖裝置13請求所述主庫備份待修復(fù)數(shù)據(jù),并在所述待修復(fù)數(shù)據(jù)備份完成后,對所述主庫進行解鎖處理。接前例,備庫停止后,主庫進行備份待修復(fù)數(shù)據(jù),在此,待修復(fù)數(shù)據(jù)是指備庫所需的修復(fù)數(shù)據(jù)塊或數(shù)據(jù)文件對應(yīng)的相應(yīng)數(shù)據(jù),將待修復(fù)的數(shù)據(jù)塊或數(shù)據(jù)文件在主庫進行本地備份,備份時間極短,因此此時主庫的加鎖超時尚未到,對主庫進行解鎖處理可以使用戶可以正常寫入。具體地,修復(fù)裝置14獲取所述待修復(fù)數(shù)據(jù),并基于所述待修復(fù)數(shù)據(jù)對所述備庫進行修復(fù),在修復(fù)完成后,開啟所述備庫從所述主庫進行的復(fù)制工作。在一優(yōu)選實施例中,主庫備份數(shù)據(jù)后,將本地備份的數(shù)據(jù)上傳到中轉(zhuǎn)站,備庫從中轉(zhuǎn)站中下載相應(yīng)的數(shù)據(jù)塊覆蓋到備庫或進行數(shù)據(jù)文件覆蓋。按照數(shù)據(jù)塊或數(shù)據(jù)文件進行修復(fù)避免了對數(shù)據(jù)進行逐行分析的問題,完成修復(fù)后開 啟備庫從主庫進行的復(fù)制工作,主備之間開始正常復(fù)制。圖2示出根據(jù)本申請一個方面的一個優(yōu)選實施例的修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的流程示意圖。其中的標號1-10為流程圖的順序,Master為所述主庫,Slave為其對應(yīng)的備庫。流程為:加鎖裝置11在主備第一次等同步后對主庫加鎖;接著,備庫停止裝置12在主備第二次等同步后停止備庫;隨后,解鎖裝置13在主庫備份數(shù)據(jù)后將主庫解鎖;最后,修復(fù)裝置14將主庫中的已備份數(shù)據(jù)上傳中轉(zhuǎn)站,備庫從中轉(zhuǎn)站中下載進行修復(fù)數(shù)據(jù),修復(fù)數(shù)據(jù)完成后將備庫開啟。在此,數(shù)據(jù)庫的引擎可分為兩種,一種為不支持事務(wù)的,一種為支持事務(wù)的,在此,對于不支持事務(wù)類型的,其每個表有單獨的數(shù)據(jù)文件和索引文件,進行修復(fù)時最安全的方式為數(shù)據(jù)文件的覆蓋,對于支持事務(wù)類型的,支持事務(wù)及行級鎖。因此,對于不支持事務(wù)的引擎,安全修復(fù)方式為進行數(shù)據(jù)文件的覆蓋,對于支持事務(wù)的引擎,在一個事務(wù)里用兩個執(zhí)行語句(包括刪除數(shù)據(jù)塊和導(dǎo)入備份的數(shù)據(jù))可以進行修復(fù)。以下為針對兩種引擎類型進行修復(fù)數(shù)據(jù)庫備份數(shù)據(jù)的優(yōu)選實施例進行說明修復(fù)流程。針對所述數(shù)據(jù)庫的數(shù)據(jù)引擎類型為不支持事務(wù)類型的,本申請所述設(shè)備1中的解鎖裝置13包括備份單元,如圖3示出,所述設(shè)備1中的所述修復(fù)裝置14包括:鎖表單元141、獲取單元142、解鎖單元143和修復(fù)表單元144;其中,所述備份單元131請求所述主庫備份所述待修復(fù)數(shù)據(jù)的數(shù)據(jù)文件和索引文件;所述鎖表單元141對所述備庫進行鎖表處理;獲取單元142獲取從所述主庫中所備份的待修復(fù)數(shù)據(jù);解鎖單元143對所述備庫進行解鎖處理;修復(fù)表單元144基于所述待修復(fù)數(shù)據(jù)進行修復(fù)表操作。進一步地,在所述設(shè)備1中,所述解鎖裝置13包括:備份單元,用于請求所述主庫備份所述待修復(fù)數(shù)據(jù)的數(shù)據(jù)文件和索引文件。在此,對于數(shù)據(jù)庫的數(shù)據(jù)引擎類型為不支持事務(wù)類型,每個表有單獨的數(shù)據(jù)文件和索引文件,進行修復(fù)時最安全的方式為數(shù)據(jù)文件的覆蓋,因此主庫進行備份數(shù)據(jù)時為備份所述待修復(fù)數(shù)據(jù)的數(shù)據(jù)文件和索引文件。需要說明的是,Myisam引擎有自帶的附加修復(fù)(repairtable)動作,在主庫備份時備份待修復(fù)數(shù)據(jù)的數(shù)據(jù)文件,備庫執(zhí)行附加修復(fù)(repairtable)動作重建被修復(fù) 數(shù)據(jù)的索引數(shù)據(jù)。具體地,在所述設(shè)備1中,所述修復(fù)裝置14包括:鎖表單元141對所述備庫進行鎖表處理;獲取單元142獲取從所述主庫中所備份的待修復(fù)數(shù)據(jù);解鎖單元143對所述備庫進行解鎖處理;修復(fù)表單元144基于所述待修復(fù)數(shù)據(jù)進行修復(fù)表操作。例如,Mysiam引擎為不支持事務(wù),對主庫進行加鎖時表現(xiàn)為鎖表,即直接鎖定整張表,修復(fù)過程中主庫中待修復(fù)數(shù)據(jù)備份并將所備份的數(shù)據(jù)上傳到中轉(zhuǎn)站中后,因Mysiam引擎的修復(fù)過程中對備庫執(zhí)行了附加修復(fù)(repairtable)動作,為防止用戶或數(shù)據(jù)庫管理員(dba)進行附加修復(fù)(repairtable)動作從而影響修復(fù),需對備庫進行鎖表操作。因備庫從主庫中的復(fù)制過程已停止,備庫若要獲取主庫中所備份的待修復(fù)數(shù)據(jù)可通過先將主庫中已備份好的數(shù)據(jù)上傳到中轉(zhuǎn)站,然后備庫再從中轉(zhuǎn)站下載備份數(shù)據(jù)。備庫獲取備份的待修復(fù)數(shù)據(jù)后對備庫進行解鎖,備庫執(zhí)行附加修復(fù)(repairtable)動作,重建被修復(fù)數(shù)據(jù)的索引數(shù)據(jù)等,保證備庫中原有的數(shù)據(jù)文件被完全覆蓋,獲得新的正確的數(shù)據(jù)文件。需要說明的是,Myisam引擎能夠執(zhí)行附加修復(fù)(repairtable)動作,主庫備份時只需備份數(shù)據(jù)文件,備庫執(zhí)行附加修復(fù)動作時能夠重建索引文件,對于其它不帶附加修復(fù)動作的不支持事務(wù)的引擎,主庫備份時備份數(shù)據(jù)文件和索引文件,備庫利用獲取已備份好的數(shù)據(jù)文件和索引文件進行文件覆蓋實現(xiàn)表的修復(fù)。進一步地,例如,Myisam引擎不支持事務(wù),在Myisam表中每個被存在分離的文件中,Myisam為表級鎖,直接鎖定整張表,在鎖定期間,其它進程無法對該表進行寫操作。此外,針對Myisam進行修復(fù)的前期工作流程為:首先檢查是否需要修復(fù),包括檢查主備庫的地址(ip)、端口(port)的關(guān)系來確定主備切換機制沒有改變,檢查主備的數(shù)據(jù)庫文件(db)、數(shù)據(jù)列表(table)的存在性,以確定某個數(shù)據(jù)庫中的某個文檔及其相應(yīng)的表都是完整的,以及檢查主備庫的數(shù)據(jù)引擎的變化等確定是否需要修復(fù);若需要數(shù)據(jù)修復(fù)則在主備的同步狀態(tài)下將主庫中的數(shù)據(jù)塊和備庫中相應(yīng)的數(shù)據(jù)塊進行比對,檢查是否一致,若不一致則關(guān)閉主備切換功能(HA),停止容災(zāi),防止修復(fù)過程中主備關(guān)系發(fā)生變化,如一個主庫對應(yīng)多個備庫,在修復(fù)過程中,主庫與備庫A關(guān)系發(fā)生變化,備庫A已被備庫B替換,主庫執(zhí)行的sql 會執(zhí)行到備庫B中,造成備庫B中數(shù)據(jù)錯誤;接著,在主備的同步狀態(tài)下檢查是否已經(jīng)修復(fù),若未修復(fù)則對備庫執(zhí)行附加修復(fù)(repairtable)動作,對于能夠用repairtable修復(fù)的數(shù)據(jù)可以避免進行鎖表才能修復(fù),需說明的是,附加修復(fù)(repairtable)動作只是僅對mysql的Myisam引擎的附加動作,其他的數(shù)據(jù)庫中沒有這一動作。完成備庫的修復(fù)表操作后實時比較主庫的執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致,進行后續(xù)的修復(fù)流程。如前例,以Myisam引擎為例的數(shù)據(jù)庫備庫數(shù)據(jù)的修復(fù)流程為本申請的一優(yōu)選實施例,首先,檢查主備庫的地址(ip)、端口(port)的關(guān)系,數(shù)據(jù)庫文件(db)、數(shù)據(jù)列表(table)的存在性,以及數(shù)據(jù)引擎的變化等;當檢查沒問題時在主備庫的復(fù)制達到同一位點的狀態(tài)下從主庫獲取不一致的數(shù)據(jù)塊進行直接比對,若比對結(jié)果為不一致則關(guān)閉主備切換功能,在主備庫的復(fù)制達到同一位點的狀態(tài)下檢查主備間數(shù)據(jù)是否一致,若不一致,對于Myisam則需要對備庫執(zhí)行附加的修復(fù)動作(repairtable),其它數(shù)據(jù)庫不執(zhí)行此附加動作,重新檢查是否需要修復(fù),若需要修復(fù),則執(zhí)行以下修復(fù)流程:在加鎖裝置11中,獲取主庫的執(zhí)行日志位點信息和備庫的執(zhí)行日志位點信息,將兩個位點信息進行比較,若相同,則加鎖裝置11對主庫進行加鎖處理,引擎為不支持事務(wù)時即為鎖表,直接對整張表進行鎖定。在備庫停止裝置12中,當備庫的執(zhí)行日志的位點達到主庫完成加鎖處理時的執(zhí)行日志的位點時,備庫停止從主庫復(fù)制操作,此時可在需要修復(fù)數(shù)據(jù)對應(yīng)的位點上對獲取到主備庫上不一致的數(shù)據(jù)塊進行修復(fù)。解鎖裝置13用于請求所述主庫備份待修復(fù)數(shù)據(jù),主庫獲取到請求后會將數(shù)據(jù)文件進行本地備份,備份完成后,主庫進行解鎖處理。在修復(fù)裝置14中,獲取所述待修復(fù)數(shù)據(jù),方式為主庫將備份的數(shù)據(jù)上傳到中轉(zhuǎn)站,備庫從中轉(zhuǎn)站中進行下載備份數(shù)據(jù),接著,備庫執(zhí)行重建被修復(fù)數(shù)據(jù)的索引數(shù)據(jù)的操作,在修復(fù)完成后,開啟備庫使其從主庫中的復(fù)制能夠正常進行。最后,打開主備切換功能,恢復(fù)數(shù)據(jù)庫的正常狀態(tài)。本領(lǐng)域技術(shù)人員應(yīng)能理解,所述Myisam的數(shù)據(jù)庫備庫數(shù)據(jù)修復(fù)流程為本申請的一優(yōu)選實施例,對本申請所述用于針對數(shù)據(jù)庫的數(shù)據(jù)引擎類型為不支持事務(wù)時的修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的方法進行詳細描述,當然,現(xiàn)有或今后可能出現(xiàn)的適合本申請修復(fù)流程的數(shù)據(jù)庫,均可以引用的方式包含于本申請。針對所述數(shù)據(jù)庫的數(shù)據(jù)引擎類型為支持事務(wù)類型的,在本申請設(shè)備1中,所述解鎖裝置13包括備份單元,所述修復(fù)裝置14包括導(dǎo)入單元;其中,所述備份單元用于請求所述主庫對所述待修復(fù)數(shù)據(jù)所在的數(shù)據(jù)塊進行邏輯備份;所述導(dǎo)入單元用于刪除所述備庫中待修復(fù)的事務(wù)數(shù)據(jù),將所述主庫所邏輯備份的待修復(fù)數(shù)據(jù)所在的數(shù)據(jù)塊導(dǎo)入所述備庫。以所述數(shù)據(jù)庫的數(shù)據(jù)引擎類型為支持事務(wù)類型為例進行詳細說明數(shù)據(jù)庫備庫數(shù)據(jù)修復(fù)流程。具體地,所述解鎖裝置13包括:備份單元,請求所述主庫對所述待修復(fù)數(shù)據(jù)所在的數(shù)據(jù)塊進行邏輯備份。在一優(yōu)選實施例中,主庫進行本地備份是對待修復(fù)數(shù)據(jù)所在的數(shù)據(jù)塊進行邏輯備份,其中,邏輯備份是指只是原數(shù)據(jù)庫中數(shù)據(jù)內(nèi)容的一個映像;邏輯備份后主庫進行解鎖之前鎖定的數(shù)據(jù)塊,將本地備份的待修復(fù)數(shù)據(jù)上傳到中轉(zhuǎn)站,備庫從中轉(zhuǎn)站下載備份。具體地,所述修復(fù)裝置14還包括:導(dǎo)入單元,刪除所述備庫中待修復(fù)的事務(wù)數(shù)據(jù),將所述主庫所邏輯備份的待修復(fù)數(shù)據(jù)所在的數(shù)據(jù)塊導(dǎo)入所述備庫。接前例,備庫從中轉(zhuǎn)站下載備份后用下載的邏輯備份對備庫數(shù)據(jù)進行修復(fù),修復(fù)動作即在同一事務(wù)內(nèi)刪除原來的數(shù)據(jù)和向備庫導(dǎo)入主庫備份的數(shù)據(jù)。進一步地,例如,Innodb為Mysql數(shù)據(jù)庫的一種引擎,其支持事務(wù)及行級鎖,其中,行級鎖是指僅對指定的記錄進行加鎖,其它進程還是可以對同一表的記錄進行操作。Innodb存儲它的表和索引在一個表空間中,表空間可以包含數(shù)個文件或原始磁盤分區(qū)。此外,針對Innodb進行修復(fù)的前期工作流程為:首先檢查是否需要修復(fù),包括檢查主備庫的地址(ip)、端口(port)的關(guān)系來確定主備切換機制沒有改變,檢查主備的數(shù)據(jù)庫文件(db)、數(shù)據(jù)列表(table)的存在性,以確定某個數(shù)據(jù)庫中的某個文檔及其相應(yīng)的表都是完整的,以及檢查主備庫的數(shù)據(jù)引擎的變化等確定是否需要修復(fù);若需要數(shù)據(jù)修復(fù)則在主備的同步狀態(tài)下將主庫中的數(shù)據(jù)塊和備庫中相應(yīng)的數(shù)據(jù)塊進行比對,檢查是否一致,若不一致則關(guān)閉主備切換的HA功能,停止容災(zāi),防止修復(fù)過程中主備關(guān)系發(fā)生變化,如一個主庫對應(yīng)多個備庫,在修復(fù)過程中,主庫與備庫A關(guān)系發(fā)生變化,備庫A已被備庫B替換,主庫執(zhí)行的結(jié)構(gòu)化查 詢語句(sql)會執(zhí)行到備庫B中,造成備庫B中數(shù)據(jù)錯誤。完成備庫的修復(fù)表操作后實時比較主庫的執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致,進行后續(xù)的修復(fù)流程。如前例,以Innodb引擎為例的數(shù)據(jù)庫備庫數(shù)據(jù)的修復(fù)流程為本申請的又一優(yōu)選實施例,首先,檢查主備庫的地址(ip)、端口(port)的關(guān)系,數(shù)據(jù)庫文件(db)、數(shù)據(jù)列表(table)的存在性,以及數(shù)據(jù)引擎的變化等;當檢查沒問題時在主備庫的復(fù)制達到同一位點的狀態(tài)下從主庫獲取不一致的數(shù)據(jù)塊進行直接比對,若比對結(jié)果為不一致則關(guān)閉主備切換功能,在主備庫的復(fù)制達到同一位點的狀態(tài)下檢查主備間數(shù)據(jù)是否一致,若不一致,則執(zhí)行以下修復(fù)流程:在加鎖裝置11中,獲取主庫的執(zhí)行日志位點信息和備庫的執(zhí)行日志位點信息,將兩個位點信息進行比較,若相同,則加鎖裝置11對主庫進行加鎖處理,引擎為支持事務(wù)時即為鎖數(shù)據(jù)塊,直接對指定的數(shù)據(jù)塊進行鎖定。在備庫停止裝置12中,當備庫的執(zhí)行日志的位點達到主庫完成加鎖處理時的執(zhí)行日志的位點時,備庫停止從主庫復(fù)制操作,此時可在需要修復(fù)數(shù)據(jù)對應(yīng)的位點上對獲取到主備庫上不一致的數(shù)據(jù)塊進行修復(fù)。解鎖裝置13用于請求所述主庫備份待修復(fù)數(shù)據(jù),主庫獲取到請求后會將數(shù)據(jù)塊進行邏輯備份,備份完成后,主庫進行解鎖處理,即解鎖數(shù)據(jù)塊。在修復(fù)裝置14中,獲取所述待修復(fù)數(shù)據(jù),方式為主庫將備份的數(shù)據(jù)上傳到中轉(zhuǎn)站,備庫從中轉(zhuǎn)站中進行下載備份數(shù)據(jù),接著,用下載的邏輯備份對備庫數(shù)據(jù)進行修復(fù),修復(fù)動作是在同一事務(wù)內(nèi)刪除原來的數(shù)據(jù)和向備庫導(dǎo)入主庫備份的數(shù)據(jù),在修復(fù)完成后,開啟備庫使其從主庫中的復(fù)制能夠正常進行。最后,打開主備切換功能,恢復(fù)數(shù)據(jù)庫的正常狀態(tài)。本領(lǐng)域技術(shù)人員應(yīng)能理解,上述Innodb的數(shù)據(jù)庫備庫數(shù)據(jù)的修復(fù)流程為本申請的又一優(yōu)選實施例,對本申請所述用于針對數(shù)據(jù)庫的數(shù)據(jù)引擎類型為支持事務(wù)時的修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的方法進行詳細描述,當然,現(xiàn)有或今后可能出現(xiàn)的適合本申請修復(fù)流程的數(shù)據(jù)庫,均可以引用的方式包含于本申請。需要說明的是,所述數(shù)據(jù)庫的數(shù)據(jù)引擎類型為不支持事務(wù)類型時的修復(fù)方式為所述優(yōu)選實施例中的文件覆蓋,但本領(lǐng)域技術(shù)人員應(yīng)能理解,不支持事務(wù)類型的修復(fù)方式也可按照支持事務(wù)的修復(fù)流程進行修復(fù),如主庫備份時 為邏輯備份,備庫數(shù)據(jù)修復(fù)時刪除數(shù)據(jù)塊和導(dǎo)入備份數(shù)據(jù),但相比較而言,進行文件覆蓋的方式安全性更高。優(yōu)選地,所述設(shè)備1還包括:關(guān)閉裝置(未顯示),用于在所述實時比較主庫的執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致之前,關(guān)閉所述主庫與所述備庫之間的主備切換功能;備庫開啟裝置(未顯示),用于在所述獲取所述待修復(fù)數(shù)據(jù),并基于所述待修復(fù)數(shù)據(jù)對所述備庫進行修復(fù),在修復(fù)完成后,打開所述主庫與所述備庫之間的主備切換功能。在此,在實時比較主庫的執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致之前,需要關(guān)閉主備切換功能(HA),用戶將數(shù)據(jù)寫入主庫,當主庫發(fā)生某個錯誤時HA切換到其對應(yīng)的備庫,因此關(guān)閉HA功能避免了在修復(fù)過程中發(fā)生用戶將數(shù)據(jù)寫到備庫的情況。在修復(fù)完成后,需要打開主備HA功能,使主備能夠進行正常的切換。優(yōu)選地,所述設(shè)備1還包括:記錄裝置(未顯示),用于記錄對所述主庫進行可讀不可寫加鎖處理的已加鎖時間,當所述已加鎖時間超過設(shè)定超時時間時,停止當前修復(fù)操作。在一具體實施例中,主庫進行可讀不可寫加鎖處理操作時需要有超時控制,控制方式可以通過另開線程等待該超時時間,時間到將放棄加鎖動作,并放棄本次修復(fù)。本領(lǐng)域技術(shù)人員應(yīng)能理解,所述控制超時方法僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的控制超時的方法如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護范圍以內(nèi),并在此以引用方式包含于此。進一步地,與現(xiàn)有技術(shù)相比,通過上述本申請的實施例可知,在修復(fù)流程過程中沒有通過執(zhí)行總和檢驗碼逐行比較主備數(shù)據(jù)塊中的每一行,而是通過數(shù)據(jù)文件的覆蓋或?qū)霐?shù)據(jù)塊實現(xiàn)數(shù)據(jù)庫備庫數(shù)據(jù)的修復(fù),從而避免了被修復(fù)表沒有唯一主鍵時所造成的修復(fù)對象錯誤的情況克服不需要對數(shù)據(jù)塊進行逐行分析就可以完成準確修復(fù)數(shù)據(jù)的問題。圖4出根據(jù)本申請又一個方面的一種用于修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的方法流程示意圖。該方法包括步驟S11、步驟S12、步驟S13和步驟S14。其中,在步驟S11中,實時比較主庫的執(zhí)行日志位點信息和備庫的執(zhí)行 日志位點信息是否一致,當一致時,對所述主庫進行可讀不可寫的加鎖處理;在步驟S12中,實時比較所述主庫在完成加鎖處理時執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致,當一致時,停止所述備庫從所述主庫進行的復(fù)制工作;在步驟S13中,請求所述主庫備份待修復(fù)數(shù)據(jù),并在所述待修復(fù)數(shù)據(jù)備份完成后,對所述主庫進行解鎖處理;在步驟S14中,獲取所述待修復(fù)數(shù)據(jù),并基于所述待修復(fù)數(shù)據(jù)對所述備庫進行修復(fù),在修復(fù)完成后,開啟所述備庫從所述主庫進行的復(fù)制工作。數(shù)據(jù)庫系統(tǒng)中,為解決單點問題,同時為了實現(xiàn)數(shù)據(jù)實例負載均衡,往往建立一個主庫及建立一個或多個對主庫進行復(fù)制的備庫,只有主庫可以寫入,備庫只可以進行讀取。主從復(fù)制原理往往是通過備庫復(fù)制主庫的執(zhí)行日志(binlog)再進行執(zhí)行來完成的。對于復(fù)制關(guān)系,各種數(shù)據(jù)庫產(chǎn)品都有各自的實現(xiàn)方法,以mysql(一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng))為例,mysql主庫在事務(wù)提交時寫執(zhí)行日志,并通過同步執(zhí)行日志(sync_binlog)參數(shù)來控制執(zhí)行日志刷新到磁盤“落地”,而備庫通過輸入輸出(io)線程從主庫讀取執(zhí)行日志,并記錄到本地的中繼日志(relaylog)中,由本地的sql(結(jié)構(gòu)化查詢語言)線程再將中繼日志的數(shù)據(jù)應(yīng)用到本地數(shù)據(jù)庫。數(shù)據(jù)庫為了效率等原因,數(shù)據(jù)只保存在內(nèi)存中,沒有真正的寫入到磁盤上去。如果數(shù)據(jù)庫響應(yīng)為“提交成功”,但是由于數(shù)據(jù)庫掛掉,操作系統(tǒng),數(shù)據(jù)庫主機等任何問題導(dǎo)致這次“提交成功”的事務(wù)對數(shù)據(jù)庫的修改沒有生效,那么我們認為這個事務(wù)的數(shù)據(jù)丟失了。對于銀行業(yè)務(wù)或者金融業(yè)務(wù)等數(shù)據(jù)一致性要求高的場景來說是不能接受的,所以,保證數(shù)據(jù)不丟失也是數(shù)據(jù)庫選擇的一個重要衡量標準。為了保證數(shù)據(jù)不丟失以及主備間數(shù)據(jù)的一致性,各類數(shù)據(jù)庫系統(tǒng)都做了大量的工作,但是在實際使用過程中,在數(shù)據(jù)可靠性和使用效率上往往要做一個權(quán)衡,這就給主備數(shù)據(jù)不一致的產(chǎn)生創(chuàng)造了可能性,另外,由于雙寫、日志文件損壞等因素,即使運行在完全高可靠的工作模式,仍有可能造成主備間數(shù)據(jù)不一致。本申請又一實施例所述方法用于修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù),由于主備庫兩次等同步后對主庫短暫的加鎖,通過停止備庫,主庫內(nèi)待修復(fù)數(shù)據(jù)的備份及備庫獲取已備份好的數(shù)據(jù)進行修復(fù)數(shù)據(jù),按數(shù)據(jù)塊或數(shù)據(jù)文件修復(fù),無 需對數(shù)據(jù)進行逐行分析,就可以完成修復(fù)。修復(fù)過程控制在數(shù)秒內(nèi),在云計算場景下,可以不暫停業(yè)務(wù)就可以修復(fù)數(shù)據(jù),主備兩次等同步使在修復(fù)的位點上修復(fù)了所需修復(fù)的數(shù)據(jù),達到精確修復(fù)的效果;進一步地,對主庫加鎖時有超時控制,當時間超過設(shè)定的超時時間,停止當前修復(fù)操作,不會存在半修復(fù)半不修復(fù)的情況,達到修復(fù)安全的目的。需要說明的是,一個主庫對應(yīng)一個或多個備庫,主庫和備庫可以分布在同一設(shè)備上,可以分布在不同設(shè)備上。具體地,步驟S11:實時比較主庫的執(zhí)行日志位點信息和備庫的執(zhí)行日志位點信息是否一致,當一致時,對所述主庫進行可讀不可寫的加鎖處理。在此,等同步為主庫的執(zhí)行日志位點信息和對應(yīng)的備庫的執(zhí)行日志位點信息一致,實時比較主備庫的位點信息實現(xiàn)第一次等同步,即實時將獲取的主庫的執(zhí)行日志位點信息與獲取的備庫的執(zhí)行日志的位點信息進行比較,若一致,則為主備第一次等同步;當主備第一次等同步后,主備庫位于同一位點,對主庫進行加鎖處理使用戶短時間內(nèi)不可寫入,加鎖時間可為數(shù)秒,短暫時間內(nèi)對線上業(yè)務(wù)影響極小,此時利用中間層阻塞用戶的結(jié)構(gòu)化查詢語言(sql)。主庫的加鎖動作有超時控制,控制方式是通過另開線程等待該超時時間,時間到將放棄加鎖動作,并放棄本次修復(fù)。具體地,步驟S12:實時比較所述主庫在完成加鎖處理時執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致,當一致時,停止所述備庫從所述主庫進行的復(fù)制工作。在一具體實施例中,以mysql為例,可在主庫中通過命令顯示主庫執(zhí)行日志文件的狀態(tài)信息(showmasterstatus)獲取到主庫當前位點信息,再等待備庫復(fù)制到該位點,主備庫在實現(xiàn)第一次等同步后的極短時間內(nèi)可實現(xiàn)第二次等同步,此時主庫的數(shù)據(jù)為備庫修復(fù)數(shù)據(jù)所需的,將備庫停止是指停止備庫從主庫進行復(fù)制,備庫停止后能夠獲取到備庫所需的數(shù)據(jù),且能在相應(yīng)的修復(fù)位點上進行修復(fù)。具體地,步驟S13:請求所述主庫備份待修復(fù)數(shù)據(jù),并在所述待修復(fù)數(shù)據(jù)備份完成后,對所述主庫進行解鎖處理。接前例,備庫停止后,主庫進行備份待修復(fù)數(shù)據(jù),在此,待修復(fù)數(shù)據(jù)是 指備庫所需的修復(fù)數(shù)據(jù)塊或數(shù)據(jù)文件對應(yīng)的相應(yīng)數(shù)據(jù),將待修復(fù)的數(shù)據(jù)塊或數(shù)據(jù)文件在主庫進行本地備份,備份時間極短,因此此時主庫的加鎖超時尚未到,對主庫進行解鎖處理可以使用戶可以正常寫入。具體地,步驟S14:獲取所述待修復(fù)數(shù)據(jù),并基于所述待修復(fù)數(shù)據(jù)對所述備庫進行修復(fù),在修復(fù)完成后,開啟所述備庫從所述主庫進行的復(fù)制工作。在一優(yōu)選實施例中,主庫備份數(shù)據(jù)后,將本地備份的數(shù)據(jù)上傳到中轉(zhuǎn)站,備庫從中轉(zhuǎn)站中下載相應(yīng)的數(shù)據(jù)塊覆蓋到備庫或進行數(shù)據(jù)文件覆蓋。按照數(shù)據(jù)塊或數(shù)據(jù)文件進行修復(fù)避免了對數(shù)據(jù)進行逐行分析的問題,完成修復(fù)后開啟備庫從主庫進行的復(fù)制工作,主備之間開始正常復(fù)制。圖2示出根據(jù)本申請一個方面的一個優(yōu)選實施例的修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的流程示意圖。其中的標號1-10為流程圖的順序,Master為所述主庫,Slave為其對應(yīng)的備庫。流程為:步驟S11,在主備第一次等同步后對主庫加鎖;接著,在步驟S12中,在主備第二次等同步后停止備庫;隨后,在步驟S13中,在主庫備份數(shù)據(jù)后將主庫解鎖;最后,在步驟S14中,將主庫中的已備份數(shù)據(jù)上傳中轉(zhuǎn)站,備庫從中轉(zhuǎn)站中下載進行修復(fù)數(shù)據(jù),修復(fù)數(shù)據(jù)完成后將備庫開啟。在此,數(shù)據(jù)庫的引擎可分為兩種,一種為不支持事務(wù)的,一種為支持事務(wù)的,在此,對于不支持事務(wù)類型的,其每個表有單獨的數(shù)據(jù)文件和索引文件,進行修復(fù)時最安全的方式為數(shù)據(jù)文件的覆蓋,對于支持事務(wù)類型的,支持事務(wù)及行級鎖。因此,對于不支持事務(wù)的引擎,安全修復(fù)方式為進行數(shù)據(jù)文件的覆蓋,對于支持事務(wù)的引擎,在一個事務(wù)里用兩個執(zhí)行語句(包括刪除數(shù)據(jù)塊和導(dǎo)入備份的數(shù)據(jù))可以進行修復(fù)。以下為針對兩種引擎類型進行修復(fù)數(shù)據(jù)庫備份數(shù)據(jù)的優(yōu)選實施例進行說明修復(fù)流程。針對所述數(shù)據(jù)庫的數(shù)據(jù)引擎類型為不支持事務(wù)類型的,本申請所述方法中的步驟S13請求所述主庫備份所述待修復(fù)數(shù)據(jù)的數(shù)據(jù)文件和索引文件;如圖5示出,所述步驟S14包括:步驟S141、步驟S142、步驟S143和步驟S144,其中,在所述步驟S141中,對所述備庫進行鎖表處理;在所述步驟S142中,獲取從所述主庫中所備份的待修復(fù)數(shù)據(jù);在步驟S143中,對所述備庫進行解鎖處理;修復(fù)表單元144基于所述待修復(fù)數(shù)據(jù)進行修復(fù)表操作。具體地,請求所述主庫備份待修復(fù)數(shù)據(jù)包括:請求所述主庫備份所述待修復(fù)數(shù)據(jù)的數(shù)據(jù)文件和索引文件。在此,對于數(shù)據(jù)庫的數(shù)據(jù)引擎類型為不支持事務(wù)類型,每個表有單獨的數(shù)據(jù)文件和索引文件,進行修復(fù)時最安全的方式為數(shù)據(jù)文件的覆蓋,因此主庫進行備份數(shù)據(jù)時為備份所述待修復(fù)數(shù)據(jù)的數(shù)據(jù)文件和索引文件。需要說明的是,Myisam引擎有自帶的附加修復(fù)(repairtable)動作,在主庫備份時備份待修復(fù)數(shù)據(jù)的數(shù)據(jù)文件,備庫執(zhí)行附加修復(fù)(repairtable)動作重建被修復(fù)數(shù)據(jù)的索引數(shù)據(jù)。具體地,所述獲取所述待修復(fù)數(shù)據(jù)包括:步驟S141,對所述備庫進行鎖表處理;步驟S142,獲取從所述主庫中所備份的待修復(fù)數(shù)據(jù);步驟S143,對所述備庫進行解鎖處理;步驟S144,基于所述待修復(fù)數(shù)據(jù)進行修復(fù)表操作。例如,Mysiam引擎為不支持事務(wù),對主庫進行加鎖時表現(xiàn)為鎖表,即直接鎖定整張表,修復(fù)過程中主庫中待修復(fù)數(shù)據(jù)備份并將所備份的數(shù)據(jù)上傳到中轉(zhuǎn)站中后,因Mysiam引擎的修復(fù)過程中對備庫執(zhí)行了附加修復(fù)(repairtable)動作,為防止用戶或數(shù)據(jù)庫管理員(dba)進行附加修復(fù)(repairtable)動作從而影響修復(fù),需對備庫進行鎖表操作。因備庫從主庫中的復(fù)制過程已停止,備庫若要獲取主庫中所備份的待修復(fù)數(shù)據(jù)可通過先將主庫中已備份好的數(shù)據(jù)上傳到中轉(zhuǎn)站,然后備庫再從中轉(zhuǎn)站下載備份數(shù)據(jù)。備庫獲取備份的待修復(fù)數(shù)據(jù)后對備庫進行解鎖,備庫執(zhí)行附加修復(fù)(repairtable)動作,重建被修復(fù)數(shù)據(jù)的索引數(shù)據(jù)等,保證備庫中原有的數(shù)據(jù)文件被完全覆蓋,獲得新的正確的數(shù)據(jù)文件。需要說明的是,Mysiam引擎能夠執(zhí)行附加修復(fù)(repairtable)動作,主庫備份時只需備份數(shù)據(jù)文件,備庫執(zhí)行附加修復(fù)動作時能夠重建索引文件,對于其它不帶附加修復(fù)動作的不支持事務(wù)的引擎,主庫備份時備份數(shù)據(jù)文件和索引文件,備庫利用獲取已備份好的數(shù)據(jù)文件和索引文件進行文件覆蓋實現(xiàn)表的修復(fù)。進一步地,例如,Myisam引擎不支持事務(wù),在Myisam表中每個被存在分離的文件中,Myisam為表級鎖,直接鎖定整張表,在鎖定期間,其它進程無法對該表進行寫操作。此外,針對Myisam進行修復(fù)的前期工作流程為: 首先檢查是否需要修復(fù),包括檢查主備庫的地址(ip)、端口(port)的關(guān)系來確定主備切換機制沒有改變,檢查主備的數(shù)據(jù)庫文件(db)、數(shù)據(jù)列表(table)的存在性,以確定某個數(shù)據(jù)庫中的某個文檔及其相應(yīng)的表都是完整的,以及檢查主備庫的數(shù)據(jù)引擎的變化等確定是否需要修復(fù);若需要數(shù)據(jù)修復(fù)則在主備的同步狀態(tài)下將主庫中的數(shù)據(jù)塊和備庫中相應(yīng)的數(shù)據(jù)塊進行比對,檢查是否一致,若不一致則關(guān)閉主備切換功能(HA),停止容災(zāi),防止修復(fù)過程中主備關(guān)系發(fā)生變化,如一個主庫對應(yīng)多個備庫,在修復(fù)過程中,主庫與備庫A關(guān)系發(fā)生變化,備庫A已被備庫B替換,主庫執(zhí)行的結(jié)構(gòu)化查詢語句(sql)會執(zhí)行到備庫B中,造成備庫B中數(shù)據(jù)錯誤;接著,在主備的同步狀態(tài)下檢查是否已經(jīng)修復(fù),若未修復(fù)則對備庫執(zhí)行附加修復(fù)(repairtable)動作,對于能夠用附加修復(fù)(repairtable)動作修復(fù)的數(shù)據(jù)可以避免進行鎖表才能修復(fù),需說明的是,附加修復(fù)(repairtable)動作只是僅對mysql的Myisam引擎的附加動作,其他的數(shù)據(jù)庫中沒有這一動作。完成備庫的修復(fù)表操作后實時比較主庫的執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致,進行后續(xù)的修復(fù)流程。如前例,以Myisam引擎為例的數(shù)據(jù)庫備庫數(shù)據(jù)的修復(fù)流程為本申請的一優(yōu)選實施例,首先,檢查主備庫的地址(ip)、端口(port)的關(guān)系,數(shù)據(jù)文件(db)、數(shù)據(jù)列表(table)的存在性,以及數(shù)據(jù)引擎的變化等;當檢查沒問題時在主備庫的復(fù)制達到同一位點的狀態(tài)下從主庫獲取不一致的數(shù)據(jù)塊進行直接比對,若比對結(jié)果為不一致則關(guān)閉主備切換功能,在主備庫的復(fù)制達到同一位點的狀態(tài)下檢查主備間數(shù)據(jù)是否一致,若不一致,對于Myisam則需要對備庫執(zhí)行附加的修復(fù)動作(repairtable),其它數(shù)據(jù)庫不執(zhí)行此附加動作,重新檢查是否需要修復(fù),若需要修復(fù),則執(zhí)行以下修復(fù)流程:在步驟S11中,獲取主庫的執(zhí)行日志位點信息和備庫的執(zhí)行日志位點信息,將兩個位點信息進行比較,若相同,則在步驟S11中對主庫進行加鎖處理,引擎為不支持事務(wù)時即為鎖表,直接對整張表進行鎖定。在步驟S12中,當備庫的執(zhí)行日志的位點達到主庫完成加鎖處理時的執(zhí)行日志的位點時,備庫停止從主庫復(fù)制操作,此時可在需要修復(fù)數(shù)據(jù)對應(yīng)的位點上對獲取到主備庫上不一致的數(shù)據(jù)塊進行修復(fù)。在步驟S13中,請求所述主庫備份待修復(fù)數(shù)據(jù),主庫獲取 到請求后會將數(shù)據(jù)文件進行本地備份,備份完成后,主庫進行解鎖處理。在步驟S14中,獲取所述待修復(fù)數(shù)據(jù),方式為主庫將備份的數(shù)據(jù)上傳到中轉(zhuǎn)站,備庫從中轉(zhuǎn)站中進行下載備份數(shù)據(jù),接著,備庫執(zhí)行重建被修復(fù)數(shù)據(jù)的索引數(shù)據(jù)的操作,在修復(fù)完成后,開啟備庫使其從主庫中的復(fù)制能夠正常進行。最后,打開主備切換功能,恢復(fù)數(shù)據(jù)庫的正常狀態(tài)。本領(lǐng)域技術(shù)人員應(yīng)能理解,所述Myisam的數(shù)據(jù)庫備庫數(shù)據(jù)修復(fù)流程為本申請的一優(yōu)選實施例,對本申請所述用于針對數(shù)據(jù)庫的數(shù)據(jù)引擎類型為不支持事務(wù)時的修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的方法進行詳細描述,當然,現(xiàn)有或今后可能出現(xiàn)的適合本申請修復(fù)流程的數(shù)據(jù)庫,均可以引用的方式包含于本申請。針對所述數(shù)據(jù)庫的數(shù)據(jù)引擎類型為支持事務(wù)類型的,在本申請方法中,所述步驟S13還包括:請求所述主庫對所述待修復(fù)數(shù)據(jù)所在的數(shù)據(jù)塊進行邏輯備份;在所述步驟14還包括:刪除所述備庫中待修復(fù)的事務(wù)數(shù)據(jù),將所述主庫所邏輯備份的待修復(fù)數(shù)據(jù)所在的數(shù)據(jù)塊導(dǎo)入所述備庫。以所述數(shù)據(jù)庫的數(shù)據(jù)引擎類型為支持事務(wù)類型為例進行詳細說明數(shù)據(jù)庫備庫數(shù)據(jù)修復(fù)流程。具體地,所述主庫備份待修復(fù)數(shù)據(jù)還包括:請求所述主庫對所述待修復(fù)數(shù)據(jù)所在的數(shù)據(jù)塊進行邏輯備份。在一優(yōu)選實施例中,主庫進行本地備份是對待修復(fù)數(shù)據(jù)所在的數(shù)據(jù)塊進行邏輯備份,其中,邏輯備份是指只是原數(shù)據(jù)庫中數(shù)據(jù)內(nèi)容的一個映像;邏輯備份后主庫進行解鎖之前鎖定的數(shù)據(jù)塊,將本地備份的待修復(fù)數(shù)據(jù)上傳到中轉(zhuǎn)站,備庫從中轉(zhuǎn)站下載備份。具體地,基于所述待修復(fù)數(shù)據(jù)對所述備庫進行修復(fù)還包括:刪除所述備庫中待修復(fù)的事務(wù)數(shù)據(jù),將所述主庫所邏輯備份的待修復(fù)數(shù)據(jù)所在的數(shù)據(jù)塊導(dǎo)入所述備庫。接前例,備庫從中轉(zhuǎn)站下載備份后用下載的邏輯備份對備庫數(shù)據(jù)進行修復(fù),修復(fù)動作即在同一事務(wù)內(nèi)刪除原來的數(shù)據(jù)和向備庫導(dǎo)入主庫備份的數(shù)據(jù)。進一步地,例如,Innodb為Mysql數(shù)據(jù)庫的一種引擎,其支持事務(wù)及行級鎖,其中,行級鎖是指僅對指定的記錄進行加鎖,其它進程還是可以對同一表的記錄進行操作。Innodb存儲它的表和索引在一個表空間中,表空間可 以包含數(shù)個文件或原始磁盤分區(qū)。此外,針對Innodb進行修復(fù)的前期工作流程為:首先檢查是否需要修復(fù),包括檢查主備庫的地址(ip)、端口(port)的關(guān)系來確定主備切換機制沒有改變,檢查主備的數(shù)據(jù)庫文件(db)、數(shù)據(jù)列表(table)的存在性,以確定某個數(shù)據(jù)庫中的某個文檔及其相應(yīng)的表都是完整的,以及檢查主備庫的數(shù)據(jù)引擎的變化等確定是否需要修復(fù);若需要數(shù)據(jù)修復(fù)則在主備的同步狀態(tài)下將主庫中的數(shù)據(jù)塊和備庫中相應(yīng)的數(shù)據(jù)塊進行比對,檢查是否一致,若不一致則關(guān)閉主備切換的HA功能,停止容災(zāi),防止修復(fù)過程中主備關(guān)系發(fā)生變化,如一個主庫對應(yīng)多個備庫,在修復(fù)過程中,主庫與備庫A關(guān)系發(fā)生變化,備庫A已被備庫B替換,主庫執(zhí)行的結(jié)構(gòu)化查詢語言(sql)會執(zhí)行到備庫B中,造成備庫B中數(shù)據(jù)錯誤。完成備庫的修復(fù)表操作后實時比較主庫的執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致,進行后續(xù)的修復(fù)流程。如前例,以Innodb引擎為例的數(shù)據(jù)庫備庫數(shù)據(jù)的修復(fù)流程為本申請的又一優(yōu)選實施例,首先,檢查主備庫的地址、端口的關(guān)系,數(shù)據(jù)文件、數(shù)據(jù)列表的存在性,以及數(shù)據(jù)引擎的變化等;當檢查沒問題時在主備庫的復(fù)制達到同一位點的狀態(tài)下從主庫獲取不一致的數(shù)據(jù)塊進行直接比對,若比對結(jié)果為不一致則關(guān)閉主備切換功能,在主備庫的復(fù)制達到同一位點的狀態(tài)下檢查主備間數(shù)據(jù)是否一致,若不一致,則執(zhí)行以下修復(fù)流程:在步驟S11中,獲取主庫的執(zhí)行日志位點信息和備庫的執(zhí)行日志位點信息,將兩個位點信息進行比較,若相同,則對主庫進行加鎖處理,引擎為支持事務(wù)時即為鎖數(shù)據(jù)塊,直接對指定的數(shù)據(jù)塊進行鎖定。在步驟S12中,當備庫的執(zhí)行日志的位點達到主庫完成加鎖處理時的執(zhí)行日志的位點時,備庫停止從主庫復(fù)制操作,此時可在需要修復(fù)數(shù)據(jù)對應(yīng)的位點上對獲取到主備庫上不一致的數(shù)據(jù)塊進行修復(fù)。在步驟S13中,請求所述主庫備份待修復(fù)數(shù)據(jù),主庫獲取到請求后會將數(shù)據(jù)塊進行邏輯備份,備份完成后,主庫進行解鎖處理,即解鎖數(shù)據(jù)塊。在步驟S14中,獲取所述待修復(fù)數(shù)據(jù),方式為主庫將備份的數(shù)據(jù)上傳到中轉(zhuǎn)站,備庫從中轉(zhuǎn)站中進行下載備份數(shù)據(jù),接著,用下載的邏輯備份對備庫數(shù)據(jù)進行修復(fù),修復(fù)動作是在同一事務(wù)內(nèi)刪除原來的數(shù)據(jù)和向備庫導(dǎo)入主庫備份的數(shù)據(jù),在修復(fù)完成后,開啟備庫使其從主庫中的復(fù)制能夠正常進行。最后, 打開主備切換功能,恢復(fù)數(shù)據(jù)庫的正常狀態(tài)。本領(lǐng)域技術(shù)人員應(yīng)能理解,上述Innodb的數(shù)據(jù)庫備庫數(shù)據(jù)的修復(fù)流程為本申請的又一優(yōu)選實施例,對本申請所述用于針對數(shù)據(jù)庫的數(shù)據(jù)引擎類型為支持事務(wù)時的修復(fù)數(shù)據(jù)庫備庫數(shù)據(jù)的方法進行詳細描述,當然,現(xiàn)有或今后可能出現(xiàn)的適合本申請修復(fù)流程的數(shù)據(jù)庫,均可以引用的方式包含于本申請。需要說明的是,所述數(shù)據(jù)庫的數(shù)據(jù)引擎類型為不支持事務(wù)類型時的修復(fù)方式為所述優(yōu)選實施例中的文件覆蓋,但本領(lǐng)域技術(shù)人員應(yīng)能理解,不支持事務(wù)類型的修復(fù)方式也可按照支持事務(wù)的修復(fù)流程進行修復(fù),如主庫備份時為邏輯備份,備庫數(shù)據(jù)修復(fù)時刪除數(shù)據(jù)塊和導(dǎo)入備份數(shù)據(jù),但相比較而言,進行文件覆蓋的方式安全性更高。優(yōu)選地,所述方法還包括:在所述實時比較主庫的執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致之前,關(guān)閉所述主庫與所述備庫之間的主備切換功能;在所述獲取所述待修復(fù)數(shù)據(jù),并基于所述待修復(fù)數(shù)據(jù)對所述備庫進行修復(fù),在修復(fù)完成后,打開所述主庫與所述備庫之間的主備切換功能。在此,在實時比較主庫的執(zhí)行日志位點信息和所述備庫的執(zhí)行日志位點信息是否一致之前,需要關(guān)閉主備切換功能(HA),用戶將數(shù)據(jù)寫入主庫,當主庫發(fā)生某個錯誤時HA切換到其對應(yīng)的備庫,因此關(guān)閉HA功能避免了在修復(fù)過程中發(fā)生用戶將數(shù)據(jù)寫到備庫的情況。在修復(fù)完成后,需要打開主備HA功能,使主備能夠進行正常的切換。優(yōu)選地,所述方法還包括:記錄對所述主庫進行可讀不可寫加鎖處理的已加鎖時間,當所述已加鎖時間超過設(shè)定超時時間時,停止當前修復(fù)操作。在一具體實施例中,主庫進行可讀不可寫加鎖處理操作時需要有超時控制,控制方式可以通過另開線程等待該超時時間,時間到將放棄加鎖動作,并放棄本次修復(fù)。本領(lǐng)域技術(shù)人員應(yīng)能理解,所述控制超時方法僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的控制超時的方法如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護范圍以內(nèi),并在此以引用方式包含于此。進一步地,與現(xiàn)有技術(shù)相比,通過上述本申請的實施例可知,在修復(fù) 流程過程中沒有通過執(zhí)行總和檢驗碼逐行比較主備數(shù)據(jù)塊中的每一行,而是通過數(shù)據(jù)文件的覆蓋或?qū)霐?shù)據(jù)塊實現(xiàn)數(shù)據(jù)庫備庫數(shù)據(jù)的修復(fù),從而避免了被修復(fù)表沒有唯一主鍵時所造成的修復(fù)對象錯誤的情況克服不需要對數(shù)據(jù)塊進行逐行分析就可以完成準確修復(fù)數(shù)據(jù)的問題。需要注意的是,本申請可在軟件和/或軟件與硬件的組合體中被實施,例如,可采用專用集成電路(ASIC)、通用目的計算機或任何其他類似硬件設(shè)備來實現(xiàn)。在一個實施例中,本申請的軟件程序可以通過處理器執(zhí)行以實現(xiàn)上文所述步驟或功能。同樣地,本申請的軟件程序(包括相關(guān)的數(shù)據(jù)結(jié)構(gòu))可以被存儲到計算機可讀記錄介質(zhì)中,例如,RAM存儲器,磁或光驅(qū)動器或軟磁盤及類似設(shè)備。另外,本申請的一些步驟或功能可采用硬件來實現(xiàn),例如,作為與處理器配合從而執(zhí)行各個步驟或功能的電路。另外,本申請的一部分可被應(yīng)用為計算機程序產(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)本申請。因此,無論從哪一點來看,均應(yīng)將實施例看作是示范性的,而且是非限制性的,本申請的范圍由所附權(quán)利要求而不是上述說明限定,因此旨在將落在權(quán)利要求的等同要件的含義和范圍內(nèi)的所有變化涵括在本申請內(nèi)。不應(yīng)將權(quán)利要求中的任何附圖標記視為限制所涉及的權(quán)利要求。此外,顯然“包括”一詞不排除其他單元或步驟,單數(shù)不排除復(fù)數(shù)。裝置權(quán)利要求中陳述的多個單元或裝置也可以由一個單元或裝置通過軟件或者硬件來實現(xiàn)。第一,第二等詞語用來表示名稱,而并不表示任何特定 的順序。當前第1頁1 2 3