通过Windows服务同步MySQL和MSSQL数据库

时间:2014-05-03 11:31:25

标签: c# mysql sql sql-server windows-services

我必须同步两个数据库的两个表,其中一个是MSSQL,另一个是MySQL。我必须通过Windows服务执行此操作。我目前已经创建了一个Windows服务,我目前添加到服务中的是:从MySQL数据库获取数据并将其插入数据适配器,我计划使用插入事务将数据移动到MSSQL数据库你能告诉我这个问题的最佳方法是什么,如果我现在正在做的事情是正确的,那么我第一次做这样的事情。

5 个答案:

答案 0 :(得分:0)

如果将mySql数据库添加为链接服务器(sp_addlinkedserver),那么我认为您可以在MS SQL数据库的存储过程中执行以下操作:

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

答案 1 :(得分:0)

嗯,可能有几种方法可以解决这个问题。你没有提到你的桌子的数量和大小,所需的同步频率,所以我的答案可能不是100%相关。无论如何,我的建议是:

  1. 每个表都应该有其他列 - SyncDate(TIMESTAMP),默认情况下为null。
  2. 在Windows服务中实现的同步逻辑会定期检查每个表是否有一些数据要通过执行这样的查询来同步(出于性能原因使用纯IDataReader):

    来自TEST_TABLE的SELECT *,其中SyncDate为空

  3. 如果上述语句返回数据,则:

    • 收集要插入的行包(例如500行)
    • 在目标数据库上开始事务并为收集的包执行insert语句(将列SyncDate设置为DateTime.Now)
    • 当insert完成时,在源db:
    • 中执行这样的语句

    UPDATE TEST_TABLE SET SyncDate = @ DateTime.Now ID_PRIMARY_KEY IN(从包中识别)

    • 提交交易
    • 收集另一个包并重复算法,直到DataReader提供数据
  4. 上述算法应适用于两个数据库

  5. 可能您的数据库有外键,因此您必须记住依赖表应按有效顺序同步
  6. 只要有可能,您就可以从多线程中受益

答案 2 :(得分:0)

如果你必须通过Windows服务这样做,我很好奇你是如何从MySQL接收数据的?什么是启动对服务的调用以及传入的数据的形式是什么?您是否正在进行更改,或者您是否正在刷新数据?

例如,如果您收到DataTable或其他类型的IEnumerable及其完整刷新,则可以使用SqlBulkCopy.WriteToServer()。这将是最快和最有效的。

汤姆

答案 3 :(得分:0)

对于这种工作,SQL Server Integration Services是可行的方法。

SSIS用于提取,转换和加载数据。 (ETL过程)

您可以为数据的每个转换步骤设计一个worklow,从MySQL到MSSQL。

然后,您创建一个作业并配置其计划,它将由SQL Server执行。

无需从头开发并且难以维护。

答案 4 :(得分:0)

如果您已经准备好将MySQL数据移动到SQL。我建议你把它们放在一个单独的表上并发出一个Merge命令来合并数据。确保您标记已更新的数据,以便现在可以将它们返回并推送到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数据库。我希望这会有所帮助。