本申請涉及數(shù)據(jù)庫
技術(shù)領域:
:,具體涉及一種數(shù)據(jù)庫數(shù)據(jù)備份的方法以及一種數(shù)據(jù)庫數(shù)據(jù)備份的裝置;本申請同時涉及一種電子設備。
背景技術(shù):
::mysql是一種關系型數(shù)據(jù)庫管理系統(tǒng)。在mysql數(shù)據(jù)庫中有各種不同類型的日志文件:錯誤日志、二進制日志、查詢?nèi)罩镜龋鶕?jù)這些日志可以查詢mysql數(shù)據(jù)庫執(zhí)行的操作以及狀態(tài)等信息。其中二進制日志(binlog),記錄了對mysql數(shù)據(jù)庫的更改操作,例如:創(chuàng)建數(shù)據(jù)庫或表(create)、插入操作(insert)、更新操作(update)、刪除操作(delete)等,每個更改操作都以一條事件的形式寫入二進制日志文件中,每條事件中都包含了當前事件更新的時間戳、該記錄在當前二進制日志文件中的位置(即:偏移量)以及與數(shù)據(jù)庫更改操作相關的其他信息。mysql數(shù)據(jù)庫通常有一個或者多個二進制日志文件,不同的二進制日志文件通過文件擴展名采用不同的數(shù)字編號形式加以區(qū)分,例如:mysql-bin.00001。一般的為了增強系統(tǒng)的可靠性和穩(wěn)定性,經(jīng)常使用主備模式來部署在系統(tǒng)中使用的數(shù)據(jù)庫,目前mysql通常包括一個主數(shù)據(jù)庫和至少一個備份數(shù)據(jù)庫,主數(shù)據(jù)庫用于提供數(shù)據(jù)管理和數(shù)據(jù)查詢等功能,備份數(shù)據(jù)庫用于備份主數(shù)據(jù)庫中的數(shù)據(jù),用以在主數(shù)據(jù)庫發(fā)生故障時代替主數(shù)據(jù)庫提供相應的功能。在mysql數(shù)據(jù)庫中實現(xiàn)主備模式的方案為:備份數(shù)據(jù)庫從主數(shù)據(jù)庫獲取二進制日志文件,將該二進制日志文件轉(zhuǎn)換為中繼日志文件(relaylog),根據(jù)中繼日志文件在備份數(shù)據(jù)庫中更新數(shù)據(jù)并生成備份數(shù)據(jù)庫的二進制日志文件。由此可見,在現(xiàn)有主備模式同步數(shù)據(jù)的方案下,備份數(shù)據(jù)庫通過應用中繼日志文件更新數(shù)據(jù)來和主數(shù)據(jù)庫進行同步,并且在數(shù)據(jù)更新生成二進制日志文件時,需要進行原生構(gòu)建二進制日志文件的過程,數(shù)據(jù)同步時過程繁瑣,同步效率低。技術(shù)實現(xiàn)要素:本申請?zhí)峁┮环N數(shù)據(jù)庫數(shù)據(jù)備份的方法以及一種數(shù)據(jù)庫數(shù)據(jù)備份的裝置,以解決現(xiàn)有技術(shù)中的上述問題。本申請同時涉及一種電子設備。本申請?zhí)峁┝艘环N數(shù)據(jù)庫數(shù)據(jù)備份的方法,所述數(shù)據(jù)庫數(shù)據(jù)備份的方法,包括:從中繼日志中讀取事件;根據(jù)讀取到的所述事件對備份數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作;基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容;將更新后的所述事件寫入到二進制日志中。可選的,所述根據(jù)讀取到的所述事件對備份數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作,包括:將從所述中繼日志中讀取到的所述事件解析為執(zhí)行語句,并對當前數(shù)據(jù)庫執(zhí)行對應于所述執(zhí)行語句的數(shù)據(jù)庫操作;所述執(zhí)行語句至少包括:修改操作語句、插入操作語句或者刪除操作語句??蛇x的,所述事件至少包括:執(zhí)行所述事件時的時間戳、創(chuàng)建該事件的服務進程標識、該事件的偏移值??蛇x的,所述基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容,包括:基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件中的時間戳、服務進程標識以及該事件的偏移值??蛇x的,所述基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件中的時間戳、服務進程標識以及該事件的偏移值,包括:獲取對該數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作時的當前系統(tǒng)時間;將所述中繼日志中讀取的所述事件的時間戳更新為已獲取的當前系統(tǒng)時間;獲取該數(shù)據(jù)庫的服務進程標識;將所述中繼日志中讀取的所述事件攜帶的創(chuàng)建該事件的服務進程標識更新為該數(shù)據(jù)庫的服務進程標識;獲取存儲在該數(shù)據(jù)庫中的二進制日志中最后一條事件的偏移值和該事件的長度;根據(jù)所述存儲在該數(shù)據(jù)庫中的二進制日志中最后一條事件的偏移值和該事件的長度,為從所述中繼日志中讀取的所述事件計算并更新偏移值??蛇x的,所述事件還包括:校驗和;在所述基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容的步驟中,還包括:更新所述中繼日志中讀取的所述事件的校驗和??蛇x的,所述更新所述中繼日志中讀取的所述事件的校驗和,包括:獲取將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志時生成的校驗和;將所述中繼日志中讀取的所述事件攜帶的校驗和更新為將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志時生成的校驗和??蛇x的,在所述從中繼日志中讀取事件的步驟之前,包括:將當前數(shù)據(jù)庫作為備份數(shù)據(jù)庫,與主數(shù)據(jù)庫之間建立數(shù)據(jù)連接??蛇x的,所述主數(shù)據(jù)庫和備份數(shù)據(jù)庫為mysql數(shù)據(jù)庫??蛇x的,在所述與主數(shù)據(jù)庫之間建立數(shù)據(jù)連接的步驟之后,包括:接收主數(shù)據(jù)庫發(fā)送的所述主數(shù)據(jù)庫中的二進制日志;將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志內(nèi)。相應的,本申請還提供了一種數(shù)據(jù)庫數(shù)據(jù)備份的裝置,所述數(shù)據(jù)庫數(shù)據(jù)備份的裝置,包括:事件讀取單元,用于從中繼日志中讀取事件;數(shù)據(jù)庫操作執(zhí)行單元,用于根據(jù)讀取到的所述事件對備份數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作;事件更新單元,用于基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容;日志寫入單元,用于將更新后的所述事件寫入到二進制日志中??蛇x的,所述數(shù)據(jù)庫操作執(zhí)行單元,具體用于將從所述中繼日志中讀取到的所述事件解析為執(zhí)行語句,并對當前數(shù)據(jù)庫執(zhí)行對應于所述執(zhí)行語句的數(shù)據(jù)庫操作;所述執(zhí)行語句至少包括:修改操作語句、插入操作語句或者刪除操作語句。可選的,所述事件讀取單元,從中繼日志中讀取的事件至少包括:執(zhí)行所述事件時的時間戳、創(chuàng)建該事件的服務進程標識、該事件的偏移值??蛇x的,所述事件更新單元,具體用于基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件中的時間戳、服務進程標識以及該事件的偏移值??蛇x的,所述事件更新單元,包括:系統(tǒng)時間獲取子單元,用于獲取對該數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作時的當前系統(tǒng)時間;時間更新子單元,用于將所述中繼日志中讀取的所述事件的時間戳更新為已獲取的當前系統(tǒng)時間;服務進程標識獲取子單元,用于獲取該數(shù)據(jù)庫的服務進程標識;服務進程標識更新子單元,用于將所述中繼日志中讀取的所述事件攜帶的創(chuàng)建該事件的服務進程標識更新為該數(shù)據(jù)庫的服務進程標識;偏移值獲取子單元,用于獲取存儲在該數(shù)據(jù)庫中的二進制日志中最后一條事件的偏移值和該事件的長度;偏移值更新子單元,用于根據(jù)所述存儲在該數(shù)據(jù)庫中的二進制日志中最后一條事件的偏移值和該事件的長度,為從所述中繼日志中讀取的所述事件計算并更新偏移值??蛇x的,所述事件讀取單元,從中繼日志中讀取的事件還包括:校驗和;所述事件更新單元,還用于基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的校驗和??蛇x的,所述事件更新單元,還包括:校驗和獲取子單元,用于獲取將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志時生成的校驗和;校驗和更新子單元,用于將所述中繼日志中讀取的所述事件攜帶的校驗和更新為將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志時生成的校驗和。可選的,所述數(shù)據(jù)庫數(shù)據(jù)備份的裝置,還包括:連接建立單元,用于從中繼日志中讀取事件之前,將當前數(shù)據(jù)庫作為備份數(shù)據(jù)庫,與主數(shù)據(jù)庫之間建立數(shù)據(jù)連接??蛇x的,所述連接建立單元,將當前數(shù)據(jù)庫作為備份數(shù)據(jù)庫,與主數(shù)據(jù)庫之間建立數(shù)據(jù)連接的主數(shù)據(jù)庫和備份數(shù)據(jù)庫為mysql數(shù)據(jù)庫。可選的,所述數(shù)據(jù)庫數(shù)據(jù)備份的裝置,還包括:二進制日志接收單元,用于在所述與主數(shù)據(jù)庫之間建立數(shù)據(jù)連接之后,接收主數(shù)據(jù)庫發(fā)送的所述主數(shù)據(jù)庫中的二進制日志;中繼日志寫入單元,用于將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志內(nèi)。此外,本申請還提供了一種電子設備,包括:顯示器;處理器;存儲器,用于存儲數(shù)據(jù)庫數(shù)據(jù)備份程序,所述程序在被所述處理器讀取執(zhí)行時,執(zhí)行如下操作:從中繼日志中讀取事件;根據(jù)讀取到的所述事件對備份數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作;基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容;將更新后的所述事件寫入到二進制日志中。與現(xiàn)有技術(shù)相比,本申請具有以下優(yōu)點:本申請?zhí)峁┑囊环N數(shù)據(jù)庫數(shù)據(jù)備份的方法、一種數(shù)據(jù)庫數(shù)據(jù)備份的裝置以及電子設備,通過從中繼日志中讀取事件;根據(jù)讀取到的所述事件對備份數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作;基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容;將更新后的所述事件寫入到二進制日志中。所述技術(shù)方案利用中繼日志文件與二進制日志文件內(nèi)容以及格式相似的特點,在數(shù)據(jù)更新通過的過程中將中繼日志文件轉(zhuǎn)換為二進制日志文件,省去了進行主備模式同步數(shù)據(jù)時,備份數(shù)據(jù)庫通過中繼日志文件更新數(shù)據(jù)并且在數(shù)據(jù)更新生成二進制日志文件時需要進行原生構(gòu)建二進制日志文件的過程,解決了數(shù)據(jù)同步時過程繁瑣,同步效率低的問題。附圖說明為了更清楚地說明本申請實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請中記載的一些實施例,對于本領域普通技術(shù)人員 來講,還可以根據(jù)這些附圖獲得其他的附圖。圖1示出了根據(jù)本申請的實施例提供的數(shù)據(jù)庫數(shù)據(jù)備份的方法的流程圖;圖2示出了根據(jù)本申請的實施例提供的二進制日志寫入中繼日志的流程圖;圖3示出了根據(jù)本申請的實施例提供的基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件中的時間戳、服務進程標識以及該事件的偏移值的流程圖;圖4示出了根據(jù)本申請的實施例提供的更新所述中繼日志中讀取的所述事件的事件體中的校驗和的流程圖;圖5示出了根據(jù)本申請的實施例提供的數(shù)據(jù)庫數(shù)據(jù)備份的裝置的示意圖;圖6示出了根據(jù)本申請的實施例提供的電子設備的示意圖。具體實施方式為了能夠更清楚地理解本申請的上述目的、特征和優(yōu)點,下面結(jié)合附圖和具體實施方式對本申請進行進一步的詳細描述。需要說明的是,在不沖突的情況下,本申請的實施例及實施例中的特征可以相互組合。在下面的描述中闡述了很多具體細節(jié)以便于充分理解本申請。但是,本申請能夠以很多不同于在此描述的其它方式來實施,本領域技術(shù)人員可以在不違背本申請內(nèi)涵的情況下做類似推廣,因此,本申請不受下面公開的具體實施的限制。本申請的實施例提供了一種數(shù)據(jù)庫數(shù)據(jù)備份的方法以及一種數(shù)據(jù)庫數(shù)據(jù)備份的裝置;本申請的實施例同時提供了一種電子設備。在下面的實施例中逐一進行詳細說明。目前mysql通常包括一個主數(shù)據(jù)庫和至少一個備份數(shù)據(jù)庫,主數(shù)據(jù)庫用于提供數(shù)據(jù)管理和數(shù)據(jù)查詢等功能,備份數(shù)據(jù)庫用于備份主數(shù)據(jù)庫中的數(shù)據(jù),用以在主數(shù)據(jù)庫發(fā)生故障時代替主數(shù)據(jù)庫提供相應的功能。在mysql數(shù)據(jù)庫中實現(xiàn)主備模式的方案為:備份數(shù)據(jù)庫從主數(shù)據(jù)庫獲取二進制日志文件,將該二進制日志文件轉(zhuǎn)換為中繼日志文件(relaylog),根據(jù)中繼日志文件在備份數(shù)據(jù)庫中更新數(shù)據(jù)并生成備份數(shù)據(jù)庫的二進制日志文件。由此可見,在現(xiàn)有主備模式同 步數(shù)據(jù)的方案下,備份數(shù)據(jù)庫通過應用中繼日志文件更新數(shù)據(jù)來和主數(shù)據(jù)庫進行同步,并且在數(shù)據(jù)更新生成二進制日志文件時,需要進行原生構(gòu)建二進制日志文件的過程,數(shù)據(jù)同步時過程繁瑣,同步效率低。針對這一問題,本申請的技術(shù)方案利用中繼日志文件與二進制日志文件內(nèi)容以及格式相似的特點,在數(shù)據(jù)更新通過的過程中將中繼日志文件轉(zhuǎn)換為二進制日志文件,省去了進行主備模式同步數(shù)據(jù)時,備份數(shù)據(jù)庫通過中繼日志文件更新數(shù)據(jù)并且在數(shù)據(jù)更新生成二進制日志文件時需要進行原生構(gòu)建二進制日志文件的過程,從而實現(xiàn)了快速數(shù)據(jù)同步的功能。在詳細描述本實施例的具體步驟之前,先對本技術(shù)方案涉及的二進制日志文件以及中繼日志文件作簡要說明。binlog又叫二進制日志文件,它會將mysql中所有修改數(shù)據(jù)庫數(shù)據(jù)的query以二進制的形式記錄到日志文件中(對數(shù)據(jù)庫每做的一次操作,都會在binlog中有所記錄),例如:create,insert,drop,update等,對于select操作則不會被記錄到binlog里,因為它并沒有修改數(shù)據(jù)庫的數(shù)據(jù)。mysql數(shù)據(jù)庫在初始運行時會在數(shù)據(jù)根目錄創(chuàng)建兩個名稱類似xxx-bin.000001和xxx-bin.index的新文件,若配置文件的相關選項沒有給出文件名,mysql將使用主機名稱命名這兩個文件,例如mysql-bin.000001和mysql-bin.index。mysql會把所有對數(shù)據(jù)庫內(nèi)容和結(jié)構(gòu)的修改情況記入mysql-bin.000001文件,而mysql-bin.index文件則包含了一份當前使用的所有二進制日志文件的清單。mysql數(shù)據(jù)庫會在重啟時、或者日志文件大小超過系統(tǒng)變量指定的上限時,生成一個新的日志文件,其文件擴展名序號依次遞增。由此可見,mysql數(shù)據(jù)庫的二進制日志文件可能是一個,也可能是一組,而本申請所述的二進制日志文件則包含了mysql數(shù)據(jù)庫當前使用的所有二進制日志文件。在二進制日志文件中會記錄數(shù)據(jù)庫發(fā)生的更新事件。所謂的事件,其實就是對數(shù)據(jù)庫的一次操作記錄,其中包括mysql服務器執(zhí)行的語句、語句的執(zhí)行時間點、發(fā)起執(zhí)行的客戶線程id、語句執(zhí)行花費的時間開銷等信息。binlog的格式有三種:基于sql語句的復制statement(statement-basedreplication,sbr),每一條修改數(shù)據(jù)的sql語句都會被保存到binlog里;基于行的復制row(row-basedreplication,rbr),會記錄每一行記錄的變化,就是將每一行的修改都記錄到binlog里面,但sql語句并沒有在binlog里,但是缺點是binlog量比較大,例如:當執(zhí)行update語句后面不加where條件的時 候或altertable的時候,會產(chǎn)生大量日志;混合模式復制mixed(mixed-basedreplication,mbr),在默認情況下是statement,但是在某些情況下會切換到row狀態(tài),如當一個dml更新一個引擎表,或者是與時間用戶相關的函數(shù)等。中繼日志文件(relaylog)缺省使用host_name-relay-bin.nnnnnn格式的文件名,n為序列號,從000001開始,備份數(shù)據(jù)庫使用索引文件來跟蹤當前哪個文件正在使用,索引文件名稱為host_name-relay-bin.index。中繼日志文件的格式與二進制日志的格式相同。從服務器獲取主數(shù)據(jù)庫的二進制日志之后就可解析并對備份數(shù)據(jù)庫的數(shù)據(jù)做同樣的更新。備份數(shù)據(jù)庫有兩個線程,io線程、sql線程。i/o線程下載主數(shù)據(jù)庫的二進制日志,每次io線程啟動時在本地創(chuàng)建一個中繼日志,sql線程獲取中繼日志的數(shù)據(jù)進行從庫更新。sql線程在讀取完全部的更新語句后自動刪除relay日志文件。本申請的實施例提供了一種數(shù)據(jù)庫數(shù)據(jù)備份的方法,一般性的,本實施例所述的數(shù)據(jù)庫數(shù)據(jù)備份的方法由備份數(shù)據(jù)庫完成,該方法通過更新所述中繼日志中讀取的所述事件的內(nèi)容,并將更新后的所述事件寫入到二進制日志中完成數(shù)據(jù)庫數(shù)據(jù)的備份。所述數(shù)據(jù)庫數(shù)據(jù)備份的方法實施例如下:請參考圖1,其示出了根據(jù)本申請的實施例提供的數(shù)據(jù)庫數(shù)據(jù)備份的方法的流程圖。所述數(shù)據(jù)庫數(shù)據(jù)備份的方法包括:步驟s101,從中繼日志中讀取事件。在本實施例中,從所述中繼日志中讀取到的事件由事件頭和數(shù)據(jù)部分組成,且事件頭至少包括:執(zhí)行所述事件時的時間戳、創(chuàng)建該事件的服務進程標識、該事件的偏移值。需要說明的是,中繼日志文件的格式和內(nèi)容與二進制日志基本相同,每個二進制日志文件頭部都是4個字節(jié)的標記,值為0xfe0x620x690x6e,文件頭之后就是一系列的日志事件(event),事件是二進制日志文件中的基本單位,事件的類型有很多種,其中用于記錄數(shù)據(jù)庫更改操作的事件為查詢事件。下面對日志事件的結(jié)構(gòu)做進一步的詳細說明。每個事件都有一個長度為19字節(jié)的事件頭,其中包含執(zhí)行所述事件時的時間戳、事件類型、創(chuàng)建該事件的服務進程標識、事件長度以及該事件的偏移值。為了便于理解,下面舉一個例子說明事件的事件頭,事件的事件頭如下表 所示:具體詳見表一:(單位:字節(jié))timestamptype_codeserver_idevent_lengthnext_position通過表一可見,事件的事件頭包括:timestamp(時間戳)、type_code(事件類型)、server_id(服務進程標識)、event_length(時間長度)、next_position(偏移值)五個字段。下面對每個字段做詳細說明。timestamp字段是執(zhí)行該事件時的主機時間,即本申請所述的時間戳,也就是當前事件的更新時間,timestamp字段為事件頭中第0-3字節(jié)。type_code字段是事件類型,包括format_description_event、query、load_event等,其中每個二進制日志文件的第一條事件的類型都是format_description_event,它記錄了該二進制日志文件的相關信息,如版本,這些信息對于后序分析二進制日志文件的事件是有用的,所以對于要讀取二進制日志文件的內(nèi)容的工具都必須先讀取第一條記錄。query包括我們經(jīng)常操作的如:create,drop,update,insert等,type_code字段為事件頭中的第4字節(jié)。server_id字段是服務進程標識,即創(chuàng)建該事件的數(shù)據(jù)庫的服務進程id,server_id字段為事件頭中的第5-8字節(jié)。event_length字段是事件長度,該字段記錄了這條事件的長度(包括該記錄的事件頭和數(shù)據(jù)部分的長度),event_length字段為事件頭中的第9-12字節(jié)。next_position字段是該事件的偏移值,該偏移值是表示該事件在二進制日志文件中的位置,即:該條事件后的下一條事件的開始位置,也是此條事件結(jié)束位置的上一個字節(jié)的位置,next_position字段為事件頭中的第13-16字節(jié)。在事件頭之后就是根據(jù)事件類型確定的事件體(body),在事件體中包含事件的具體數(shù)據(jù)和檢驗和。由于在本實施例中所述的數(shù)據(jù)庫數(shù)據(jù)備份的方法是由備份數(shù)據(jù)庫完成的,所以在步驟s101從中繼日志中讀取事件之前,該備份數(shù)據(jù)庫還需與主數(shù)據(jù)庫之間進行連接,具體包括如下步驟:將當前數(shù)據(jù)庫作為備份數(shù)據(jù)庫,與主數(shù)據(jù)庫之間建立數(shù)據(jù)連接。需要說明的是,在本步驟所述的與主數(shù)據(jù)庫之間建立數(shù)據(jù)連接,采用了相對寬泛的表述方式,在具體實施中,本步驟的備份數(shù)據(jù)庫與主數(shù)據(jù)庫建立連接時, 還需要進行鑒權(quán),例如:獲取主數(shù)據(jù)庫所在服務器的ip地址和主數(shù)據(jù)庫提供數(shù)據(jù)庫服務的服務進程標識,然后創(chuàng)建一個socket(套接字)與主數(shù)據(jù)庫建立數(shù)據(jù)連接,并按照主備數(shù)據(jù)庫之間的交互協(xié)議執(zhí)行握手和驗證等交互過程等驗證身份后,所述數(shù)據(jù)連接才算建立成功。在本實施例中,涉及的主數(shù)據(jù)庫和備份數(shù)據(jù)庫均為mysql數(shù)據(jù)庫。在備份數(shù)據(jù)庫與主數(shù)據(jù)庫之間建立數(shù)據(jù)連接之后,所述備份數(shù)據(jù)庫需要從主數(shù)據(jù)庫中獲取二進制日志文件,并將所述二進制日志文件轉(zhuǎn)換為中繼日志文件,具體包括步驟s100-1至s100-2,下面結(jié)合圖2作進一步說明。請參考圖2,其示出了根據(jù)本申請的實施例提供的二進制日志寫入中繼日志的流程圖。步驟s100-1,接收主數(shù)據(jù)庫發(fā)送的所述主數(shù)據(jù)庫中的二進制日志。在本實施例中,所述接收主數(shù)據(jù)庫發(fā)送的所述主數(shù)據(jù)庫中的二進制日志,可以采用如下方式實現(xiàn):在與主數(shù)據(jù)庫建立連接后,mysql主備數(shù)據(jù)庫共使用3個線程來執(zhí)行數(shù)據(jù)同步的功能,當備份數(shù)據(jù)庫發(fā)出startslave時,在本地創(chuàng)建一個i/o線程,使主數(shù)據(jù)庫發(fā)送二進制日志文件,備份數(shù)據(jù)庫接收主數(shù)據(jù)庫發(fā)送的所述主數(shù)據(jù)庫中的二進制日志。需要說明的是,備份數(shù)據(jù)庫的i/o線程每次啟動時,會在備份數(shù)據(jù)庫中創(chuàng)建一個中繼日志文件。在具體實施時,備份數(shù)據(jù)庫可以通過cli_advanced_command發(fā)送com_binlog_dump命令到主數(shù)據(jù)庫來獲取二進制日志,該條協(xié)議里面需要指定二進制日志名以及偏移地址,在接收到命令后主數(shù)據(jù)庫為每個備份數(shù)據(jù)庫創(chuàng)建一個binlogdump線程用于發(fā)送二進制日志內(nèi)容。需要說明的是,在向主數(shù)據(jù)庫發(fā)送命令時,還需要發(fā)送備份數(shù)據(jù)庫的服務進程標識,該服務進程標識不能與主數(shù)據(jù)庫中建立連接的現(xiàn)有備份數(shù)據(jù)庫服務進程標識重復,不然命令會被拒絕,且服務進程標識不能為0。步驟s100-2,將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志內(nèi)。在本實施例中,所述將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志內(nèi),可以采用如下方式實現(xiàn):備份數(shù)據(jù)庫的i/o線程讀取主數(shù)據(jù)庫的binlogdump線程發(fā)送的二進制日志文件,并將所述二進制日志文件中的數(shù)據(jù)拷貝到備 份數(shù)據(jù)庫在啟動i/o線程時創(chuàng)建的中繼日志文件中。需要說明的是,備份數(shù)據(jù)庫在本地的data目錄中會創(chuàng)建2個文件,這些狀態(tài)文件的默認名稱為主數(shù)據(jù)庫master.info和relay-log.info,由于這些狀態(tài)文件保存在硬盤中,所以備份數(shù)據(jù)庫關閉時不會丟失,且在下次備份數(shù)據(jù)庫啟動時,通過讀取這些狀態(tài)文件可以確定備份數(shù)據(jù)庫已經(jīng)從主數(shù)據(jù)庫中的二進制日志文件中讀取了多少數(shù)據(jù),以及備份數(shù)據(jù)庫中處理了的中繼日志的程度。在本實施例中,步驟s101從中繼日志中讀取事件,可以采用如下方式實現(xiàn):在備份數(shù)據(jù)庫中創(chuàng)建sql線程,讀取存儲在備份數(shù)據(jù)庫在啟動i/o線程時創(chuàng)建的中繼日志文件中的事件信息。需要說明的是,在備份數(shù)據(jù)庫中創(chuàng)建的sql線程,能夠讀取備份數(shù)據(jù)庫中的中繼日志文件,并且能夠根據(jù)中繼日志文件中的事件信息對具體事件根據(jù)更新語句執(zhí)行更新,sql線程讀取和執(zhí)行更新語句被分為兩個獨立的任務,在此步驟中,只執(zhí)行其中的讀取中繼日志文件中的事件信息的任務。步驟s103,根據(jù)讀取到的所述事件對備份數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作。在本實施例中,所述根據(jù)讀取到的所述事件對備份數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作,可以采用如下方式實現(xiàn):將從所述中繼日志中讀取到的所述事件解析為執(zhí)行語句,并對當前數(shù)據(jù)庫執(zhí)行對應于所述執(zhí)行語句的數(shù)據(jù)庫操作;所述執(zhí)行語句至少包括:修改操作語句、插入操作語句或者刪除操作語句。在具體實施時,是通過在備份數(shù)據(jù)庫中創(chuàng)建sql線程,將從所述中繼日志中讀取到的所述事件解析為執(zhí)行語句,并對當前數(shù)據(jù)庫執(zhí)行對應于所述執(zhí)行語句的數(shù)據(jù)庫操作。sql線程讀取和執(zhí)行更新語句被分為兩個獨立的任務,在此步驟中,只執(zhí)行其中的執(zhí)行更新語句的任務。由于用戶是以向數(shù)據(jù)庫發(fā)送結(jié)構(gòu)化查詢語言(structuredquerylanguage,sql)語句的方式,對該數(shù)據(jù)庫中存儲的數(shù)據(jù)進行修改操作的,因此,數(shù)據(jù)庫中存儲在本地的二進制日志文件中的每條事件所記錄的每條操作記錄都可包含有一條對應的sql語句,例如:這些sql語句可以是update、insert、delete等語句,所以在本實施例中,所述將從所述中繼日志中讀取到的所述事件解析為執(zhí)行語句中,解析成的執(zhí)行語句中包括更新操作(update)語句、插入操作(insert)語句、刪除操作(delete)語句,update語句是對數(shù)據(jù)的更新操作,insert語句是對數(shù)據(jù)的插入操作,delete語句是對數(shù)據(jù)的刪除操作。而選擇操 作(select)語句是對數(shù)據(jù)的選擇操作,實質(zhì)上就是將相應的數(shù)據(jù)讀取到緩存中的操作,所以在二進制日志中并不會記錄select語句和沒有對數(shù)據(jù)進行實際更新的update語句。在sql線程將從所述中繼日志中讀取到的所述事件解析為執(zhí)行語句后,根據(jù)每條事件中解析出的執(zhí)行語句,在備份數(shù)據(jù)庫中執(zhí)行對應執(zhí)行語句的數(shù)據(jù)庫操作。例如:在事件中解析出的執(zhí)行語句為:updatepersonsetcash=cash-1000wherelastname='wilson',則從名稱為persons的數(shù)據(jù)庫表中,提取lastname字段為wilson的記錄,并對該條記錄執(zhí)行將cash字段的數(shù)值減少1000的操作。需要說明的是,在步驟s103根據(jù)讀取到的所述事件對備份數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作中,在sql線程將從所述中繼日志中讀取到的所述事件解析為執(zhí)行語句并在數(shù)據(jù)庫中執(zhí)行完對應執(zhí)行語句的數(shù)據(jù)庫操作后,在備份數(shù)據(jù)庫中跳過根據(jù)本次數(shù)據(jù)庫操作生成相應的事件并寫入存儲在備份數(shù)據(jù)庫中的二進制日志文件中的操作。步驟s105,基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容。在本實施例中,所述基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容,包括:更新所述中繼日志中讀取的所述事件中的時間戳、服務進程標識、該事件的偏移值。需要說明的是,在二進制日志文件或者中繼日志文件中記錄的事件是對數(shù)據(jù)庫的一次操作記錄,所以在本步驟中更新的事件時間戳、服務進程標識、該事件的偏移值是在備份數(shù)據(jù)庫中執(zhí)行完對應于從事件中解析出的執(zhí)行語句的數(shù)據(jù)庫操作時的時間戳、該備份數(shù)據(jù)庫的服務進程標識以及該條事件的偏移值。在本實施例中,所述基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件中的時間戳、服務進程標識以及該事件的偏移值,具體包括步驟s105-1至s105-6,下面結(jié)合圖3作進一步說明。請參考圖3,其示出了根據(jù)本申請的實施例提供的基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件中的時間戳、服務進程標識以及該事件的偏移值的流程圖。步驟s105-1,獲取對該數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作時的當前系統(tǒng)時間。在本實施例中,所述獲取對該數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作時的當前系統(tǒng)時 間是指:在備份數(shù)據(jù)庫中執(zhí)行完對應于從事件中解析出的執(zhí)行語句的數(shù)據(jù)庫操作時,獲取備份數(shù)據(jù)庫的當前系統(tǒng)時間。在具體實施時,獲取備份數(shù)據(jù)庫的當前系統(tǒng)時間,可以利用系統(tǒng)提供的接口實現(xiàn)上述獲取被監(jiān)控方的時間信息的功能,例如,可以使用系統(tǒng)提供的calendar類實現(xiàn)上述獲取被監(jiān)控方的時間信息的功能。步驟s105-2,將所述中繼日志中讀取的所述事件的時間戳更新為已獲取的當前系統(tǒng)時間。在本實施例中,所述將所述中繼日志中讀取的所述事件的時間戳更新為已獲取的當前系統(tǒng)時間,可以采用如下方式實現(xiàn):將所述中繼日志中讀取的所述事件的數(shù)據(jù)提取到緩存中,將所述事件的事件頭中的第0-3字節(jié)的取值修改為在步驟s105-1中,獲取到的備份數(shù)據(jù)庫的當前系統(tǒng)時間。步驟s105-3,獲取該數(shù)據(jù)庫的服務進程標識。在本實施例中,所述獲取該數(shù)據(jù)庫的服務進程標識,可以采用如下方式實現(xiàn):在備份數(shù)據(jù)庫中的my.cnf文件中獲取該數(shù)據(jù)庫的服務進程標識。例如:在該數(shù)據(jù)庫的my.cnf文件中server_id=11,則獲取到的服務進程標識為11.步驟s105-4,將所述中繼日志中讀取的所述事件攜帶的創(chuàng)建該事件的服務進程標識更新為該數(shù)據(jù)庫的服務進程標識。在本實施例中,所述將所述中繼日志中讀取的所述事件攜帶的創(chuàng)建該事件的服務進程標識更新為該數(shù)據(jù)庫的服務進程標識,可以采用如下方式實現(xiàn):將存儲在緩存中的所述事件的事件頭中的第5-8字節(jié)的取值修改為在步驟s105-3中,獲取到的備份數(shù)據(jù)庫的服務進程標識。例如:主數(shù)據(jù)庫的服務進程標識1,則將所述中繼日志中讀取的所述事件攜帶的創(chuàng)建該事件的服務進程標識1更新為該數(shù)據(jù)庫的服務進程標識11。步驟s105-5,獲取存儲在該數(shù)據(jù)庫中的二進制日志中最后一條事件的偏移值和該事件的長度。在本實施例中,所述獲取存儲在該數(shù)據(jù)庫中的二進制日志中最后一條事件的偏移值和該事件的長度,可以采用如下方式實現(xiàn):讀取備份數(shù)據(jù)庫中的二進制日志文件,獲取在備份數(shù)據(jù)庫中的二進制日志文件中最后一條事件的偏移值和該事件的長度。例如:最后一條事件的偏移值為4且長度為10。在具體實施時,可以讀取在備份數(shù)據(jù)庫中的二進制日志文件中最后一條事件 的事件頭中第9-12字節(jié)和第13-16字節(jié)的取值獲取該事件的的偏移值和該事件的長度。需要說明的是,事件的偏移值表示該事件在二進制日志文件中的位置,例如:第一個事件的偏移值就是4,因為文件頭有一個字節(jié)的長度??梢岳斫獾?,對于存儲在二進制日志文件中的事件n和事件n+1來說,具有如下關系:next_position(n+1)=next_position(n)+event_length(n)。步驟s105-6,根據(jù)所述存儲在該數(shù)據(jù)庫中的二進制日志中最后一條事件的偏移值和該事件的長度,為從所述中繼日志中讀取的所述事件計算并更新偏移值。在本實施例中,所述根據(jù)所述存儲在該數(shù)據(jù)庫中的二進制日志中最后一條事件的偏移值和該事件的長度,為從所述中繼日志中讀取的所述事件計算并更新偏移值,可以采用如下方式實現(xiàn):根據(jù)在步驟s105-5中獲取到的備份數(shù)據(jù)庫的二進制日志文件中最后一條事件的偏移值和該事件的長度,將獲取的偏移值和長度相加,計算出所述中繼日志中讀取的所述事件的新偏移值,并將存儲在緩存中的所述事件的事件頭中的第13-16字節(jié)的取值修改為計算出的新偏移值。mysql主備模式在同步速度快,簡單易用,但是在檢測到主備數(shù)據(jù)不一致時,卻很難判斷出問題所在。例如:軟硬件或者網(wǎng)絡傳輸出錯,導致主數(shù)據(jù)庫上運行的sql語句與備份數(shù)據(jù)庫上運行的sql語句不一致(稱為eventcorrupt)。為了解決這個問題,確保在主備模式下數(shù)據(jù)同步時的正確性,在5.6milestonedevelopmentrelease版本中加入了replicationeventchecksum(主備模式事件校驗)功能。需要說明的是,checksum校驗和,是在數(shù)據(jù)處理和數(shù)據(jù)通信領域中,用于校驗目的的一組數(shù)據(jù)項的和,尤其是遠距離通信中保證數(shù)據(jù)的完整性和準確性。這些數(shù)據(jù)項可以是數(shù)字或在計算檢驗總和過程中看作數(shù)字的其它字符串。它通常是以十六進制為數(shù)制表示的形式,例如:十六進制串:0102030405060708的校驗和是:24(十六進制)。如果校驗和的數(shù)值超過十六進制的ff,也就是255,就要求其補碼作為校驗和。當一個事件被寫入二進制日志的時候,校驗和也同時寫入二進制日志,然后在事件通過網(wǎng)絡傳輸?shù)絺浞輸?shù)據(jù)庫之后,再在備份數(shù)據(jù)庫中對其進行驗證并寫入備份數(shù)據(jù)庫的中繼日志文件中。由于每一步都記錄了事件和校驗和,所以我們可以很快地找出問題所在。校驗和使用zlib中的crc-32 算法,更具體地講,是iso-3309crc-32算法。所以在本實施例中,在二進制日志文件或中繼日志文件中的事件的事件體中還包括校驗和,相應的,在步驟s103基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容時,還需要更新所述中繼日志中讀取的所述事件的事件體中的校驗和。所述更新所述中繼日志中讀取的所述事件的事件體中的校驗和,具體包括步驟s105-7至s105-8,下面結(jié)合圖4作進一步說明。請參考圖4,其示出了根據(jù)本申請的實施例提供的更新所述中繼日志中讀取的所述事件的事件體中的校驗和的流程圖。步驟s105-7,獲取將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志時生成的校驗和。在本實施例中,所述獲取將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志時生成的校驗和,可以采用如下方式實現(xiàn):在將所述二進制日志中的每條事件寫入到備份數(shù)據(jù)庫中的中繼日志時,使用zlib中的iso-3309crc-32算法,為每條事件生成校驗和。需要說明的是,在mysql主備模式下,在主數(shù)據(jù)庫中,每條事件從session線程中寫入到二進制日志文件時會生成一個該條事件的校驗和,并且在主數(shù)據(jù)庫通過為每個備份數(shù)據(jù)庫創(chuàng)建的binlogdump線程發(fā)送二進制日志內(nèi)容時,會驗證每條事件在session線程中寫入到二進制日志文件時生成的校驗和;在備份數(shù)據(jù)庫的i/o線程讀取主數(shù)據(jù)庫的binlogdump線程發(fā)送的二進制日志文件,并將二進制日志文件中的每條事件拷貝到備份數(shù)據(jù)庫在啟動i/o線程時創(chuàng)建的中繼日志文件時會為每條事件生成另一個校驗和,該校驗和會在備份數(shù)據(jù)庫創(chuàng)建sql線程讀取存儲在備份數(shù)據(jù)庫在啟動i/o線程時創(chuàng)建的中繼日志文件中的事件信息時進行驗證。步驟s105-8,將所述中繼日志中讀取的所述事件攜帶的校驗和更新為將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志時生成的校驗和。在本實施例中,所述將所述中繼日志中讀取的所述事件攜帶的校驗和更新為將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志時生成的校驗和,可以采用如下方式實現(xiàn):將存儲在緩存中的所述事件的事件體中的校驗和的取值修改為在步驟s105-7中,獲取到的將所述二進制日志中的事件寫入到備份數(shù) 據(jù)庫中的中繼日志時生成的校驗和。步驟s107,將更新后的所述事件寫入到二進制日志中。在本實施例中,所述將更新后的所述事件寫入到二進制日志中,可以采用如下方式實現(xiàn):對時間戳、服務進程標識、該事件的偏移值以及校驗和更新后的所述事件執(zhí)行寫操作,將在緩存中的所述事件寫入到二進制日志中。本申請實施例提供的一種數(shù)據(jù)庫數(shù)據(jù)備份的方法,通過從中繼日志中讀取事件;根據(jù)讀取到的所述事件對備份數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作;基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容;將更新后的所述事件寫入到二進制日志中,利用中繼日志文件與二進制日志文件內(nèi)容以及格式相似的特點,在數(shù)據(jù)更新通過的過程中將中繼日志文件轉(zhuǎn)換為二進制日志文件,省去了進行主備模式同步數(shù)據(jù)時,備份數(shù)據(jù)庫通過中繼日志文件更新數(shù)據(jù)并且在數(shù)據(jù)更新生成二進制日志文件時需要進行原生構(gòu)建二進制日志文件的過程,解決了數(shù)據(jù)同步時過程繁瑣,同步效率低的問題。在上述的實施例中,提供了一種數(shù)據(jù)庫數(shù)據(jù)備份的方法,與上述數(shù)據(jù)庫數(shù)據(jù)備份的方法相對應的,本申請還提供了一種數(shù)據(jù)庫數(shù)據(jù)備份的裝置。由于裝置的實施例基本相似于方法的實施例,所以描述得比較簡單,相關之處參見方法實施例的部分說明即可。下述描述的裝置實施例僅僅是示意性的。所述數(shù)據(jù)庫數(shù)據(jù)備份的裝置實施例如下:請參考圖5,其示出了根據(jù)本申請的實施例提供的數(shù)據(jù)庫數(shù)據(jù)備份的裝置的示意圖。所述數(shù)據(jù)庫數(shù)據(jù)備份的裝置,包括:事件讀取單元501、數(shù)據(jù)庫操作執(zhí)行單元503、事件更新單元505以及日志寫入單元507;所述事件讀取單元501,用于從中繼日志中讀取事件;所述數(shù)據(jù)庫操作執(zhí)行單元503,用于根據(jù)讀取到的所述事件對備份數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作;所述事件更新單元505,用于基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容;所述日志寫入單元507,用于將更新后的所述事件寫入到二進制日志中??蛇x的,所述數(shù)據(jù)庫操作執(zhí)行單元503,具體用于將從所述中繼日志中讀取到的所述事件解析為執(zhí)行語句,并對當前數(shù)據(jù)庫執(zhí)行對應于所述執(zhí)行語句的數(shù) 據(jù)庫操作;所述執(zhí)行語句至少包括:修改操作語句、插入操作語句或者刪除操作語句。可選的,所述事件讀取單元501,從中繼日志中讀取的事件至少包括:執(zhí)行所述事件時的時間戳、創(chuàng)建該事件的服務進程標識、該事件的偏移值??蛇x的,所述事件更新單元505,具體用于基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件中的時間戳、服務進程標識以及該事件的偏移值??蛇x的,所述事件更新單元505,包括:系統(tǒng)時間獲取子單元、時間更新子單元、服務進程標識獲取子單元、服務進程標識更新子單元、偏移值獲取子單元以及偏移值更新子單元;所述系統(tǒng)時間獲取子單元,用于獲取對該數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作時的當前系統(tǒng)時間;所述時間更新子單元,用于將所述中繼日志中讀取的所述事件的時間戳更新為已獲取的當前系統(tǒng)時間;所述服務進程標識獲取子單元,用于獲取該數(shù)據(jù)庫的服務進程標識;所述服務進程標識更新子單元,用于將所述中繼日志中讀取的所述事件攜帶的創(chuàng)建該事件的服務進程標識更新為該數(shù)據(jù)庫的服務進程標識;所述偏移值獲取子單元,用于獲取存儲在該數(shù)據(jù)庫中的二進制日志中最后一條事件的偏移值和該事件的長度;所述偏移值更新子單元,用于根據(jù)所述存儲在該數(shù)據(jù)庫中的二進制日志中最后一條事件的偏移值和該事件的長度,為從所述中繼日志中讀取的所述事件計算并更新偏移值??蛇x的,所述事件讀取單元501,從中繼日志中讀取的事件還包括:校驗和;所述事件更新單元505,還用于基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的校驗和??蛇x的,所述事件更新單元505,還包括:校驗和獲取子單元以及校驗和更新子單元;所述校驗和獲取子單元,用于獲取將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志時生成的校驗和;所述校驗和更新子單元,用于將所述中繼日志中讀取的所述事件攜帶的校驗 和更新為將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志時生成的校驗和。可選的,所述數(shù)據(jù)庫數(shù)據(jù)備份的裝置,還包括:連接建立單元;所述連接建立單元,用于從中繼日志中讀取事件之前,將當前數(shù)據(jù)庫作為備份數(shù)據(jù)庫,與主數(shù)據(jù)庫之間建立數(shù)據(jù)連接。可選的,所述連接建立單元,用于將當前數(shù)據(jù)庫作為備份數(shù)據(jù)庫,與主數(shù)據(jù)庫之間建立數(shù)據(jù)連接的主數(shù)據(jù)庫和備份數(shù)據(jù)庫為mysql數(shù)據(jù)庫??蛇x的,所述數(shù)據(jù)庫數(shù)據(jù)備份的裝置,還包括:二進制日志接收單元以及中繼日志寫入單元;所述二進制日志接收單元,用于在所述與主數(shù)據(jù)庫之間建立數(shù)據(jù)連接之后,接收主數(shù)據(jù)庫發(fā)送的所述主數(shù)據(jù)庫中的二進制日志;所述中繼日志寫入單元,用于將所述二進制日志中的事件寫入到備份數(shù)據(jù)庫中的中繼日志內(nèi)。在上述的實施例中,提供了一種數(shù)據(jù)庫數(shù)據(jù)備份的方法以及一種數(shù)據(jù)庫數(shù)據(jù)備份的裝置,此外,本申請還提供了一種電子設備;所述電子設備實施例如下:請參考圖6,其示出了根據(jù)本申請的實施例提供的電子設備的示意圖。所述電子設備,包括:顯示器601;處理器603;存儲器605;所述存儲器605,用于存儲數(shù)據(jù)庫數(shù)據(jù)備份程序,所述程序在被所述處理器讀取執(zhí)行時,執(zhí)行如下操作:從中繼日志中讀取事件;根據(jù)讀取到的所述事件對備份數(shù)據(jù)庫執(zhí)行對應的數(shù)據(jù)庫操作;基于所述數(shù)據(jù)庫操作,更新所述中繼日志中讀取的所述事件的內(nèi)容;將更新后的所述事件寫入到二進制日志中。在一個典型的配置中,計算設備包括一個或多個處理器(cpu)、輸入/輸出接口、網(wǎng)絡接口和緩存。緩存可能包括計算機可讀介質(zhì)中的非永久性存儲器,隨機存取存儲器(ram)和/或非易失性緩存等形式,如只讀存儲器(rom)或閃存(flashram)。緩存是計算機可讀介質(zhì)的示例。1、計算機可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實現(xiàn)信息存儲。信息可以是計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計算機的存儲介質(zhì)的例子包括,但不限于相變緩存 (pram)、靜態(tài)隨機存取存儲器(sram)、動態(tài)隨機存取存儲器(dram)、其他類型的隨機存取存儲器(ram)、只讀存儲器(rom)、電可擦除可編程只讀存儲器(eeprom)、快閃記憶體或其他緩存技術(shù)、只讀光盤只讀存儲器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設備或任何其他非傳輸介質(zhì),可用于存儲可以被計算設備訪問的信息。按照本文中的界定,計算機可讀介質(zhì)不包括非暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號和載波。2、本領域技術(shù)人員應明白,本申請的實施例可提供為方法、系統(tǒng)或計算機程序產(chǎn)品。因此,本申請可采用完全硬件實施例、完全軟件實施例或結(jié)合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(zhì)(包括但不限于磁盤存儲器、cd-rom、光學存儲器等)上實施的計算機程序產(chǎn)品的形式。本申請雖然以較佳實施例公開如上,但其并不是用來限定本申請,任何本領域技術(shù)人員在不脫離本申請的精神和范圍內(nèi),都可以做出可能的變動和修改,因此本申請的保護范圍應當以本申請權(quán)利要求所界定的范圍為準。當前第1頁12當前第1頁12