本發(fā)明屬于計(jì)算機(jī),具體涉及一種mysql數(shù)據(jù)庫同步方法。
背景技術(shù):
1、目前數(shù)據(jù)庫同步都是采用數(shù)據(jù)庫主備復(fù)制的方式進(jìn)行數(shù)據(jù)同步,同時(shí)大部分同步軟件都會(huì)以主備中的一臺(tái)作為同步源,很難實(shí)現(xiàn)雙向同步。
2、針對(duì)雙向數(shù)據(jù)同步的過程中數(shù)據(jù)定向修正,循環(huán)同步,主鍵沖突等問題沒有很好的解決方案。
技術(shù)實(shí)現(xiàn)思路
1、鑒于以上存在的問題,本發(fā)明提供一種mysql數(shù)據(jù)庫同步方法。
2、為解決上述技術(shù)問題,本發(fā)明采用如下的技術(shù)方案:
3、一種mysql數(shù)據(jù)庫同步方法,應(yīng)用于mysql數(shù)據(jù)庫同步系統(tǒng),所述mysql數(shù)據(jù)庫同步系統(tǒng)包括主設(shè)備和從設(shè)備,所述主設(shè)備進(jìn)一步包括本地?cái)?shù)據(jù)庫、消息產(chǎn)生模塊、消息接收模塊、業(yè)務(wù)處理模塊和執(zhí)行模塊,所述業(yè)務(wù)處理模塊進(jìn)一步包括中斷單元和數(shù)據(jù)清洗單元,所述從設(shè)備進(jìn)一步包括目標(biāo)數(shù)據(jù)庫,包括以下步驟:
4、s1,所述消息產(chǎn)生模塊中的datasync程序獲取本地?cái)?shù)據(jù)庫中的sql變動(dòng),將獲取到的變動(dòng)數(shù)據(jù)庫sql以“transaction_message”事務(wù)消息的形式發(fā)送出去;
5、s2,所述消息接收模塊進(jìn)入loop循環(huán),監(jiān)聽并接收“transaction_message”事務(wù)消息;
6、s3,當(dāng)接收到事務(wù)消息后,中斷單元對(duì)數(shù)據(jù)體進(jìn)行是否本地已執(zhí)行進(jìn)行判斷,若已執(zhí)行,則執(zhí)行中斷操作并退出;若未執(zhí)行,對(duì)數(shù)據(jù)體進(jìn)行處理;
7、s4,數(shù)據(jù)清洗單元它從中斷單元獲取到已經(jīng)處理完畢的“transaction-message”,進(jìn)行拆解,使其轉(zhuǎn)化為具體可執(zhí)行的sql語句集合;數(shù)據(jù)清洗單元檢查用戶是否進(jìn)行了清洗規(guī)則的配置,若用戶配置了清洗規(guī)則,數(shù)據(jù)清洗單元將這些語句與規(guī)則逐一進(jìn)行對(duì)照,進(jìn)行相應(yīng)的內(nèi)容替換和修改;
8、s5,執(zhí)行模塊與目標(biāo)數(shù)據(jù)庫建立穩(wěn)定的連接,將清洗完成的可執(zhí)行sql語句準(zhǔn)確地執(zhí)行到目標(biāo)數(shù)據(jù)庫中,進(jìn)而完成數(shù)據(jù)同步動(dòng)作。
9、一種可能的實(shí)施方式中,s1中所述消息產(chǎn)生模塊中的datasync程序獲取本地?cái)?shù)據(jù)庫中的sql變動(dòng),將獲取到的變動(dòng)數(shù)據(jù)庫sql以“transaction_message”事務(wù)消息的形式發(fā)送出去具體包括:獲取基于開源數(shù)據(jù)同步框架canal以及消息隊(duì)列rabbitmq實(shí)現(xiàn),當(dāng)mysql配置主備后canal將自己偽裝為從庫mysqlslave,本地?cái)?shù)據(jù)庫作為主庫mysql?master,向mysql?master發(fā)送dump協(xié)議請(qǐng)求,mysqlmaster收到dump協(xié)議請(qǐng)求后,開始推送binary?log給canal,canal接收并解析binlog日志,得到變更的數(shù)據(jù),將獲取到的變動(dòng)數(shù)據(jù)庫sql以“transaction_message”事務(wù)消息的形式發(fā)送到rabbitmg消息隊(duì)列中。
10、一種可能的實(shí)施方式中,s2中所述監(jiān)聽并接收“transaction_message”事務(wù)消息包括:
11、消息接收模塊接收rabbitmq中產(chǎn)生的數(shù)據(jù)變更“transaction_message”事務(wù)消息,并將原始消息體進(jìn)行解析轉(zhuǎn)換成業(yè)務(wù)可用的sql語句,再進(jìn)行封裝為可用數(shù)據(jù)體交由業(yè)務(wù)處理模塊處理。
12、一種可能的實(shí)施方式中,s3中所述當(dāng)接收到事務(wù)消息后,中斷單元對(duì)數(shù)據(jù)體進(jìn)行是否本地已執(zhí)行進(jìn)行判斷,若已執(zhí)行,則執(zhí)行中斷操作并退出;若未執(zhí)行,對(duì)數(shù)據(jù)體進(jìn)行處理包括:通過表記錄標(biāo)記的方式對(duì)該數(shù)據(jù)體進(jìn)行標(biāo)號(hào)并記錄數(shù)據(jù)庫表sync-sql中,若在本地?cái)?shù)據(jù)庫中,發(fā)現(xiàn)該數(shù)據(jù)體的標(biāo)記已然存在于表中,則執(zhí)行中斷操作并退出;反之,如果未找到該數(shù)據(jù)體的標(biāo)記,將“transaction-message”拆分具體內(nèi)部sql,把其中的id替換成分布式,并生成一條“sync-sql”記錄,將生成的“sync-sql”記錄合并到“transaction-message”的頭部,然后插入“sync-sql記錄”到本地?cái)?shù)據(jù)庫中。
13、一種可能的實(shí)施方式中,s5,執(zhí)行模塊與目標(biāo)數(shù)據(jù)庫建立穩(wěn)定的連接,將清洗完成的可執(zhí)行sql語句準(zhǔn)確地執(zhí)行到目標(biāo)數(shù)據(jù)庫中,進(jìn)而完成數(shù)據(jù)同步動(dòng)作中包括確定數(shù)據(jù)庫類型和版本。
14、一種可能的實(shí)施方式中,s5,執(zhí)行模塊與目標(biāo)數(shù)據(jù)庫建立穩(wěn)定的連接,將清洗完成的可執(zhí)行sql語句準(zhǔn)確地執(zhí)行到目標(biāo)數(shù)據(jù)庫中,進(jìn)而完成數(shù)據(jù)同步動(dòng)作中包括配置連接參數(shù)。
15、一種可能的實(shí)施方式中,s5,執(zhí)行模塊與目標(biāo)數(shù)據(jù)庫建立穩(wěn)定的連接,將清洗完成的可執(zhí)行sql語句準(zhǔn)確地執(zhí)行到目標(biāo)數(shù)據(jù)庫中,進(jìn)而完成數(shù)據(jù)同步動(dòng)作中包括進(jìn)行連接池管理。
16、采用本發(fā)明具有如下的有益效果:可以有效的接收到數(shù)據(jù)庫數(shù)據(jù)變動(dòng)消息,將數(shù)據(jù)消息進(jìn)行sql解析、數(shù)據(jù)過濾、數(shù)據(jù)修正等處理后執(zhí)行到目標(biāo)數(shù)據(jù)庫中完成數(shù)據(jù)同步,且該系統(tǒng)內(nèi)部業(yè)務(wù)處理模塊會(huì)進(jìn)行循環(huán)中斷判斷防止數(shù)據(jù)循環(huán)同步。
1.一種mysql數(shù)據(jù)庫同步方法,其特征在于,應(yīng)用于mysql數(shù)據(jù)庫同步系統(tǒng),所述mysql數(shù)據(jù)庫同步系統(tǒng)包括主設(shè)備和從設(shè)備,所述主設(shè)備進(jìn)一步包括本地?cái)?shù)據(jù)庫、消息產(chǎn)生模塊、消息接收模塊、業(yè)務(wù)處理模塊和執(zhí)行模塊,所述業(yè)務(wù)處理模塊進(jìn)一步包括中斷單元和數(shù)據(jù)清洗單元,所述從設(shè)備進(jìn)一步包括目標(biāo)數(shù)據(jù)庫,包括以下步驟:
2.如權(quán)利要求1所述的mysql數(shù)據(jù)庫同步方法,其特征在于,s1中所述消息產(chǎn)生模塊中的datasync程序獲取本地?cái)?shù)據(jù)庫中的sql變動(dòng),將獲取到的變動(dòng)數(shù)據(jù)庫sql以“transaction_message”事務(wù)消息的形式發(fā)送出去具體包括:獲取基于開源數(shù)據(jù)同步框架canal以及消息隊(duì)列rabbitmq實(shí)現(xiàn),當(dāng)mysql配置主備后canal將自己偽裝為從庫mysqlslave,本地?cái)?shù)據(jù)庫作為主庫mysql?master,向mysql?master發(fā)送dump協(xié)議請(qǐng)求,mysqlmaster收到dump協(xié)議請(qǐng)求后,開始推送binary?log給canal,canal接收并解析binlog日志,得到變更的數(shù)據(jù),將獲取到的變動(dòng)數(shù)據(jù)庫sql以“transaction_message”事務(wù)消息的形式發(fā)送到rabbitmg消息隊(duì)列中。
3.如權(quán)利要求2所述的mysql數(shù)據(jù)庫同步方法,其特征在于,s2中所述監(jiān)聽并接收“transaction_message”事務(wù)消息包括:
4.如權(quán)利要求1所述的mysql數(shù)據(jù)庫同步方法,其特征在于,s3中所述當(dāng)接收到事務(wù)消息后,中斷單元對(duì)數(shù)據(jù)體進(jìn)行是否本地已執(zhí)行進(jìn)行判斷,若已執(zhí)行,則執(zhí)行中斷操作并退出;若未執(zhí)行,對(duì)數(shù)據(jù)體進(jìn)行處理包括:通過表記錄標(biāo)記的方式對(duì)該數(shù)據(jù)體進(jìn)行標(biāo)號(hào)并記錄數(shù)據(jù)庫表sync-sql中,若在本地?cái)?shù)據(jù)庫中,發(fā)現(xiàn)該數(shù)據(jù)體的標(biāo)記已然存在于表中,則執(zhí)行中斷操作并退出;反之,如果未找到該數(shù)據(jù)體的標(biāo)記,將“transaction-message”拆分具體內(nèi)部sql,把其中的id替換成分布式,并生成一條“sync-sql”記錄,將生成的“sync-sql”記錄合并到“transaction-message”的頭部,然后插入“sync-sql記錄”到本地?cái)?shù)據(jù)庫中。
5.如權(quán)利要求1所述的mysql數(shù)據(jù)庫同步方法,其特征在于,s5,執(zhí)行模塊與目標(biāo)數(shù)據(jù)庫建立穩(wěn)定的連接,將清洗完成的可執(zhí)行sql語句準(zhǔn)確地執(zhí)行到目標(biāo)數(shù)據(jù)庫中,進(jìn)而完成數(shù)據(jù)同步動(dòng)作中包括確定數(shù)據(jù)庫類型和版本。
6.如權(quán)利要求1所述的mysql數(shù)據(jù)庫同步方法,其特征在于,s5,執(zhí)行模塊與目標(biāo)數(shù)據(jù)庫建立穩(wěn)定的連接,將清洗完成的可執(zhí)行sql語句準(zhǔn)確地執(zhí)行到目標(biāo)數(shù)據(jù)庫中,進(jìn)而完成數(shù)據(jù)同步動(dòng)作中包括配置連接參數(shù)。
7.如權(quán)利要求1所述的mysql數(shù)據(jù)庫同步方法,其特征在于,s5,執(zhí)行模塊與目標(biāo)數(shù)據(jù)庫建立穩(wěn)定的連接,將清洗完成的可執(zhí)行sql語句準(zhǔn)確地執(zhí)行到目標(biāo)數(shù)據(jù)庫中,進(jìn)而完成數(shù)據(jù)同步動(dòng)作中包括進(jìn)行連接池管理。