天天看點

mysql實時同步到mssql的解決方案

資料庫在應用程式中是必不可少的部分,mysql是開源的,是以很多人它,mssql是微軟的,用在windows平台上是非常友善的,是以也有很多人用它。現在問題來了,如何将這兩個資料庫同步,即資料内容保持完全一緻。

……

開個玩笑,上面說的工具非常好用,可以留着備用。現在才是真正的問題:如何将這兩個資料庫實時同步(mysql到mssql),即資料内容實時保持完全一緻。說白了,就是mysql插入(或修改、删除)一條記錄,mssql也跟着同時插入(或修改、删除)該條記錄,實時同步,不得有誤。

mysql實時同步到mssql的解決方案

問題

所謂mysql到mssql的實時同步資料。其要求是:

(1)當mysql資料庫中插入一條記錄,mssql資料庫也同時插入對應記錄;

(2)當mysql資料庫中更新某些記錄,mssql資料庫也同時更新對應記錄;

(3)當mysql資料庫中删除某條記錄,mssql資料庫也同時删除對應記錄;

這些記錄變更的時間和方式都是随機的,不确定的,是以需要随時監測它的變化。同時,如下約定:

A.    在資料庫同步之前,mysql和mssql資料庫結構和内容完全一緻;

B.    隻對資料進行插入、更新和删除操作,不更改主鍵和結構。

分析

要實作資料庫實時同步,解決方案一般有三種:一是編寫程式來操作兩個資料庫,先将目标資料庫删除,再根據原資料庫進行重新生成目标資料庫,但這種方法對于資料量大的資料庫操作顯然不可行;二是使用SQL中的觸發器、存儲過程和定時作業來完成實時同步;三是借助第三方的軟體,如SyncNavigator,但綜合經濟性、穩定性和易維護性等因素,此方案慎用。

實作

mysql實時同步到mssql的解決方案

(1)建立mysql臨時和mssql臨時資料庫,資料結構與對應正式資料庫相當,僅在每一個表中增加新字段OpType(用于記錄資料修改的操作方式);

(2)在mysql資料庫中建立觸發器,作用是當mysql資料庫中更改,mysql臨時資料庫相應表生成相應記錄,并記錄OpType字段(I表示插入記錄,U表示修改記錄,D表示删除記錄);

(3)建立mysql臨時資料庫與mssql臨時資料庫之間的連接配接;

(4)在mssql臨時資料庫建立存儲過程,當執行存儲過程時,更新mssql臨時資料庫的内容,使之與mysql臨時資料庫内容完全一緻,同時删除mysql臨時資料庫的内容;

(5)建立定時作業,定時調用mssql臨時資料庫中的存儲過程;

(6)在mssql臨時資料庫建立觸發器,根據OpType字段類型,更新mssql資料庫的内容,同時删除mssql臨時資料庫的内容。

至此,實作了mysql資料庫到mssql資料庫的實時同步,其中,mysql臨時資料庫和mssql臨時資料庫隻是過程資料,在同步完成後,資料表中的記錄将被删除。這裡所謂的實時,還取決于mssql中定時作業的計劃。

Mssql連接配接mysql的方法

  增權重限:

  優化

由于實際資料庫可能在極短時間内對一條記錄進行多次頻繁更新,為防止同步錯誤,可以兩張臨時表中再建立狀态字段(IsUpdate)。具體操作方法:

(1)當mysql修改記錄時,觸發的mysql_temp表中的IsUpdate字段值标記為0;

(2)當存儲過程調用時,将mysql_temp表中更新到mssql_temp的同時,将mysql_temp表中的IsUpdate字段值标記為1,并删除值為1的記錄;(先更新值,再複制,最後删除,下同。)

(3)mssql_temp觸發器運作時,除了将mssql_temp的記錄更新到mssql外,還将删除mssql_temp表中IsUpdate字段值标記為2,并删除值為2的記錄。

這樣,可達到兩個效果:一是更新永遠是實時同步,不會有誤;二是可減少存儲過程的調用頻率,可節省資源。

參考:

<a href="http://blog.csdn.net/orichisonic/article/details/46557965">http://blog.csdn.net/orichisonic/article/details/46557965</a>

<a href="http://blog.csdn.net/orichisonic/article/details/46557835">http://blog.csdn.net/orichisonic/article/details/46557835</a>