本發(fā)明涉及數(shù)據(jù)庫技術(shù)領(lǐng)域,特別是涉及數(shù)據(jù)庫更新同步的方法、系統(tǒng)及數(shù)據(jù)庫集群。
背景技術(shù):
關(guān)系型數(shù)據(jù)庫技術(shù)是信息系統(tǒng)中的一種核心技術(shù)。它被廣泛地應(yīng)用作各種信息應(yīng)用的后臺,并為各種應(yīng)用提供數(shù)據(jù)服務(wù)。目前最主要的關(guān)系型數(shù)據(jù)庫包括商用數(shù)據(jù)庫Oracle、DB2、SQL Server和開放源碼的關(guān)系型數(shù)據(jù)庫MySQL、PostGreSQL等。
為了保證數(shù)據(jù)的安全,需要對數(shù)據(jù)庫實行一個或多個備份,熱備份是常用的一種數(shù)據(jù)庫備份方式。熱備份在數(shù)據(jù)庫運行狀態(tài)下的備份方法,熱備份數(shù)據(jù)可用于快速地進行災(zāi)難恢復(fù)。然而,由于傳統(tǒng)的熱備份是非實時的,其提供的數(shù)據(jù)的準確性難以保證,并且熱備份的數(shù)據(jù)庫存在引入數(shù)據(jù)沖突而喪失同時提供數(shù)據(jù)更新的能力。
為了提高數(shù)據(jù)庫中數(shù)據(jù)更新的能力,業(yè)界已有的解決辦法是:構(gòu)建數(shù)據(jù)庫實時應(yīng)用集群,例如Oracle實時應(yīng)用集群(Oracle RAC)。然而現(xiàn)有的實時應(yīng)用集群中的若干數(shù)據(jù)庫共享相同的存儲設(shè)備,因此在存儲設(shè)備受損時,將導(dǎo)致集群中的所有數(shù)據(jù)庫都無法正常運行,容災(zāi)性能較差。并且,在通常的情況下,當一個更新命令在源數(shù)據(jù)庫中執(zhí)行時,它將激活源數(shù)據(jù)庫相關(guān)的更新觸發(fā)器。而當該觸發(fā)器在集群中的目標數(shù)據(jù)庫中執(zhí)行同步更新時,目標數(shù)據(jù)庫的觸發(fā)器也會被激活,使得在源數(shù)據(jù)庫中再次執(zhí)行同步更新命令,由此引起了一個死循環(huán)。
對于上述現(xiàn)有問題,有人提出了一種使用主動信號的方法來避免該死循環(huán)的方法,但這個方法要求訪問目標數(shù)據(jù)庫兩次。這種信息交互的過程將影響目標數(shù)據(jù)庫的數(shù)據(jù)更新速度。此外,集群中的數(shù)據(jù)庫有需要維護的時候,也會遇到死機的情況,在這些情況下,該數(shù)據(jù)庫在恢復(fù)運行時,其中的數(shù)據(jù)將與集群中的其他數(shù)據(jù)庫不同歩,為了讓該數(shù)據(jù)庫和集群中的其他數(shù)據(jù)庫同歩,需要短暫暫停集群中其它正常運行的數(shù)據(jù)庫的數(shù)據(jù)更新功能,從而導(dǎo)致集群整體無法提供真正的無間斷的數(shù)據(jù)更新能力。
技術(shù)實現(xiàn)要素:
基于此,本發(fā)明實施例提供數(shù)據(jù)庫更新同步的方法、系統(tǒng)及數(shù)據(jù)庫集群,能夠避免集群中數(shù)據(jù)庫更新同步時的死循環(huán),并提高集群整體的數(shù)據(jù)更新同步速度。
本發(fā)明一方面提供數(shù)據(jù)庫更新同步的方法,包括:接收到對第一數(shù)據(jù)庫的更新命令,根據(jù)預(yù)設(shè)的數(shù)據(jù)庫會話屬性識別所述更新命令是否為被復(fù)制的更新命令;
若否,則將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令;
判斷與所述第一數(shù)據(jù)庫鏈接的第二數(shù)據(jù)庫是否滿足預(yù)設(shè)的實時更新條件;若滿足,則將所述新的更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行;若不滿足,則為所述第二數(shù)據(jù)庫保存所述新的更新命令,并根據(jù)保存的更新命令對所述第二數(shù)據(jù)庫進行延遲同步更新。
本發(fā)明第二方面提供一種數(shù)據(jù)庫更新同步的系統(tǒng),包括:
命令識別模塊,用于接收到對第一數(shù)據(jù)庫的更新命令,根據(jù)預(yù)設(shè)的數(shù)據(jù)庫會話屬性識別所述更新命令是否為被復(fù)制的更新命令;
命令復(fù)制模塊,用于若命令識別模塊的識別結(jié)果為否,則將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令;
實時更新模塊,用于若判斷出與所述第一數(shù)據(jù)庫鏈接的第二數(shù)據(jù)庫滿足預(yù)設(shè)的實時更新條件,則將所述新的更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行;
更新記錄模塊,用于若判斷出所述第二數(shù)據(jù)庫不滿足預(yù)設(shè)的實時更新條件,則為所述第二數(shù)據(jù)庫保存所述更新命令;
延遲更新模塊,用于根據(jù)保存的更新命令對所述第二數(shù)據(jù)庫進行延遲同步更新。
本發(fā)明又一方面提供一種數(shù)據(jù)庫集群,包括:第一數(shù)據(jù)庫和第二數(shù)據(jù)庫,所述第一數(shù)據(jù)庫包括:
命令識別模塊,用于接收到更新命令,根據(jù)預(yù)設(shè)的數(shù)據(jù)庫會話屬性識別所述更新命令是否為被復(fù)制的更新命令;
命令復(fù)制模塊,用于若命令識別模塊的識別結(jié)果為否,則將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令;
實時更新模塊,用于若判斷出所述第二數(shù)據(jù)庫滿足預(yù)設(shè)的實時更新條件,則將所述新的更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行;
更新記錄模塊,用于若判斷出所述第二數(shù)據(jù)庫不滿足預(yù)設(shè)的實時更新條件,則為所述第二數(shù)據(jù)庫保存新的更新命令;
延遲更新模塊,用于根據(jù)保存的更新命令對所述第二數(shù)據(jù)庫進行延遲同步更新。
上述技術(shù)方案,通過選定一個可以用于識別更新命令是否是被復(fù)制的命令的數(shù)據(jù)庫會話的某個屬性,對于源命令,則向與所述數(shù)據(jù)庫鏈接的其他數(shù)據(jù)庫發(fā)送包含相同數(shù)據(jù)操作信息的更新命令,以實現(xiàn)鏈接的數(shù)據(jù)庫的數(shù)據(jù)同步;若是被復(fù)制的命令,則不向與所述數(shù)據(jù)庫鏈接的其他數(shù)據(jù)庫發(fā)送包含相同數(shù)據(jù)操作信息的更新命令,以此避免死循環(huán);并且,如果對應(yīng)的數(shù)據(jù)庫不滿足實時更新的條件,則為對應(yīng)的數(shù)據(jù)庫暫存更新命令,以對所述數(shù)據(jù)庫進行延遲同步更新。本發(fā)明上述實施例的方案,能夠避免集群中數(shù)據(jù)庫更新同步時的死循環(huán),并提高集群整體的數(shù)據(jù)更新同步的速度。
附圖說明
圖1為一實施例的數(shù)據(jù)庫更新同步的方法的示意性流程圖;
圖2為一實施例的對數(shù)據(jù)庫進行延遲同步更新的示意性流程圖;
圖3為另一實施例的數(shù)據(jù)庫更新同步的方法的示意性流程圖;
圖4為一實施例的數(shù)據(jù)庫更新同步的系統(tǒng)的示意性結(jié)構(gòu)圖;
圖5為一實施例的數(shù)據(jù)庫集群的示意性結(jié)構(gòu)圖;
圖6為另一實施例的數(shù)據(jù)庫集群的示意性結(jié)構(gòu)圖。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細說明。應(yīng)當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
圖1為一實施例的數(shù)據(jù)庫更新同步的方法的示意性流程圖。本實施例中,執(zhí)行環(huán)境為第一數(shù)據(jù)庫,該數(shù)據(jù)庫既可是源數(shù)據(jù)庫,也可是接受更新同步命令的目標數(shù)據(jù)庫。如圖1所示,本實施例中的數(shù)據(jù)庫更新同步的方法包括步驟:
S11,接收到對第一數(shù)據(jù)庫的更新命令;
本發(fā)明實施例中,假定執(zhí)行更新命令都是在數(shù)據(jù)庫的觸發(fā)器中實現(xiàn),盡管還可以在數(shù)據(jù)庫的任何合適的地方。因此,本發(fā)明實施例中在接收到對第一數(shù)據(jù)庫的更新命令的之后,相應(yīng)的會激活所述第一數(shù)據(jù)庫的觸發(fā)器。
S12,根據(jù)預(yù)設(shè)的數(shù)據(jù)庫會話屬性識別所述更新命令是否為被復(fù)制的更新命令;若否,執(zhí)行步驟S121,若是,執(zhí)行步驟S122;
本實施例中需預(yù)先選定一個可以用于識別更新命令是否是被復(fù)制的更新命令的數(shù)據(jù)庫會話屬性。用戶發(fā)起的更新命令為源更新命令,來自其他數(shù)據(jù)庫的數(shù)據(jù)同步會話的更新命令則為被復(fù)制的更新命令。作為一優(yōu)選實施方式,可選定數(shù)據(jù)庫會話的用戶名作為用于識別更新命令是否是被復(fù)制的更新命令的數(shù)據(jù)庫會話屬性。
例如:設(shè)定數(shù)據(jù)庫會話的用戶名為“sss”的更新命令均屬于被復(fù)制的更新命令。獲取接收到的更新命令對應(yīng)的數(shù)據(jù)庫會話的用戶名,判斷獲取到的用戶名是否為sss,若是,則該更新命令屬于被復(fù)制的更新命令;若不是,則該更新命令不屬于被復(fù)制的更新命令。
可以理解的是,用于識別更新命令是否是被復(fù)制的更新命令的數(shù)據(jù)庫會話屬性不限于數(shù)據(jù)庫會話的用戶名,任何能夠用于識別更新命令是否是被復(fù)制的更新命令的屬性都可以。
步驟S121,將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令;進入步驟S13;
本發(fā)明實施例中,更新命令中的數(shù)據(jù)操作信息主要以DML(Data Manipulation Language,數(shù)據(jù)操縱語言)語句的形式表示,所述數(shù)據(jù)操作信息可包括插入(insert)、更換(update)、刪除(delete)等類型?;诖耍瑢⑺龈旅钷D(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令的方式例如:若所述更新命令中包括插入(insert)或者更換(update)的DML語句,則從所述更新命令中獲取到所述插入(insert)的DML語句或者所述更換(update)的DML語句,根據(jù)所述插入(insert)的DML語句或者所述更換(update)的DML語句生成一條新的更新命令,該新的更新命令的發(fā)出用戶為所述第一數(shù)據(jù)庫,目標數(shù)據(jù)庫為與其鏈接的其他數(shù)據(jù)庫(即第二數(shù)據(jù)庫)。
步驟S122,禁止將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令并發(fā)送;
在通常的情況下,當一個更新命令在主數(shù)據(jù)庫中執(zhí)行時,它將激活主數(shù)據(jù)庫的相關(guān)的觸發(fā)器;而當該觸發(fā)器在從數(shù)據(jù)庫中執(zhí)行同步更新時,從數(shù)據(jù)庫的觸發(fā)器也會被激活并會在主數(shù)據(jù)庫中再次執(zhí)行同步更新命令,這樣就引起了一個死循環(huán)。本實施例中“從數(shù)據(jù)庫”指只接受復(fù)制數(shù)據(jù)的數(shù)據(jù)庫但不轉(zhuǎn)發(fā),即通過上述步驟S122可避免這種死循環(huán)。
可以理解的是,本發(fā)明實施例中數(shù)據(jù)庫集群是指由至少兩個數(shù)據(jù)庫組成的整體。
S13,判斷所述第二數(shù)據(jù)庫是否滿足預(yù)設(shè)的實時更新條件?若是,執(zhí)行步驟S14,若否,執(zhí)行步驟S15,
優(yōu)選的,本發(fā)明實施例中預(yù)設(shè)的實時更新條件為:數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新,并且數(shù)據(jù)庫當前處于正常運行狀態(tài)或正在過渡到正常運行狀態(tài)(T2N);數(shù)據(jù)庫處于正常運行狀態(tài)時能正常執(zhí)行讀寫數(shù)據(jù)操作指令;數(shù)據(jù)庫處于正過渡到正常運行狀態(tài)時,與其鏈接的其他數(shù)據(jù)庫的數(shù)據(jù)不同步且待執(zhí)行的更新事務(wù)量小于等于預(yù)設(shè)閾值。
S14,將所述新的更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行;
本發(fā)明實施例中,若所述第二數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新、并且當前處于正常運行狀態(tài),則直接將所述新的更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行;若所述第二數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新、并且當前處于正在過渡到正常運行狀態(tài),則讀取所述新的更新命令包含的數(shù)據(jù)操作信息,將所述數(shù)據(jù)操作信息轉(zhuǎn)換為兩條以上的DML操作語句,根據(jù)轉(zhuǎn)換得到的DML操作語句生成對應(yīng)條子更新命令,按序?qū)⑺鲎痈旅畎l(fā)送至所述第二數(shù)據(jù)庫中執(zhí)行。因為在目標數(shù)庫(第二數(shù)據(jù)庫)處于"正過渡到正常狀態(tài)"時,因源數(shù)據(jù)庫(第一數(shù)據(jù)庫)和目標數(shù)據(jù)可能沒有完全同步,因此在這種情況下需將原命令進行轉(zhuǎn)換,折成多個DML操作語句,以保證數(shù)據(jù)操作后的目標數(shù)據(jù)庫與源數(shù)據(jù)庫的同步。當然也可進行先嘗試執(zhí)行原命令(即不轉(zhuǎn)換),如果出現(xiàn)錯誤或結(jié)果異常,再將原命令進行轉(zhuǎn)換。
例如,所述更新命令中包括一條插入(insert)或者更換(update)的DML語句,可將所述更新命令進行適當?shù)霓D(zhuǎn)換得到兩條子命令,例如,插入(insert)的DML語句可轉(zhuǎn)換為先刪除(delete)再插入(insert)的兩條DML語句;同理,更換(update)的DML語句也可轉(zhuǎn)換為先刪除(delete)再插入(insert)的DML語句;根據(jù)轉(zhuǎn)換得到的DML操作語句生成對應(yīng)條子更新命令,先將包含刪除(delete)操作信息的子更新命令發(fā)送至所述第二數(shù)據(jù)庫中執(zhí)行,再將包含插入(insert)操作信息的子更新命令發(fā)送至所述第二數(shù)據(jù)庫中執(zhí)行。
S15,為所述第二數(shù)據(jù)庫保存所述更新命令,并根據(jù)保存的更新命令對所述第二數(shù)據(jù)庫進行延遲同步更新。
本發(fā)明實施例中,為第二數(shù)據(jù)庫保存所述更新命令的方式包括:保存在第一數(shù)據(jù)庫中,當然,也可保存在其他任何地方,只要在對第二數(shù)據(jù)庫進行延時更新時可以讀取到即可。
需要說明的是,本實施例中,第一數(shù)據(jù)庫和第二數(shù)據(jù)庫的角色可互換,即第二數(shù)據(jù)庫接收到更新命令,根據(jù)預(yù)設(shè)的數(shù)據(jù)庫會話屬性識別所述更新命令是否為被復(fù)制的更新命令;若否,則將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令;判斷與第一數(shù)據(jù)庫是否滿足預(yù)設(shè)的實時更新條件;若滿足,則將所述新的更新命令發(fā)送至所述第一數(shù)據(jù)庫執(zhí)行;若不滿足,則為所述第一數(shù)據(jù)庫保存所述新的更新命令,并根據(jù)保存的更新命令對所述第一數(shù)據(jù)庫進行延遲同步更新。
優(yōu)選的,若所述第二數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新,則在第二數(shù)據(jù)庫重啟時,可根據(jù)記錄的更新命令對所述第二數(shù)據(jù)庫進行數(shù)據(jù)恢復(fù),使其與第一數(shù)據(jù)庫的數(shù)據(jù)同步。由此可使要求實時復(fù)制的數(shù)據(jù)庫重啟時能夠與集群其它數(shù)據(jù)庫實現(xiàn)同步。
本發(fā)明實施例中,數(shù)據(jù)庫接收到更新命令之后,可識別該更新命令是否為復(fù)制的命令,若是,則不再轉(zhuǎn)發(fā),如否,則向與其鏈接的其他數(shù)據(jù)庫轉(zhuǎn)發(fā)更新命令,以實現(xiàn)數(shù)據(jù)庫集群的同步更新;并且若檢測到對應(yīng)的數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新、且處于正常運行狀態(tài)或正在過渡到正常運行狀態(tài),則直接將更新命令發(fā)送至該數(shù)據(jù)庫實現(xiàn)實時同步;若對應(yīng)的數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新、但既不處于正常運行狀態(tài)、也不處于正在過渡到正常運行狀態(tài),則為該數(shù)據(jù)庫保存更新命令;若對應(yīng)的數(shù)據(jù)庫的數(shù)據(jù)更新要求為非實時更新或者延遲更新,同樣也為該數(shù)據(jù)庫保存更新命令。
在為對應(yīng)的數(shù)據(jù)庫保存更新命令之后,可按照設(shè)定時間間隔判斷所述對應(yīng)的數(shù)據(jù)庫是否滿足預(yù)設(shè)的延遲同步條件,當滿足延遲同步條件時,則讀取保存的更新命令并發(fā)送至對應(yīng)的數(shù)據(jù)庫執(zhí)行,由此實現(xiàn)延遲同步。本發(fā)明實施例中,延遲同步條件可包括:數(shù)據(jù)庫為要求實時更新的狀態(tài),并且當前處于正常運行狀態(tài)或正在過渡到正常運行狀態(tài);或者數(shù)據(jù)庫為延遲更新狀態(tài)且延遲時間屆滿;或者數(shù)據(jù)庫由要求延遲更新狀態(tài)轉(zhuǎn)換為實時更新狀態(tài)。對于包括至少兩個數(shù)據(jù)庫的數(shù)據(jù)庫集群,根據(jù)保存的更新命令對數(shù)據(jù)庫進行數(shù)據(jù)更新的過程相當于數(shù)據(jù)庫的恢復(fù)過程。傳統(tǒng)數(shù)據(jù)庫集群中某數(shù)據(jù)庫與其他數(shù)據(jù)庫的數(shù)據(jù)不同步、需要進行恢復(fù)時,需暫停其他數(shù)據(jù)庫的更新操作。本發(fā)明的恢復(fù)方法可消除數(shù)據(jù)庫集群的暫停更新操作的問題,由此縮短數(shù)據(jù)庫集群的更新同步時間。
圖2為一實施例的根據(jù)保存的更新命令對所述數(shù)據(jù)庫進行延遲同步更新的示意性流程圖,其中若第二數(shù)據(jù)庫為要求實時更新的數(shù)據(jù)庫,由于檢查等原因暫停,在數(shù)據(jù)庫重啟時需進行數(shù)據(jù)恢復(fù),直到其與其他源數(shù)據(jù)庫的數(shù)據(jù)同步;若第二數(shù)據(jù)庫為要求延時更新的數(shù)據(jù)庫,則當預(yù)設(shè)的延時更新條件滿足時(例如延時時間到時)需進行數(shù)據(jù)恢復(fù)。如圖2所示,對所述第二數(shù)據(jù)庫進行數(shù)據(jù)恢復(fù)的步驟包括:
S20,設(shè)定閾值,用參數(shù)V表示;
V的取值可為大于0的任意整數(shù),可根據(jù)實際情況進行調(diào)整。
S21,統(tǒng)計為第二數(shù)據(jù)庫保存的待執(zhí)行的更新命令的數(shù)量,記為參數(shù)M;
相對于源數(shù)據(jù)庫(第一數(shù)據(jù)庫)來說,第二數(shù)據(jù)庫相當于目標數(shù)據(jù)庫(從數(shù)據(jù)庫)。
S22,判斷M<=V是否成立;若是,進入步驟S23,若否,進入步驟S28;
S23,進一步檢測第二數(shù)據(jù)庫是否轉(zhuǎn)換為要求實時更新的狀態(tài);若是,進入步驟S24,若否,進入步驟S28;
S24,通知第二數(shù)據(jù)庫的所有源數(shù)據(jù)庫該數(shù)據(jù)庫已進入“正在過渡到正常運行狀態(tài)”(狀態(tài)T2N),表明第二數(shù)據(jù)庫的所有源數(shù)據(jù)庫可以將它們的數(shù)據(jù)更新直接同步到該數(shù)據(jù)庫。
S25,讀取所有的待執(zhí)行的更新命令,對于每條待執(zhí)行的更新命令,從源數(shù)據(jù)庫中獲取相關(guān)的數(shù)據(jù),用獲取到的源數(shù)據(jù)庫中的數(shù)據(jù)對所述第二數(shù)據(jù)庫進行數(shù)據(jù)更新;
用獲取到的源數(shù)據(jù)庫中的數(shù)據(jù)對所述第二數(shù)據(jù)庫進行數(shù)據(jù)更新的過程可為:先鎖定所述第二數(shù)據(jù)庫的相應(yīng)數(shù)據(jù)項,將獲取到的源數(shù)據(jù)庫中的數(shù)據(jù)同步到第二數(shù)據(jù)庫,然后解鎖上述相應(yīng)數(shù)據(jù)項。
S26,在執(zhí)行完所有的待執(zhí)行的更新命令之后,刪除保存的更新命令;執(zhí)行步驟S27。
這時第二數(shù)據(jù)庫與其對應(yīng)的源數(shù)據(jù)庫的數(shù)據(jù)同步,并且可以接受源數(shù)據(jù)庫的實時更新同步。
S27,通知所述第二數(shù)據(jù)庫的所有源數(shù)據(jù)庫該數(shù)據(jù)庫已進入正常運行狀態(tài),延遲同步程序(恢復(fù)程序)結(jié)束。
S28,獲取保存時間最早的待執(zhí)行的更新命令,讀取該待執(zhí)行的更新命令中用于更新的數(shù)據(jù),用獲取到的更新命令中的數(shù)據(jù)對所述第二數(shù)據(jù)庫進行數(shù)據(jù)更新;
S29,執(zhí)行完所述更新命令后,刪除保存的對應(yīng)更新命令的記錄,返回步驟S21。
需要說明的是,當所述第二數(shù)據(jù)庫為要求延遲更新的數(shù)據(jù)庫時,由于不要求實時更新的數(shù)據(jù)庫是處于非正常狀態(tài),因為它的數(shù)據(jù)和源數(shù)據(jù)庫的數(shù)據(jù)不是實時同步的,因此這樣的第二數(shù)據(jù)庫不會廣播其狀態(tài)信息,即不執(zhí)行上述S24至S27之間的步驟。
需要說明的是,本實施例中,要求延遲更新的數(shù)據(jù)庫可以在任何時候轉(zhuǎn)變?yōu)橐髮崟r更新的數(shù)據(jù)庫,反之亦然。數(shù)據(jù)庫從要求延遲更新轉(zhuǎn)變?yōu)橐髮崟r更新時,會通知集群中的源數(shù)據(jù)庫,因它當前尚且處于非正常狀態(tài)(它的數(shù)據(jù)不準確或與源數(shù)據(jù)庫不同步,因此它不能立即正確處理用戶的讀寫指令),源數(shù)據(jù)庫將繼續(xù)為它保存數(shù)據(jù),直到它進入正常運行狀態(tài)或者正在進入正常運行狀態(tài);數(shù)據(jù)庫從要求要求實時更新轉(zhuǎn)變?yōu)橐笱舆t更新時,也會通知其它源數(shù)據(jù)庫,轉(zhuǎn)換之后由于其進入了非正常運行狀態(tài),因此便不會廣播其狀態(tài)信息。
通過本發(fā)明上述實施例的數(shù)據(jù)庫更新同步的方法,它將數(shù)據(jù)庫集群中的數(shù)據(jù)庫更新同步所需的時間降至最低并保證永不停機(即暫停更新)。既利于應(yīng)對災(zāi)難恢復(fù),同時保證集群中的數(shù)據(jù)庫的數(shù)據(jù)的準確性,極大地提高了數(shù)據(jù)庫提供數(shù)據(jù)和更新數(shù)據(jù)的能力,降低了應(yīng)用成本。
圖3為另一實施例的數(shù)據(jù)庫更新同步的方法的示意性流程圖;在本實施例中,執(zhí)行環(huán)境為數(shù)據(jù)庫集群,該數(shù)據(jù)庫集群包括至少兩個需更新同步的數(shù)據(jù)庫(第一數(shù)據(jù)庫和第二數(shù)據(jù)庫)。本實施例結(jié)合至少兩個數(shù)據(jù)庫之間的交互過程,對集群中數(shù)據(jù)庫更新同步的方法進行說明。如圖3所示,具體包括如下步驟:。
S31,第一數(shù)據(jù)庫接收到更新命令,根據(jù)預(yù)設(shè)的數(shù)據(jù)庫會話屬性識別所述更新命令是否為被復(fù)制的更新命令;
若收到的是用戶更新命令,則可識別所述更新命令不是被復(fù)制的更新命令,執(zhí)行下一步。
S32,所述第一數(shù)據(jù)庫執(zhí)行所述更新命令,并將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令;
S33,若檢測到與其鏈接的第二數(shù)據(jù)庫滿足預(yù)設(shè)的實時更新條件,則將所述新的更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行;否則,則為所述第二數(shù)據(jù)庫保存所述新的更新命令;
本實施例中可按照設(shè)定時間間隔循環(huán)判斷所述第二數(shù)據(jù)庫是否滿足預(yù)設(shè)的延遲同步條件;若是,讀取保存的更新命令,并將所述更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行,以實現(xiàn)第一數(shù)據(jù)庫和第二數(shù)據(jù)庫的延時同步。若否,繼續(xù)執(zhí)行本步驟。
另一方面,對于所述第二數(shù)據(jù)庫來說,包括以下步驟:
S41,所述第二數(shù)據(jù)庫接收第一數(shù)據(jù)庫發(fā)送的更新命令,根據(jù)預(yù)設(shè)的數(shù)據(jù)庫會話屬性可識別出其接收到的所述更新命令為被復(fù)制的更新命令;
S42,所述第二數(shù)據(jù)庫不會將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令;以此避免形成死循環(huán)。
當然,本實施例中第一數(shù)據(jù)庫和第二數(shù)據(jù)庫的角色可以互換。即第二數(shù)據(jù)庫在執(zhí)行更新時,檢測第一數(shù)據(jù)庫是否滿足預(yù)設(shè)的實時更新條件;若是則向第一數(shù)據(jù)庫發(fā)送同步更新命令;第一數(shù)據(jù)庫接收來自第二數(shù)據(jù)庫的同步更新命令,識別出所述更新命令屬于被復(fù)制的更新命令,則不再進行轉(zhuǎn)發(fā)。
優(yōu)選的,本實施例上述步驟S32中,將所述新的更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行的步驟包括:若檢測到所述第二數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新、并且當前處于正常運行狀態(tài),則將所述新的更新命令發(fā)送至所述第二數(shù)據(jù)庫中執(zhí)行;若檢測到所述第二數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新、并且當前處于正在過渡到正常運行狀態(tài),則讀取所述新的更新命令包含的數(shù)據(jù)操作信息,轉(zhuǎn)換為兩條以上的DML操作語句,根據(jù)轉(zhuǎn)換得到的DML操作語句生成對應(yīng)條子更新命令,按序?qū)⑺鲎痈旅畎l(fā)送至所述第二數(shù)據(jù)庫中執(zhí)行。
需要說明的是,對于前述的各方法實施例,為了簡便描述,將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動作順序的限制,因為依據(jù)本發(fā)明,某些步驟可以采用其它順序或者同時進行。
基于與上述實施例中的數(shù)據(jù)庫更新同步的方法相同的思想,本發(fā)明還提供數(shù)據(jù)庫更新同步的系統(tǒng),該系統(tǒng)可用于執(zhí)行上述數(shù)據(jù)庫更新同步的方法。為了便于說明,數(shù)據(jù)庫更新同步的系統(tǒng)實施例的結(jié)構(gòu)示意圖中,僅僅示出了與本發(fā)明實施例相關(guān)的部分,本領(lǐng)域技術(shù)人員可以理解,圖示結(jié)構(gòu)并不構(gòu)成對系統(tǒng)的限定,可以包括比圖示更多或更少的部件,或者組合某些部件,或者不同的部件布置。
圖4為本發(fā)明一實施例的數(shù)據(jù)庫更新同步的系統(tǒng)的示意性結(jié)構(gòu)圖;如圖4所示,本實施例的數(shù)據(jù)庫更新同步的系統(tǒng)包括:命令識別模塊410、命令復(fù)制模塊420、實時更新模塊430、更新記錄模塊440以及延遲更新模塊450,各模塊詳述如下:
上述命令識別模塊410,用于接收對第一數(shù)據(jù)庫的更新命令,根據(jù)預(yù)設(shè)的數(shù)據(jù)庫會話屬性識別所述更新命令是否為被復(fù)制的更新命令;
優(yōu)選的,所述預(yù)設(shè)的數(shù)據(jù)庫會話屬性為數(shù)據(jù)庫會話的用戶名;對應(yīng)的上述命令識別模塊410可用于,接收對第一數(shù)據(jù)庫的更新命令,獲取所述更新命令對應(yīng)的數(shù)據(jù)庫會話的用戶名,判斷獲取到的用戶名是否為預(yù)設(shè)用戶名;數(shù)據(jù)庫會話的用戶名為所述預(yù)設(shè)用戶名的更新命令均屬于被復(fù)制的更新命令。
命令復(fù)制模塊420,用于若命令識別模塊的識別結(jié)果為否,則將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令;若命令識別模塊的識別結(jié)果為是,則禁止將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令;
實時更新模塊430,用于若判斷出與所述第一數(shù)據(jù)庫鏈接的第二數(shù)據(jù)庫滿足預(yù)設(shè)的實時更新條件,則將所述新的更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行;
優(yōu)選的,所述預(yù)設(shè)的實時更新條件可為:數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新,并且數(shù)據(jù)庫當前處于正常運行狀態(tài)或正在過渡到正常運行狀態(tài)。數(shù)據(jù)庫處于正常運行狀態(tài)時能正常執(zhí)行讀寫數(shù)據(jù)操作指令;數(shù)據(jù)庫處于正過渡到正常運行狀態(tài)時,與其他數(shù)據(jù)庫同步更新的更新事務(wù)量小于等于預(yù)設(shè)閾值。
所述更新記錄模塊440,用于若判斷出所述第二數(shù)據(jù)庫不滿足預(yù)設(shè)的實時更新條件,則為所述第二數(shù)據(jù)庫保存所述新的更新命令;
所述延遲更新模塊450,用于根據(jù)保存的更新命令對所述第二數(shù)據(jù)庫進行延遲同步更新。
例如,若所述第二數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新,則所述延遲更新模塊450可用于在第二數(shù)據(jù)庫重啟時,根據(jù)保存的更新命令對所述第二數(shù)據(jù)庫進行數(shù)據(jù)恢復(fù),使其與第一數(shù)據(jù)庫的數(shù)據(jù)同步。
優(yōu)選的,所述實時更新模塊430中可包括:
第一實時更新模塊子模塊,用于若所述第二數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新、并且當前處于正常運行狀態(tài),則將所述新的更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行;
第二實時更新模塊子模塊,用于若所述第二數(shù)據(jù)庫的數(shù)據(jù)更新要求為實時更新、并且當前處于正在過渡到正常運行狀態(tài),則讀取所述新的更新命令包含的數(shù)據(jù)操作信息,將所述數(shù)據(jù)操作信息轉(zhuǎn)換為兩條以上的DML操作語句,根據(jù)轉(zhuǎn)換得到的DML操作語句生成對應(yīng)條子更新命令,按序?qū)⑺鲎痈旅畎l(fā)送至所述第二數(shù)據(jù)庫中執(zhí)行。
優(yōu)選的,所述延遲更新模塊450可用于按照設(shè)定時間間隔判斷所述第二數(shù)據(jù)庫是否滿足預(yù)設(shè)的延遲同步條件,當確定所述第二數(shù)據(jù)庫滿足所述延遲同步條件時,讀取保存的更新命令并將所述更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行。
優(yōu)選的,所述延遲更新模塊450中可包括:
事務(wù)量檢測子模塊,用于統(tǒng)計為所述第二數(shù)據(jù)庫保存的待執(zhí)行的更新命令的數(shù)量,記為參數(shù)M,判斷M<=V是否成立,V表示預(yù)設(shè)閾值;
第一更新執(zhí)行子模塊,用于若事務(wù)量檢測子模塊的判斷結(jié)果為是,則讀取所有的待執(zhí)行的更新命令,對于每條待執(zhí)行的更新命令,從對應(yīng)的源數(shù)據(jù)庫中獲取與各條待執(zhí)行的更新命令相關(guān)的數(shù)據(jù),用獲取到的數(shù)據(jù)對所述第二數(shù)據(jù)庫進行數(shù)據(jù)更新;
第二更新執(zhí)行子模塊,用于若事務(wù)量檢測子模塊的判斷結(jié)果為否,則讀取保存時間最早的待執(zhí)行的更新命令,讀取該待執(zhí)行的更新命令中用于更新的數(shù)據(jù),用獲取到的數(shù)據(jù)對所述第二數(shù)據(jù)庫進行數(shù)據(jù)更新;
優(yōu)選的,所述延遲更新模塊450中還可包括:
狀態(tài)檢測子模塊,用于當檢測到M<=V成立時,檢測所述第二數(shù)據(jù)庫當前是否為要求實時更新的狀態(tài);
狀態(tài)廣播子模塊,用于若是要求實時更新的狀態(tài),則將所述第二數(shù)據(jù)庫的當前狀態(tài)確定為正在過渡到正常運行狀態(tài),向與所述第二數(shù)據(jù)庫鏈接的其他數(shù)據(jù)庫廣播該狀態(tài)信息。還用于在執(zhí)行完所述M項更新命令后,若所述第二數(shù)據(jù)庫為要求實時更新的數(shù)據(jù)庫,則將所述第二數(shù)據(jù)庫的當前狀態(tài)確定為正常運行狀態(tài),向與所述第二數(shù)據(jù)庫鏈接的其他數(shù)據(jù)庫廣播該狀態(tài)信息。
所述第二更新執(zhí)行子模塊,還用于若不是要求實時更新的狀態(tài),則讀取保存時間最早的待執(zhí)行的更新命令,讀取該待執(zhí)行的更新命令中用于更新的數(shù)據(jù),用獲取到的更新命令中的數(shù)據(jù)對所述第二數(shù)據(jù)庫進行數(shù)據(jù)更新。
圖5為一實施例的數(shù)據(jù)庫集群的示意性結(jié)構(gòu)圖;如圖5所示,所述數(shù)據(jù)庫集群500包括第一數(shù)據(jù)庫501和第二數(shù)據(jù)庫502。所述第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502均包括有:命令識別模塊、命令復(fù)制模塊、實時更新模塊、更新記錄模塊以及延遲更新模塊,詳述如下:
在所述第一數(shù)據(jù)庫501中:
所述命令識別模塊,用于接收到更新命令,根據(jù)預(yù)設(shè)的數(shù)據(jù)庫會話屬性識別所述更新命令是否為被復(fù)制的更新命令;所述命令復(fù)制模塊,用于若命令識別模塊的識別結(jié)果為否,則將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令;所述實時更新模塊,用于若判斷出所述第二數(shù)據(jù)庫滿足預(yù)設(shè)的實時更新條件,則將所述新的更新命令發(fā)送至所述第二數(shù)據(jù)庫執(zhí)行;所述更新記錄模塊,用于若判斷出所述第二數(shù)據(jù)庫不滿足預(yù)設(shè)的實時更新條件,則為所述第二數(shù)據(jù)庫保存新的更新命令;所述延遲更新模塊,用于根據(jù)保存的更新命令對所述第二數(shù)據(jù)庫進行延遲同步更新。
在所述第二數(shù)據(jù)庫502中:所述命令識別模塊,用于接收到更新命令,根據(jù)預(yù)設(shè)的數(shù)據(jù)庫會話屬性識別所述更新命令是否為被復(fù)制的更新命令;所述命令復(fù)制模塊,用于若命令識別模塊的識別結(jié)果為否,則將所述更新命令轉(zhuǎn)換為包含相同數(shù)據(jù)操作信息的新的更新命令;所述實時更新模塊,用于若判斷出所述第一數(shù)據(jù)庫滿足預(yù)設(shè)的實時更新條件,則將所述新的更新命令發(fā)送至所述第一數(shù)據(jù)庫執(zhí)行;所述更新記錄模塊,用于若判斷出所述第一數(shù)據(jù)庫不滿足預(yù)設(shè)的實時更新條件,則為所述第一數(shù)據(jù)庫保存新的更新命令;所述延遲更新模塊,用于根據(jù)保存的更新命令對所述第一數(shù)據(jù)庫進行延遲同步更新。
作為另一優(yōu)選實施方式,也可為所述第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502設(shè)置一個共享的更新記錄模塊。例如將共享的更新記錄模塊設(shè)置在第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502之外的一個獨立的數(shù)據(jù)庫中,該更新記錄模塊由第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502共享。這種情況下,所述第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502無需單獨設(shè)置一個本地的更新記錄模塊。
圖6為另一實施例的數(shù)據(jù)庫集群的示意性結(jié)構(gòu)圖;如圖6所示,所述數(shù)據(jù)庫集群600包括:第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502和第三數(shù)據(jù)庫503,所述第一數(shù)據(jù)庫501和第二數(shù)據(jù)庫502的數(shù)據(jù)更新要求為實時更新,所述第三數(shù)據(jù)庫503的數(shù)據(jù)更新要求為延時同步更新。
本實施例中,第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502均可為主數(shù)據(jù)庫,第三數(shù)據(jù)庫503則為從數(shù)據(jù)庫,主數(shù)據(jù)庫的數(shù)據(jù)更新時,從數(shù)據(jù)庫需要進行相應(yīng)的同步更新。
所述第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502相互要求數(shù)據(jù)實時更新,這兩個數(shù)據(jù)庫可構(gòu)成一個非共享存儲的數(shù)據(jù)庫實時子集群。第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502將它們的數(shù)據(jù)延遲同步到第三數(shù)據(jù)庫503。所述第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502可各包括一個更新記錄模塊,用于為其他數(shù)據(jù)庫記錄需延遲執(zhí)行的更新命令。當然,也可為所述第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502設(shè)置一個共享的更新記錄模塊。
優(yōu)選的,本實施例中,保存更新命令的方式為:在所述第一數(shù)據(jù)庫/第二數(shù)據(jù)中保存。對應(yīng)的,該數(shù)據(jù)庫集群600中,在各數(shù)據(jù)庫正常運行狀態(tài)時,若用戶發(fā)出源更新命令到第一數(shù)據(jù)庫501時,該更新命令將被第一數(shù)據(jù)庫501中的實時更新模塊實時同步執(zhí)行到第二數(shù)據(jù)庫502,并在第一數(shù)據(jù)庫501中為所述第三數(shù)據(jù)庫503保存該更新命令;相應(yīng)的,若用戶發(fā)出源更新命令到第二數(shù)據(jù)庫502時,該更新將被第二數(shù)據(jù)庫502中的實時更新模塊實時同步執(zhí)行到第一數(shù)據(jù)庫501,并在第二數(shù)據(jù)庫502中為所述第三數(shù)據(jù)庫503保存該更新命令。
第三數(shù)據(jù)庫503在延遲更新時,其延遲更新模塊可周期性地從第一數(shù)據(jù)庫501/第二數(shù)據(jù)庫502的更新記錄模塊中讀出與其相關(guān)的待執(zhí)行的更新命令,按時間順序?qū)⒋龍?zhí)行的更新命令同步執(zhí)行,使得第三數(shù)據(jù)庫503與第一數(shù)據(jù)庫501、第二數(shù)據(jù)庫502實現(xiàn)延時同步。
假如第二數(shù)據(jù)庫502處于非正常運行狀態(tài),那么第一數(shù)據(jù)庫501將在其更新記錄模塊中為第二數(shù)據(jù)庫502保存更新命令,在第二數(shù)據(jù)庫502重新進入正常運行狀態(tài)時,無需暫停第一數(shù)據(jù)庫501,第二數(shù)據(jù)庫502的延遲更新模塊可從第一數(shù)據(jù)庫501的更新記錄模塊中讀出與其相關(guān)的待執(zhí)行的更新命令并執(zhí)行,使得第二數(shù)據(jù)庫502和第一數(shù)據(jù)庫501的數(shù)據(jù)同步。
需要說明的是,上述示例的系統(tǒng)及數(shù)據(jù)庫集群的實施方式中,各模塊/單元之間的信息交互、執(zhí)行過程等內(nèi)容,由于與本發(fā)明前述方法實施例基于同一構(gòu)思,其帶來的技術(shù)效果與本發(fā)明前述方法實施例相同,具體內(nèi)容可參見本發(fā)明方法實施例中的敘述,此處不再贅述。
此外,上述示例的系統(tǒng)及數(shù)據(jù)庫集群的實施方式中,各功能模塊的邏輯劃分僅是舉例說明,實際應(yīng)用中可以根據(jù)需要,例如出于相應(yīng)硬件的配置要求或者軟件的實現(xiàn)的便利考慮,將上述功能分配由不同的功能模塊完成,即將所述數(shù)據(jù)庫更新同步的系統(tǒng)的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。其中各功能模既可以采用硬件的形式實現(xiàn),也可以采用軟件功能模塊的形式實現(xiàn)。
本領(lǐng)域普通技術(shù)人員可以理解,實現(xiàn)上述實施例方法中的全部或部分流程,是可以通過計算機程序來指令相關(guān)的硬件來完成,所述的程序可存儲于一計算機可讀取存儲介質(zhì)中,作為獨立的產(chǎn)品銷售或使用。所述程序在執(zhí)行時,可執(zhí)行如上述各方法的實施例的全部或部分步驟。其中,所述的存儲介質(zhì)可為磁碟、光盤、只讀存儲記憶體(Read-Only Memory,ROM)或隨機存儲記憶體(Random Access Memory,RAM)等。
在上述實施例中,對各個實施例的描述都各有側(cè)重,某個實施例中沒有詳述的部分,可以參見其它實施例的相關(guān)描述??梢岳斫?,其中所使用的術(shù)語“第一”、“第二”等在本文中用于區(qū)分對象,但這些對象不受這些術(shù)語限制。例如,在不脫離本發(fā)明的范圍的情況下,可以將第一數(shù)據(jù)庫稱為第二數(shù)據(jù)庫,將第二數(shù)據(jù)庫稱為第一數(shù)據(jù)庫。
以上所述實施例僅表達了本發(fā)明的幾種實施方式,不能理解為對本發(fā)明專利范圍的限制。應(yīng)當指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進,這些都屬于本發(fā)明的保護范圍。因此,本發(fā)明專利的保護范圍應(yīng)以所附權(quán)利要求為準。