一種數(shù)據(jù)庫同步方法及裝置制造方法
【專利摘要】本申請公開了一種數(shù)據(jù)庫同步方法及裝置,應(yīng)用于至少包含第一數(shù)據(jù)庫和第二數(shù)據(jù)庫的數(shù)據(jù)系統(tǒng),該方法包含:在第一數(shù)據(jù)庫由主數(shù)據(jù)庫切換為從數(shù)據(jù)庫后,提取第一數(shù)據(jù)庫的第一數(shù)據(jù)庫日志和第二數(shù)據(jù)庫的第二數(shù)據(jù)庫日志;根據(jù)第一數(shù)據(jù)庫日志和第二數(shù)據(jù)庫日志,更新第二數(shù)據(jù)庫日志;以及根據(jù)更新后的第二數(shù)據(jù)庫日志中包含的各操作記錄,對第二數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行同步操作。通過上述方法,由于第二數(shù)據(jù)庫已獲取之前尚未同步過來的日志,并對自身的數(shù)據(jù)執(zhí)行了這部分日志中記錄的操作,因此,此后第二數(shù)據(jù)庫中不再缺少第一數(shù)據(jù)庫之前尚未同步過來的數(shù)據(jù),且第二數(shù)據(jù)庫中的數(shù)據(jù)狀態(tài)也是正確的。
【專利說明】一種數(shù)據(jù)庫同步方法及裝置
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計算機【技術(shù)領(lǐng)域】,尤其涉及一種數(shù)據(jù)庫同步方法及裝置。
【背景技術(shù)】
[0002] 在分布式系統(tǒng)中,為了增強系統(tǒng)的可靠性,經(jīng)常使用主從模式來部署在系統(tǒng)中使 用的數(shù)據(jù)庫。目前在分布式系統(tǒng)中所使用的數(shù)據(jù)庫可以包含多個副本,通常有一個主數(shù)據(jù) 庫和至少一個從數(shù)據(jù)庫,當(dāng)主數(shù)據(jù)庫正常工作時,會將自身的數(shù)據(jù)同步給各從數(shù)據(jù)庫。
[0003] 在現(xiàn)有技術(shù)中,當(dāng)主數(shù)據(jù)庫(以下稱為第一數(shù)據(jù)庫)無法正常工作時,如第一數(shù)據(jù) 庫的相關(guān)進(jìn)程崩潰時,或者第一數(shù)據(jù)庫所在的主機宕機時,則會有一個優(yōu)先級最高的從數(shù) 據(jù)庫(以下稱為第二數(shù)據(jù)庫)切換為新的主數(shù)據(jù)庫,而第一數(shù)據(jù)庫在恢復(fù)正常工作后,會切 換為一個新的從數(shù)據(jù)庫,此后由第二數(shù)據(jù)庫同步數(shù)據(jù)給第一數(shù)據(jù)庫和其它各從數(shù)據(jù)庫。
[0004] 但是,由于第一數(shù)據(jù)庫在無法正常工作之前,可能有部分最近的數(shù)據(jù)尚未同步給 各從數(shù)據(jù)庫(包括第二數(shù)據(jù)庫),而此后,是由第二數(shù)據(jù)庫同步數(shù)據(jù)給第一數(shù)據(jù)庫和其它各 從數(shù)據(jù)庫,因此,第二數(shù)據(jù)庫中缺少了第一數(shù)據(jù)庫尚未同步過來的這部分?jǐn)?shù)據(jù),從而,可能 導(dǎo)致第二數(shù)據(jù)庫中的數(shù)據(jù)狀態(tài)不正確。
【發(fā)明內(nèi)容】
[0005] 鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上 述問題的數(shù)據(jù)庫同步方法及裝置,在原來的主數(shù)據(jù)庫切換成為從數(shù)據(jù)庫后,確保新的主數(shù) 據(jù)庫中數(shù)據(jù)狀態(tài)正確。
[0006] 根據(jù)本發(fā)明的第一個方面,提出一種數(shù)據(jù)庫同步方法,所述方法應(yīng)用于至少包含 第一數(shù)據(jù)庫和第二數(shù)據(jù)庫的數(shù)據(jù)系統(tǒng),所述第一數(shù)據(jù)庫由主數(shù)據(jù)庫切換為從數(shù)據(jù)庫,所述 第二數(shù)據(jù)庫由從數(shù)據(jù)庫切換為主數(shù)據(jù)庫,所述方法包括:
[0007] 在所述第一數(shù)據(jù)庫切換為從數(shù)據(jù)庫后,提取所述第一數(shù)據(jù)庫的第一數(shù)據(jù)庫日志和 所述第二數(shù)據(jù)庫的第二數(shù)據(jù)庫日志;
[0008] 根據(jù)所述第一數(shù)據(jù)庫日志和所述第二數(shù)據(jù)庫日志,更新所述第二數(shù)據(jù)庫日志;
[0009] 根據(jù)更新后的第二數(shù)據(jù)庫日志中包含的各操作記錄,對所述第二數(shù)據(jù)庫中的數(shù)據(jù) 進(jìn)行同步操作。
[0010] 可選地,所述日志至少包括二進(jìn)制日志binlog。
[0011] 可選地,根據(jù)所述第一數(shù)據(jù)庫日志和所述第二數(shù)據(jù)庫日志,更新所述第二數(shù)據(jù)庫 日志,包括:
[0012] 查找包含在所述第一數(shù)據(jù)庫日志中,且不包含在所述第二數(shù)據(jù)庫日志中的操作記 錄;
[0013] 將查找到的各操作記錄并入所述第二數(shù)據(jù)庫日志中,并將并入后的第二數(shù)據(jù)庫日 志作為更新后的第二數(shù)據(jù)庫日志。
[0014] 可選地,查找包含在所述第一數(shù)據(jù)庫日志中,且不包含在所述第二數(shù)據(jù)庫日志中 的操作記錄,包括:
[0015] 在所述第一數(shù)據(jù)庫日志中,確定生成時間距當(dāng)前時刻最近、且同時包含在所述第 一數(shù)據(jù)庫日志和所述第二數(shù)據(jù)庫日志中的操作記錄;
[0016] 將確定出的操作記錄的生成時間作為分界時間戳;
[0017] 在所述第一數(shù)據(jù)庫日志中,查找生成時間晚于所述分界時間戳的操作記錄。
[0018] 可選地,將查找到的各操作記錄并入所述第二數(shù)據(jù)庫日志中,包括:
[0019] 針對查找到的每條操作記錄,確定該操作記錄對應(yīng)的標(biāo)識,作為待定標(biāo)識;
[0020] 在所述第二數(shù)據(jù)庫日志中,確定生成時間晚于該操作記錄的生成時間的各操作記 錄對應(yīng)的標(biāo)識,作為對比標(biāo)識;
[0021] 當(dāng)各對比標(biāo)識中不存在所述待定標(biāo)識時,根據(jù)該操作記錄的生成時間,將該操作 記錄插入所述第二數(shù)據(jù)庫日志中。
[0022] 可選地,當(dāng)各對比標(biāo)識中存在所述待定標(biāo)識時,忽略所述第一數(shù)據(jù)庫日志中所述 待定標(biāo)識對應(yīng)的操作記錄。
[0023] 可選地,根據(jù)更新后的第二數(shù)據(jù)庫日志中包含的各操作記錄,對所述第二數(shù)據(jù)庫 中的數(shù)據(jù)進(jìn)行同步操作,包括:
[0024] 針對并入所述第二數(shù)據(jù)庫日志中的每條操作記錄,提取該操作記錄中包含的操作 指令,并在所述第二數(shù)據(jù)庫上執(zhí)行該操作指令。
[0025] 根據(jù)本發(fā)明的第二個方面,提出一種數(shù)據(jù)庫同步裝置,所述裝置應(yīng)用于至少包含 第一數(shù)據(jù)庫和第二數(shù)據(jù)庫的數(shù)據(jù)系統(tǒng),所述第一數(shù)據(jù)庫由主數(shù)據(jù)庫切換為從數(shù)據(jù)庫,所述 第二數(shù)據(jù)庫由從數(shù)據(jù)庫切換為主數(shù)據(jù)庫,所述裝置包括:
[0026] 提取模塊,用于在所述第一數(shù)據(jù)庫切換為從數(shù)據(jù)庫后,提取所述第一數(shù)據(jù)庫的第 一數(shù)據(jù)庫日志和所述第二數(shù)據(jù)庫的第二數(shù)據(jù)庫日志;
[0027] 更新模塊,用于根據(jù)所述第一數(shù)據(jù)庫日志和所述第二數(shù)據(jù)庫日志,更新所述第二 數(shù)據(jù)庫日志;
[0028] 同步模塊,用于根據(jù)更新后的第二數(shù)據(jù)庫日志中包含的各操作記錄,對所述第二 數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行同步操作。
[0029] 可選地,所述日志至少包括二進(jìn)制日志binlog。
[0030] 可選地,所述更新模塊進(jìn)一步用于,查找包含在所述第一數(shù)據(jù)庫日志中,且不包含 在所述第二數(shù)據(jù)庫日志中的操作記錄,將查找到的各操作記錄并入所述第二數(shù)據(jù)庫日志 中,并將并入后的第二數(shù)據(jù)庫日志作為更新后的第二數(shù)據(jù)庫日志。
[0031] 可選地,所述更新模塊進(jìn)一步用于,在所述第一數(shù)據(jù)庫日志中,確定生成時間距當(dāng) 前時刻最近、且同時包含在所述第一數(shù)據(jù)庫日志和所述第二數(shù)據(jù)庫日志中的操作記錄,將 確定出的操作記錄的生成時間作為分界時間戳,在所述第一數(shù)據(jù)庫日志中,查找生成時間 晚于所述分界時間戳的操作記錄。
[0032] 可選地,所述更新模塊進(jìn)一步用于,針對查找到的每條操作記錄,確定該操作記錄 對應(yīng)的標(biāo)識,作為待定標(biāo)識,在所述第二數(shù)據(jù)庫日志中,確定生成時間晚于該操作記錄的生 成時間的各操作記錄對應(yīng)的標(biāo)識,作為對比標(biāo)識,當(dāng)各對比標(biāo)識中不存在所述待定標(biāo)識時, 根據(jù)該操作記錄的生成時間,將該操作記錄插入所述第二數(shù)據(jù)庫日志中。
[0033] 可選的,所述更新模塊進(jìn)一步用于,當(dāng)各對比標(biāo)識中存在所述待定標(biāo)識時,忽略所 述第一數(shù)據(jù)庫日志中所述待定標(biāo)識對應(yīng)的操作記錄。
[0034] 可選地,所述同步模塊進(jìn)一步用于,針對并入所述第二數(shù)據(jù)庫日志中的每條操作 記錄,提取該操作記錄中包含的操作指令,并在所述第二數(shù)據(jù)庫上執(zhí)行該操作指令。
[0035] 根據(jù)本發(fā)明提供的數(shù)據(jù)庫同步方法,由于在第一數(shù)據(jù)庫切換為從數(shù)據(jù)庫后,第二 數(shù)據(jù)庫從第一數(shù)據(jù)庫獲取了之前尚未同步過來的日志,并根據(jù)該日志對自身的數(shù)據(jù)進(jìn)行了 同步操作,因此,此后第二數(shù)據(jù)庫中不再缺少第一數(shù)據(jù)庫之前尚未同步過來的數(shù)據(jù),且第二 數(shù)據(jù)庫中的數(shù)據(jù)狀態(tài)也是正確的。
【專利附圖】
【附圖說明】
[0036] 通過閱讀下文優(yōu)選實施方式的詳細(xì)描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通 技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認(rèn)為是對本發(fā)明 的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:
[0037] 圖1為依據(jù)本發(fā)明實施例的數(shù)據(jù)庫同步過程;
[0038] 圖2為依據(jù)本發(fā)明實施例的數(shù)據(jù)庫同步的詳細(xì)過程;
[0039] 圖3為依據(jù)本發(fā)明實施例的數(shù)據(jù)庫同步裝置結(jié)構(gòu)示意圖。
【具體實施方式】
[0040] 下面將參照附圖更詳細(xì)地描述本發(fā)明公開的示例性實施例。雖然附圖中顯示了本 發(fā)明公開的示例性實施例,然而應(yīng)當(dāng)理解,可以以各種形式實現(xiàn)本發(fā)明而不應(yīng)被這里闡述 的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本發(fā)明,并且能夠?qū)⒈景l(fā) 明公開的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
[0041] 以下結(jié)合附圖,詳細(xì)說明本發(fā)明各實施例提供的技術(shù)方案。
[0042] 圖1為依據(jù)本發(fā)明實施例的數(shù)據(jù)庫同步過程,該過程可發(fā)生在至少包含第一數(shù)據(jù) 庫和第二數(shù)據(jù)庫的數(shù)據(jù)系統(tǒng)中。其中,初始時,第一數(shù)據(jù)庫為主數(shù)據(jù)庫,第二數(shù)據(jù)庫為從數(shù) 據(jù)庫,而后,第一數(shù)據(jù)庫由主數(shù)據(jù)庫切換為從數(shù)據(jù)庫,第二數(shù)據(jù)庫由從數(shù)據(jù)庫切換為主數(shù)據(jù) 庫。則數(shù)據(jù)庫同步過程可以包括步驟:
[0043] S101 :服務(wù)器在第一數(shù)據(jù)庫切換為從數(shù)據(jù)庫后,提取第一數(shù)據(jù)庫的第一數(shù)據(jù)庫日 志和第二數(shù)據(jù)庫的第二數(shù)據(jù)庫日志。
[0044] S102:根據(jù)第一數(shù)據(jù)庫日志和第二數(shù)據(jù)庫日志,更新第二數(shù)據(jù)庫日志。
[0045] S103:根據(jù)更新后的第二數(shù)據(jù)庫日志中包含的各操作記錄,對第二數(shù)據(jù)庫中的數(shù) 據(jù)進(jìn)行同步操作。
[0046] 在本發(fā)明的實施例中,所述的服務(wù)器可以是對主從數(shù)據(jù)庫的數(shù)據(jù)同步進(jìn)行統(tǒng)一管 理的管理服務(wù)器,服務(wù)器管理著一個主數(shù)據(jù)庫和至少一個從數(shù)據(jù)庫。其中,所述的主數(shù)據(jù)庫 和所述的從數(shù)據(jù)庫可以分別位于不同的主機上,也可以位于同一主機上。在一般場景下,基 于服務(wù)器的管理,主數(shù)據(jù)庫同步數(shù)據(jù)給各從數(shù)據(jù)庫。但是,當(dāng)主數(shù)據(jù)庫無法正常工作時(為 了便于描述,此后將該主數(shù)據(jù)庫稱為第一數(shù)據(jù)庫),例如,第一數(shù)據(jù)庫的相關(guān)進(jìn)程崩潰時,或 者第一數(shù)據(jù)庫所在的主機宕機時,則會有一個預(yù)設(shè)優(yōu)先級最高的從數(shù)據(jù)庫切換為新的主數(shù) 據(jù)庫(此后將該新的主數(shù)據(jù)庫稱為第二數(shù)據(jù)庫)。
[0047] 從上述可知,在該實施例中,在第一數(shù)據(jù)庫恢復(fù)正常工作后,會切換為一個新的從 數(shù)據(jù)庫,由于此時第一數(shù)據(jù)庫可能尚有部分最近的數(shù)據(jù)尚未同步給各從數(shù)據(jù)庫(包括第二 數(shù)據(jù)庫),也即,有部分操作已經(jīng)在第一數(shù)據(jù)庫上執(zhí)行,但是尚未在各從數(shù)據(jù)庫上執(zhí)行。為了 在第二數(shù)據(jù)庫上也相應(yīng)地執(zhí)行這部分操作,以保證第二數(shù)據(jù)庫中的數(shù)據(jù)狀態(tài)正確,則服務(wù) 器此時可提取第一數(shù)據(jù)庫的第一數(shù)據(jù)庫日志和第二數(shù)據(jù)庫的第二數(shù)據(jù)庫日志。其中,第一 數(shù)據(jù)庫日志用于記錄第一數(shù)據(jù)庫執(zhí)行過的操作,第二數(shù)據(jù)庫日志用于記錄第二數(shù)據(jù)庫執(zhí)行 過的操作。然后,服務(wù)器可根據(jù)第一數(shù)據(jù)庫日志和第二數(shù)據(jù)庫日志,更新第二數(shù)據(jù)庫日志, 也即,在第二數(shù)據(jù)庫日志中更新第一數(shù)據(jù)庫已執(zhí)行、而第二數(shù)據(jù)庫尚未執(zhí)行的這部分操作 所對應(yīng)的操作記錄,進(jìn)而,服務(wù)器可根據(jù)更新后的第二數(shù)據(jù)庫日志中的各操作記錄,對第二 數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行同步操作。至此,第二數(shù)據(jù)庫中不再缺少第一數(shù)據(jù)庫之前尚未同步過 來的數(shù)據(jù),且第二數(shù)據(jù)庫中的數(shù)據(jù)狀態(tài)也是正確的。
[0048] 依據(jù)本發(fā)明的一個實施例,本發(fā)明中所述的日志可以是二進(jìn)制日志binlog,也可 以是用于記錄數(shù)據(jù)庫中執(zhí)行過的數(shù)據(jù)操作的其他類型的日志,所述的數(shù)據(jù)庫可以是MYSQL, 也可以是其他類型的數(shù)據(jù)庫,本發(fā)明的實施例對所述的日志的類型,以及所述的數(shù)據(jù)庫的 類型并不做限定。其中,每個數(shù)據(jù)庫都可分別設(shè)置有自身的日志,并按照時間先后順序,將 該數(shù)據(jù)庫執(zhí)行過的所有的數(shù)據(jù)操作記錄在該日志中。
[0049] 由于用戶是以向數(shù)據(jù)庫發(fā)送結(jié)構(gòu)化查詢語言(StructuredQueryLanguage,SQL) 語句的方式,對該數(shù)據(jù)庫進(jìn)行數(shù)據(jù)修改操作的,因此,數(shù)據(jù)庫在自身的日志中所記錄的每 條操作記錄都可包含有一條對應(yīng)的SQL語句,這些SQL語句可以是DROP、CREATE、ALTER、 GRANT、REVOKE、TRUNCATE、UPDATE、INSERT、DELETE等語句,另外,日志中并不會記錄SELECT 語句和沒有對數(shù)據(jù)進(jìn)行實際更新的UPDATE語句。除了SQL語句之外,日志中的每條操作記 錄還可包含該操作記錄的生成時間、該SQL語句的執(zhí)行花費時間、生成該條操作記錄的主 機標(biāo)識(ServerID)、發(fā)送該SQL語句的客戶線程標(biāo)識等信息。
[0050] 在此,還對基于binlog進(jìn)行主從數(shù)據(jù)庫同步的方式進(jìn)行簡單說明。在主數(shù)據(jù)庫 的日志開關(guān)開啟,并正常記錄binlog的情況下,各從數(shù)據(jù)庫可定期地增量獲取主數(shù)據(jù)庫的 binlog,作為自己的binlog,并根據(jù)該binlog中的各操作記錄,對自身的數(shù)據(jù)執(zhí)行各操作 記錄所記錄的操作(也即,回放該binlog),以實現(xiàn)主從數(shù)據(jù)庫同步。
[0051] 依據(jù)本發(fā)明的一個實施例,在上述步驟S102中,服務(wù)器提取第一數(shù)據(jù)庫日志和第 二數(shù)據(jù)庫日志后,可根據(jù)第一數(shù)據(jù)庫日志和第二數(shù)據(jù)庫日志,更新第二數(shù)據(jù)庫日志。具體 的,服務(wù)器可查找包含在第一數(shù)據(jù)庫日志中,且不包含在第二數(shù)據(jù)庫日志中的操作記錄,然 后,將查找到的各操作記錄并入第二數(shù)據(jù)庫日志中,并將并入后的第二數(shù)據(jù)庫日志作為更 新后的第二數(shù)據(jù)庫日志。顯然,服務(wù)器查找到的這部分操作記錄所對應(yīng)的操作,即為第一數(shù) 據(jù)庫已執(zhí)行,而第二數(shù)據(jù)庫尚未執(zhí)行的操作。
[0052] 進(jìn)一步的,依據(jù)本發(fā)明的一個實施例,查找包含在第一數(shù)據(jù)庫日志中,且不包含在 第二數(shù)據(jù)庫日志中的操作記錄的方法具體可以為:服務(wù)器可在第一數(shù)據(jù)庫日志中,確定生 成時間距當(dāng)前時刻最近、且同時包含在第一數(shù)據(jù)庫日志和第二數(shù)據(jù)庫日志中的操作記錄, 并將確定出的操作記錄的生成時間作為分界時間戳,然后,在第一數(shù)據(jù)庫日志中,查找生成 時間晚于分界時間戳的操作記錄,作為查找到的包含在第一數(shù)據(jù)庫日志中,且不包含在第 二數(shù)據(jù)庫日志中的操作記錄,也即第一數(shù)據(jù)庫尚未同步給第二數(shù)據(jù)庫的操作記錄。
[0053] 需要說明的是,由于在數(shù)據(jù)庫日志中,是按照生成時間的順序保存各操作記錄的, 則第一數(shù)據(jù)庫尚未同步給第二數(shù)據(jù)庫的各操作記錄是位于第一數(shù)據(jù)庫日志的尾部且為連 續(xù)的。因此,服務(wù)器確定出的生成時間距當(dāng)前時刻最近、且同時包含在第一數(shù)據(jù)庫日志和第 二數(shù)據(jù)庫日志中的操作記錄,即為:第一數(shù)據(jù)庫當(dāng)前已同步給第二數(shù)據(jù)庫的最后一條操作 記錄。從而,在第一數(shù)據(jù)庫中位于該操作記錄之后的各操作記錄即為:第一數(shù)據(jù)庫尚未同步 給第二數(shù)據(jù)庫的操作記錄。
[0054] 在本發(fā)明實施例中,對在第一數(shù)據(jù)庫日志中,確定生成時間距當(dāng)前時刻最近、且同 時包含在第一數(shù)據(jù)庫日志和第二數(shù)據(jù)庫日志中的操作記錄的方法不做限定,在此,僅對其 中一種可行的方法進(jìn)行說明。
[0055] 服務(wù)器可按照生成時間從后到先的順序,針對第一數(shù)據(jù)庫日志中的各操作記錄, 判斷在第二數(shù)據(jù)庫日志中,是否包含有LogID與該操作記錄的LogID相同的操作記錄,若 是,則將該操作記錄確定為在第一數(shù)據(jù)庫日志中的,生成時間距當(dāng)前時刻最近、且同時包 含在第一數(shù)據(jù)庫日志和第二數(shù)據(jù)庫日志中的操作記錄,否則,對下一條操作記錄重新進(jìn)行 上述判斷,直至判斷結(jié)果為是為止。其中,LogID是在主數(shù)據(jù)庫日志和各從數(shù)據(jù)庫日志中 使用的一個全局變量,在這些數(shù)據(jù)庫日志中,不同的操作記錄可分別唯一對應(yīng)一個不同的 LogID,由服務(wù)器對LogID進(jìn)行分配和維護。由于每個LogID可唯一標(biāo)識一條操作記錄,因 此,LogID相同的操作記錄即為相同的操作記錄。
[0056] 依據(jù)本發(fā)明的一個實施例,服務(wù)器在查找到包含在第一數(shù)據(jù)庫日志中,且不包含 在第二數(shù)據(jù)庫日志中的各操作記錄后,則可將查找到的各操作記錄并入第二數(shù)據(jù)庫日志 中。針對在實際應(yīng)用中,可能存在的以下場景進(jìn)行具體分析。
[0057] 第一種場景,在第二數(shù)據(jù)庫切換為主數(shù)據(jù)庫以后,若在第二數(shù)據(jù)庫中尚未執(zhí)行過 數(shù)據(jù)修改操作,則服務(wù)器可直接將查找到的各操作記錄都插入第二數(shù)據(jù)庫日志中。具體的, 服務(wù)器可以將查找到的全部操作記錄和第二數(shù)據(jù)庫日志中已包含的各操作記錄,通過在內(nèi) 存中的重組,按照操作記錄的生成時間的順序,重新保存在第二數(shù)據(jù)庫日志中。
[0058] 第二種場景,在第二數(shù)據(jù)庫切換為主數(shù)據(jù)庫以后,若第二數(shù)據(jù)庫已經(jīng)執(zhí)行了某些 數(shù)據(jù)修改操作,例如,對第二數(shù)據(jù)庫中的某個數(shù)據(jù)項進(jìn)行了賦值操作,在這種場景下,由于 在第一數(shù)據(jù)庫尚未同步給第二數(shù)據(jù)庫的各操作記錄中,可能有操作記錄所對應(yīng)的操作也是 對該數(shù)據(jù)項進(jìn)行賦值操作,因此,若后續(xù)將尚未同步的該操作記錄插入第二數(shù)據(jù)庫,進(jìn)而, 回放插入后的第二數(shù)據(jù)庫日志的話,會使得該數(shù)據(jù)項的取值狀態(tài)不正確(在回放整個第二 數(shù)據(jù)庫日志的情況下),或者對該數(shù)據(jù)項進(jìn)行了冗余的賦值操作(在僅回放插入的各操作 記錄的情況下)。
[0059] 因此,在上述的第二種場景下,服務(wù)器可不直接將查找到的各操作記錄都插入第 二數(shù)據(jù)庫日志中,而是針對查找到的每條操作記錄,確定該操作記錄對應(yīng)的標(biāo)識,作為待定 標(biāo)識,并在第二數(shù)據(jù)庫日志中,確定生成時間晚于該操作記錄的生成時間的各操作記錄對 應(yīng)的標(biāo)識,作為對比標(biāo)識,當(dāng)各對比標(biāo)識中不存在該待定標(biāo)識時,根據(jù)該操作記錄的生成時 間,將該操作記錄插入第二數(shù)據(jù)庫日志中,當(dāng)各對比標(biāo)識中存在該待定標(biāo)識時,則從查找到 的各操作記錄中剔除該操作記錄,后續(xù)也不將該操作記錄插入第二數(shù)據(jù)庫日志中,即,忽略 所述第一數(shù)據(jù)庫日志中所述待定標(biāo)識對應(yīng)的操作記錄。
[0060] 在此,對所述的標(biāo)識進(jìn)行說明,所述的標(biāo)識用于對其對應(yīng)的操作記錄中包含的SQL 語句所要修改的數(shù)據(jù)項(以下稱為待修改數(shù)據(jù)項)進(jìn)行標(biāo)識,由于要修改數(shù)據(jù)時,需先定位 至對應(yīng)的待修改數(shù)據(jù)項,再對待修改數(shù)據(jù)項進(jìn)行賦值操作,因此,所述的標(biāo)識可以是定位信 息。又由于在數(shù)據(jù)庫中是以二維表格的形式存儲數(shù)據(jù)的,則若要定位待修改數(shù)據(jù)項,其定位 信息至少包括該待修改數(shù)據(jù)項的兩個屬性,以及其中一個屬性的值,從而,可定位到該待修 改數(shù)據(jù)項并對另一個屬性進(jìn)行賦值操作。
[0061] 根據(jù)上述的說明,所述的標(biāo)識可以為該定位信息,也即,所述的標(biāo)識可以包含待修 改數(shù)據(jù)項的兩個屬性,以及其中一個屬性的值。本發(fā)明實施例對所述的標(biāo)識的表示格式并 不做限定,在此僅列舉出其中一種可行的表示格式:
[0062] 可將所述的標(biāo)識表示為一個二元組{(keyl,valuel),(key2)}。其中keyl和key2 為待修改數(shù)據(jù)項的兩個屬性,valuel為keyl的取值。舉例進(jìn)行詳細(xì)說明,假定第一數(shù)據(jù)庫 中包含有數(shù)據(jù)表Student,在執(zhí)行數(shù)據(jù)修改操作之前,數(shù)據(jù)表Student如下表1所示:
【權(quán)利要求】
1. 一種數(shù)據(jù)庫同步方法,其特征在于,所述方法應(yīng)用于至少包含第一數(shù)據(jù)庫和第二數(shù) 據(jù)庫的數(shù)據(jù)系統(tǒng),所述第一數(shù)據(jù)庫由主數(shù)據(jù)庫切換為從數(shù)據(jù)庫,所述第二數(shù)據(jù)庫由從數(shù)據(jù) 庫切換為主數(shù)據(jù)庫,所述方法包括: 在所述第一數(shù)據(jù)庫切換為從數(shù)據(jù)庫后,提取所述第一數(shù)據(jù)庫的第一數(shù)據(jù)庫日志和所述 第二數(shù)據(jù)庫的第二數(shù)據(jù)庫日志; 根據(jù)所述第一數(shù)據(jù)庫日志和所述第二數(shù)據(jù)庫日志,更新所述第二數(shù)據(jù)庫日志; 根據(jù)更新后的第二數(shù)據(jù)庫日志中包含的各操作記錄,對所述第二數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行 同步操作。
2. 如權(quán)利要求1所述的方法,其特征在于,所述日志至少包括二進(jìn)制日志binlog。
3. 如權(quán)利要求1所述的方法,其特征在于,根據(jù)所述第一數(shù)據(jù)庫日志和所述第二數(shù)據(jù) 庫日志,更新所述第二數(shù)據(jù)庫日志,包括: 查找包含在所述第一數(shù)據(jù)庫日志中,且不包含在所述第二數(shù)據(jù)庫日志中的操作記錄; 將查找到的各操作記錄并入所述第二數(shù)據(jù)庫日志中,并將并入后的第二數(shù)據(jù)庫日志作 為更新后的第二數(shù)據(jù)庫日志。
4. 如權(quán)利要求3所述的方法,其特征在于,查找包含在所述第一數(shù)據(jù)庫日志中,且不包 含在所述第二數(shù)據(jù)庫日志中的操作記錄,包括: 在所述第一數(shù)據(jù)庫日志中,確定生成時間距當(dāng)前時刻最近、且同時包含在所述第一數(shù) 據(jù)庫日志和所述第二數(shù)據(jù)庫日志中的操作記錄; 將確定出的操作記錄的生成時間作為分界時間戳; 在所述第一數(shù)據(jù)庫日志中,查找生成時間晚于所述分界時間戳的操作記錄。
5. 如權(quán)利要求3所述的方法,其特征在于,將查找到的各操作記錄并入所述第二數(shù)據(jù) 庫日志中,包括: 針對查找到的每條操作記錄,確定該操作記錄對應(yīng)的標(biāo)識,作為待定標(biāo)識; 在所述第二數(shù)據(jù)庫日志中,確定生成時間晚于該操作記錄的生成時間的各操作記錄對 應(yīng)的標(biāo)識,作為對比標(biāo)識; 當(dāng)各對比標(biāo)識中不存在所述待定標(biāo)識時,根據(jù)該操作記錄的生成時間,將該操作記錄 插入所述第二數(shù)據(jù)庫日志中。
6. 如權(quán)利要求5所述的方法,其特征在于,當(dāng)各對比標(biāo)識中存在所述待定標(biāo)識時,忽略 所述第一數(shù)據(jù)庫日志中所述待定標(biāo)識對應(yīng)的操作記錄。
7. 如權(quán)利要求3所述的方法,其特征在于,根據(jù)更新后的第二數(shù)據(jù)庫日志中包含的各 操作記錄,對所述第二數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行同步操作,包括: 針對并入所述第二數(shù)據(jù)庫日志中的每條操作記錄,提取該操作記錄中包含的操作指 令,并在所述第二數(shù)據(jù)庫上執(zhí)行該操作指令。
8. -種數(shù)據(jù)庫同步裝置,其特征在于,所述裝置應(yīng)用于至少包含第一數(shù)據(jù)庫和第二數(shù) 據(jù)庫的數(shù)據(jù)系統(tǒng),所述第一數(shù)據(jù)庫由主數(shù)據(jù)庫切換為從數(shù)據(jù)庫,所述第二數(shù)據(jù)庫由從數(shù)據(jù) 庫切換為主數(shù)據(jù)庫,所述裝置包括: 提取模塊,用于在所述第一數(shù)據(jù)庫切換為從數(shù)據(jù)庫后,提取所述第一數(shù)據(jù)庫的第一數(shù) 據(jù)庫日志和所述第二數(shù)據(jù)庫的第二數(shù)據(jù)庫日志; 更新模塊,用于根據(jù)所述第一數(shù)據(jù)庫日志和所述第二數(shù)據(jù)庫日志,更新所述第二數(shù)據(jù) 庫日志; 同步模塊,用于根據(jù)更新后的第二數(shù)據(jù)庫日志中包含的各操作記錄,對所述第二數(shù)據(jù) 庫中的數(shù)據(jù)進(jìn)行同步操作。
9. 如權(quán)利要求8所述的裝置,其特征在于,所述日志至少包括二進(jìn)制日志binlog。
10. 如權(quán)利要求8所述的裝置,其特征在于,所述更新模塊進(jìn)一步用于,查找包含在所 述第一數(shù)據(jù)庫日志中,且不包含在所述第二數(shù)據(jù)庫日志中的操作記錄,將查找到的各操作 記錄并入所述第二數(shù)據(jù)庫日志中,并將并入后的第二數(shù)據(jù)庫日志作為更新后的第二數(shù)據(jù)庫 日志。
【文檔編號】G06F17/30GK104346479SQ201410696885
【公開日】2015年2月11日 申請日期:2014年11月26日 優(yōu)先權(quán)日:2014年11月26日
【發(fā)明者】陳宗志, 王超, 陳磊, 陳營, 李明昊 申請人:北京奇虎科技有限公司, 奇智軟件(北京)有限公司