一種數(shù)據(jù)庫增量日志解析方法及系統(tǒng)的制作方法【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及數(shù)據(jù)處理
技術(shù)領(lǐng)域:
,尤其涉及一種數(shù)據(jù)庫增量日志解析方法及系統(tǒng)?!?br>背景技術(shù):
】[0002]Binlog是數(shù)據(jù)庫增量日志,數(shù)據(jù)庫增量日志由各種數(shù)據(jù)庫表操作事件組成,一個數(shù)據(jù)庫增量日志的位點(例如mysql-bin.000002,15846289)對應(yīng)一個數(shù)據(jù)庫表操作事件。數(shù)據(jù)庫表操作事件包括插入操作、更新操作和刪除操作三種類型。通過數(shù)據(jù)庫增量日志可以對數(shù)據(jù)庫進行數(shù)據(jù)恢復(fù)以及數(shù)據(jù)復(fù)制。[0003]在數(shù)據(jù)庫表中,列是具有相同數(shù)據(jù)類型的數(shù)據(jù)的集合,數(shù)據(jù)庫主要的增量數(shù)據(jù)存儲在列事件類型中,這些數(shù)據(jù)需要通過表映射事件(例如Table_map_event)里的提供的信息:列類型、列長度等才能被正確的解析出來。但是列的名稱、列是否為主鍵、列的字符集編碼以及列是否為唯一索引等信息并不存儲在數(shù)據(jù)庫增量日志里。在發(fā)送給應(yīng)用計算或者同步到其他數(shù)據(jù)庫時,這些信息至關(guān)重要,是數(shù)據(jù)處理時必須具備的。[0004]元數(shù)據(jù)(Metadata)是關(guān)于數(shù)據(jù)的數(shù)據(jù),例如數(shù)據(jù)庫名或表名,列的數(shù)據(jù)類型,或訪問權(quán)限等等。在數(shù)據(jù)庫中,元數(shù)據(jù)可以幫助數(shù)據(jù)庫管理員和數(shù)據(jù)庫的開發(fā)人員非常方便地找到他們所關(guān)心的數(shù)據(jù)。同時數(shù)據(jù)庫有DDL(DataDefinit1nLanguage,數(shù)據(jù)定義語言)操作,可以用來修改元數(shù)據(jù),這些DDL操作會被記錄到數(shù)據(jù)庫增量日志里。對于解析數(shù)據(jù)庫增量日志的程序而言,需要正確理解DDL操作對元數(shù)據(jù)的影響。[0005]—般情況下,元數(shù)據(jù)可以從數(shù)據(jù)庫里通過sql(StructuredQuevyLanguage,結(jié)構(gòu)化查詢語言)線程查詢獲得,比如MySQL(—種開放源碼的小型關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng))通過deSC_table的語句,能夠得到列的名稱、列是否為主鍵以及列是否為唯一索引等信息。然而現(xiàn)有通過從數(shù)據(jù)庫里查詢元數(shù)據(jù)的方式存在一些缺陷,在DDL操作非常密集的情況下,由于回查(到源數(shù)據(jù)庫執(zhí)行sql線程來獲得表的元數(shù)據(jù))需要時間。在數(shù)據(jù)庫增量日志里發(fā)現(xiàn)DDL操作和開始進行回查的期間,如果快速發(fā)生第二次DDL操作的情況下,將會出現(xiàn)以下問題:[0006]一、受第二個DDL操作的影響,第一個DDL操作所對應(yīng)的元數(shù)據(jù)出現(xiàn)錯誤。[0007]二、當(dāng)這兩個DDL操作都修改了同一個表的元數(shù)據(jù),那么第一個DDL操作產(chǎn)生的元數(shù)據(jù)在數(shù)據(jù)庫上被覆蓋,這個版本的元數(shù)據(jù)就被丟失了。更為極端的情況下,如果該元數(shù)據(jù)對應(yīng)產(chǎn)生了DML((DataManipulat1nLanguage,數(shù)據(jù)操縱語言命令)操作,這該DML操作對應(yīng)的數(shù)據(jù)在解析時會使用錯誤的元數(shù)據(jù)。由此擴展到密集發(fā)生多次DDL操作時,同樣會出現(xiàn)上述問題。[0008]綜上可知,現(xiàn)有技術(shù)在實際使用上顯然存在不便與缺陷,所以有必要加以改進?!?br/>發(fā)明內(nèi)容】[0009]針對上述的缺陷,本發(fā)明的目的在于提供一種數(shù)據(jù)庫增量日志解析方法及系統(tǒng),其能夠解決在執(zhí)行密集DDL操作的情況下,反查mysqld(mysql在運行時的實例)時元數(shù)據(jù)丟失的問題,能夠在數(shù)據(jù)庫增量日志的解析過程中提供和數(shù)據(jù)庫增量日志準(zhǔn)確匹配的元數(shù)據(jù)。[0010]為了實現(xiàn)上述目的,本發(fā)明提供一種數(shù)據(jù)庫增量日志解析方法,所述方法包括如下步驟:[0011]從源數(shù)據(jù)庫中獲取元數(shù)據(jù)以及數(shù)據(jù)庫增量日志,并將所述元數(shù)據(jù)復(fù)制到數(shù)據(jù)庫分析模塊中;[0012]查詢該數(shù)據(jù)庫增量日志中的DDL操作,并將DDL操作串行輸入到所述數(shù)據(jù)庫分析模塊中執(zhí)行,所述數(shù)據(jù)庫分析模塊根據(jù)從所述源數(shù)據(jù)庫中獲取的元數(shù)據(jù)以及執(zhí)行所述DDL操作對元數(shù)據(jù)產(chǎn)生的修改生成新元數(shù)據(jù);[0013]每執(zhí)行完一個DDL操作則從所述數(shù)據(jù)庫分析模塊中查詢與該DDL操作對應(yīng)的新元數(shù)據(jù),根據(jù)所述新元數(shù)據(jù)解析所述數(shù)據(jù)庫增量日志。[0014]本發(fā)明相應(yīng)提供一種數(shù)據(jù)庫增量日志解析系統(tǒng),所述系統(tǒng)包括:[0015]數(shù)據(jù)獲取模塊,用于從源數(shù)據(jù)庫中獲取元數(shù)據(jù)以及數(shù)據(jù)庫增量日志,并將所述元數(shù)據(jù)復(fù)制到數(shù)據(jù)庫分析模塊中;[0016]數(shù)據(jù)庫分析模塊,用于查詢該數(shù)據(jù)庫增量日志中的DDL操作進行串行執(zhí)行,并根據(jù)從所述源數(shù)據(jù)庫中獲取的元數(shù)據(jù)以及執(zhí)行所述DDL操作對元數(shù)據(jù)產(chǎn)生的修改生成新元數(shù)據(jù);[0017]元數(shù)據(jù)查詢模塊,用于每執(zhí)行完一個DDL操作時從所述數(shù)據(jù)庫分析模塊中查詢與該DDL操作對應(yīng)的新元數(shù)據(jù);[0018]增量日志解析模塊,用于根據(jù)所述新元數(shù)據(jù)解析所述數(shù)據(jù)庫增量日志。[0019]本發(fā)明通過從源數(shù)據(jù)庫中獲取元數(shù)據(jù)以及數(shù)據(jù)庫增量日志,將元數(shù)據(jù)復(fù)制到數(shù)據(jù)庫分析模塊中,并將數(shù)據(jù)庫增量日志中的DDL操作串行輸入到數(shù)據(jù)庫分析模塊中執(zhí)行,每執(zhí)行完一個DDL操作則從數(shù)據(jù)庫分析模塊中查詢與該DDL操作對應(yīng)的新元數(shù)據(jù),再根據(jù)新元數(shù)據(jù)解析數(shù)據(jù)庫增量日志。在源數(shù)據(jù)庫上對DDL的操作是并行的,但是這些操作串行記錄在數(shù)據(jù)庫增量日志中,本發(fā)明在解析數(shù)據(jù)庫增量日志時,將數(shù)據(jù)庫增量日中中的DDL操作也串行的寫入數(shù)據(jù)庫分析模塊中,這樣每執(zhí)行一個DDL操作,就獲取一次新元數(shù)據(jù),然后在執(zhí)行下一個DDL操作,由于該數(shù)據(jù)庫分析模塊只被解析數(shù)據(jù)庫增量日志的應(yīng)用訪問,即避免了多個DDL操作短時間內(nèi)密集修改同一個表產(chǎn)生的元數(shù)據(jù)丟失問題,從而本發(fā)明能夠在數(shù)據(jù)庫增量日志的解析過程中提供和數(shù)據(jù)庫增量日志準(zhǔn)確匹配的元數(shù)據(jù)?!靖綀D說明】[0020]圖1是本發(fā)明一種數(shù)據(jù)庫增量日志解析系統(tǒng)的框圖;[0021]圖2是本發(fā)明一種實施例中進行數(shù)據(jù)增量解析時的數(shù)據(jù)傳輸?shù)牧飨驁D;[0022]圖3是本發(fā)明一種數(shù)據(jù)庫增量日志解析方法的流程圖;[0023]圖4是本發(fā)明一種實施例中進行數(shù)據(jù)庫增量日志解析的流程圖?!揪唧w實施方式】[0024]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。[0025]在本申請一個典型的配置中,終端、服務(wù)網(wǎng)絡(luò)的設(shè)備和可信方均包括一個或多個CPU(CentralProcessingUnit,中央處理器)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。[0026]內(nèi)存可能包括計算機可讀介質(zhì)中的非永久性存儲器,RAM(RandomAccessMemory,隨機存取存儲器)和/或非易失性內(nèi)存等形式,如ROM(Read-OnlyMemory,只讀存儲器)或flashRAM(閃存)。內(nèi)存是計算機可讀介質(zhì)的示例。[0027]計算機可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實現(xiàn)信息存儲。信息可以是計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計算機的存儲介質(zhì)的例子包括,但不限于PRAM(PhaseChangeRandomAccessMemory,相變內(nèi)存)、SRAM(StaticRandomAccessMemory,隨機存取存儲器)、DRAM(DynamicRandomAccessMemory,動態(tài)隨機存取存儲器)、其他類型的RAM(隨機存取存儲器)、R0M(只讀存儲器)、EEPROM(ElectricalIyErasableProgrammableRead-OnlyMemory,電可擦可編程只讀存儲器)、快閃記憶體或其他內(nèi)存技術(shù)、CD-ROM(CompactDiscRead-OnlyMemory,只讀光盤)、DVD(DigitalVersatileDisc,數(shù)字多功能光盤)或其他光學(xué)存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計算設(shè)備訪問的信息。按照本文中的界定,計算機可讀介質(zhì)不包括非暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號和載波。[0028]由于現(xiàn)有技術(shù)中在源數(shù)據(jù)庫中對DDL的操作是并行的,但是記錄在數(shù)據(jù)庫增量日志里是串行記錄的。例如,源數(shù)據(jù)庫并發(fā)的對10數(shù)據(jù)庫表進行了更新,而數(shù)據(jù)庫增量日志是按照各操作記錄的先后順序串行記錄。在將數(shù)據(jù)更新發(fā)送給下游應(yīng)用、同步到其他數(shù)據(jù)庫的場景下,需要解析數(shù)據(jù)庫增量日志。而現(xiàn)有技術(shù)通過從數(shù)據(jù)庫里查詢元數(shù)據(jù),由于回查需要一定時間,在數(shù)據(jù)庫增量日志里發(fā)現(xiàn)DDL操作和開始進行回查的期間,如果快速發(fā)生第二次DDL操作的情況下,第一個DDL操作所對應(yīng)的元數(shù)據(jù)將會受到第二個DDL操作的影響,導(dǎo)致第一個DDL操作所對應(yīng)的原信息不正確。而且當(dāng)這兩個DDL操作都修改了同一個表的元數(shù)據(jù),那么第一個DDL操作產(chǎn)生的元數(shù)據(jù)在同步數(shù)據(jù)庫上被覆蓋,這個版本的元數(shù)據(jù)就被丟失了。[0029]因此,本發(fā)明實施例旨在解決在執(zhí)行密集DDL操作的情況下,反查mysqld時元數(shù)據(jù)丟失的問題,從而在數(shù)據(jù)庫增量日志的解析過程中提供和數(shù)據(jù)庫增量日志準(zhǔn)確匹配的元數(shù)據(jù)。在本發(fā)明中,備份的是元數(shù)據(jù),根據(jù)備份的元數(shù)據(jù)來解析增量日志,增量日志不僅用于備份,還可以同步給MySQL或者其他應(yīng)用程序。[0030]如圖1所示,本發(fā)明一種數(shù)據(jù)庫增量日志解析系統(tǒng)100,包括數(shù)據(jù)獲取模塊10、數(shù)據(jù)庫分析模塊20、元數(shù)據(jù)查詢模塊30及增量日志解析模塊40;優(yōu)選地,該系統(tǒng)100還可以包括故障恢復(fù)模塊50。[0031]數(shù)據(jù)獲取模塊10,用于從源數(shù)據(jù)庫中獲取元數(shù)據(jù)以及數(shù)據(jù)庫增量日志,并將元數(shù)據(jù)復(fù)制到如embededmysqld(基于mysql用于嵌入到應(yīng)用程序中的數(shù)據(jù)庫)程序等數(shù)據(jù)庫分析模塊中。元數(shù)據(jù)包括數(shù)據(jù)庫名、表名、列的數(shù)據(jù)類型、列的名稱、列長度、列是否為主鍵以及列是否為唯一索引等等。[0032]具體的,數(shù)據(jù)獲取模塊10從提供服務(wù)的mysqld中克隆出元數(shù)據(jù)到embededmysqld中,MySQL提供以下三種辦法以獲取關(guān)于數(shù)據(jù)庫和數(shù)據(jù)庫里各種對象(也就是數(shù)據(jù)庫的元數(shù)據(jù))的信息,如下:SHOW語句(如SHOWTABLES等等)、INFORMAT1N_SCHEMA數(shù)據(jù)庫里的數(shù)據(jù)表以及命令行程序,如mysqlshow(用于查看mysql數(shù)據(jù)庫庫、表、列的元信息的命令行工具)或者是mysqldump(用于導(dǎo)出mysql數(shù)據(jù)庫庫、表、列的元信息或者數(shù)據(jù)庫數(shù)據(jù)的命令行工具)O在本發(fā)明中優(yōu)選采用show語句,包括showdatabases(獲取服務(wù)器所管理的數(shù)據(jù)庫);showtables(列出默認(rèn)數(shù)據(jù)庫里的所有數(shù)據(jù)表);showcreatetable(查看給定數(shù)據(jù)庫的創(chuàng)建語句);createdatabase(創(chuàng)建數(shù)據(jù)庫)…;createtable(創(chuàng)建表)…坐坐寸寸ο[0033]數(shù)據(jù)庫主要的增量數(shù)據(jù)存儲在列事件類型中,數(shù)據(jù)庫增量日志包括多個列事件,每一個列事件與一個位點對應(yīng),列事件包括對表的插入操作、更新操作以及刪除操作。一個列事件對應(yīng)一個或者多個插入、更新及刪除操作(對同一個表的操作多個的同類型操作會合并在一個列事件里)。[0034]數(shù)據(jù)庫分析模塊當(dāng)前第1頁1 2