簡體   English   中英

通過Windows服務同步MySQL和MSSQL數據庫

[英]Sync MySQL and MSSQL databases through windows service

我必須同步兩個數據庫的2個表,其中一個是MSSQL,另一個是MySQL。 我必須通過Windows服務來執行此操作。 我當前創建了Windows服務,目前添加到該服務中的是:從MySQL數據庫獲取數據並將其插入到數據適配器中,我計划通過事務插入從該數據適配器將數據移至MSSQL數據庫您能告訴我解決此問題的最佳方法是什么,如果我現在正在做的事情在正確的軌道上,那么我是第一次做這樣的事情。

好吧,可能有兩種方法可以解決此問題。 您沒有提到表的數量和大小,所需的同步頻率,因此我的回答可能不是100%相關。 無論如何,我的建議是:

  1. 每個表應具有附加列-SyncDate(TIMESTAMP),默認情況下為null。
  2. Windows Service中實現的同步邏輯會定期通過執行以下查詢來檢查每個表是否有要同步的數據(出於性能原因,請使用純IDataReader):

    SELECT * from TEST_TABLE,其中SyncDate為空

  3. 如果以上語句返回數據,則:

    • 收集要插入的行包(例如500行)
    • 在目標數據庫上開始事務並為收集的包執行插入語句(將SyncDate列的設置值設置為DateTime.Now)
    • 當插入完成后,在源數據庫中執行如下這樣的執行語句:

    UPDATE TEST_TABLE SET SyncDate = @ DateTime.Now其中ID_PRIMARY_KEY IN(來自包裝的標識)

    • 提交交易
    • 收集另一個包並重復算法,直到DataReader提供數據為止
  4. 以上算法應同時應用於兩個數據庫

  5. 可能您的數據庫具有外鍵,因此您必須記住依賴表應該以有效順序進行同步
  6. 只要有可能,您都可以從多線程中受益

對於這種工作,SQL Server Integration Services是必經之路。

SSIS用於提取,轉換和加載數據。 (ETL過程)

您需要為從MySQL到MSSQL的數據轉換的每個步驟設計一個工作流程。

然后,您創建一個作業並配置其計划,它將由SQL Server執行。

無需從頭開始開發並且很難維護。

如果將mySql數據庫添加為鏈接服務器(sp_addlinkedserver),那么我認為您可以在MS SQL數據庫上的存儲proc中執行以下操作:

 insert table1(col1) 
 select col1 
 from openquery('MySqlLinkedDb','select col1 from mySqlDb.dbo.table2')

如果您必須通過Windows服務執行此操作,我很好奇您如何從MySQL接收數據? 什么是發起對服務的調用以及數據以什么形式傳遞? 您要更改還是要刷新數據?

例如,如果收到DataTable或其他某種IEnumerable及其完全刷新,則可以使用SqlBulkCopy.WriteToServer()。 那將是最快和最有效的。

湯姆

如果您已經准備好將MySQL數據移至SQL。 我建議您將它們放在單獨的表上,然后發出“合並”命令以合並數據。 確保您標記回已更新的數據,以便現在可以將其取回並推送至MySQL:

MERGE TableFromMySQL AS TARGET USING TableFromSQL AS SOURCE
    ON (TARGET.PrimaryKey = SOURCE.PrimaryKey)
         WHEN Matched AND (TARGET.Field1 <> SOURCE.Field1
            OR TARGET.Field2 <> SOURCE.Field2
            OR .. put more field comparison here that you want to sync
         THEN
            UPDATE
            SET TARGET.Field1 = SOURCE.Field1,
                TARGET.Field2 = SOURCE.Field2,
                //flag the target field as updated
                TARGET.IsUpdated = 1,
                TARGET.LastUpdatedOn = GETDATE()
            WHEN Not Matched 
            THEN
    INSERT(PrimaryKey, Field1, Field2, IsUpdated, LastUpdatedOn)
    VALUES(SOURCE.PrimaryKey, SOURCE.Field1, SOURCE.Field2, 1, GETDATE());

此時,您現在可以使用IsUpdated = 1查詢MySQL表,並將所有值推送到MYSQL數據庫。 我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM