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

本文关键字:MSSQL 数据库 MySQL 同步 windows 服务 通过 | 更新日期: 2023-09-27 18:01:23

我必须同步两个数据库的2个表,其中一个是MSSQL,另一个是MySQL。我必须通过Windows服务来做这件事。我目前已经创建了一个Windows服务,我目前添加到该服务的是:从MySQL数据库获取数据并将其插入到数据适配器中,我计划使用插入事务将数据从该适配器移动到MSSQL数据库。你能告诉我解决这个问题的最好方法是什么吗?我现在所做的是否在正确的轨道上,这是我第一次做这样的事情。

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

可能有几种方法可以解决这个问题。您没有提到表的数量和大小,期望的同步频率,所以我的答案可能不是100%相关。总之,我的建议是:

  1. 每个表应该有额外的列- SyncDate (TIMESTAMP),默认为空。
  2. 在Windows Service中实现的同步逻辑定期检查每个表是否有一些数据需要同步,通过执行这样的查询(出于性能原因使用纯IDataReader):

    SELECT * from TEST_TABLE where SyncDate is null

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

    • 收集要插入的行包(例如500行)
    • 在目标数据库上开始事务,并为收集到的包执行插入语句(将列SyncDate的值设置为DateTime.Now)
    • 当插入完成时,在源数据库中执行如下语句:
    UPDATE TEST_TABLE SET SyncDate = @DateTime。现在where ID_PRIMARY_KEY IN (IDENTIFIRES FROM PACKAGE)

      <
    • 提交事务/gh>
    • 收集另一个包并重复算法,直到DataReader提供数据
  4. 以上算法应同时应用于两个数据库

  5. 可能你的数据库有外键,所以你必须记住从属表应该按照有效的顺序同步
  6. 只要有可能,你就可以从多线程中受益。

对于这种工作,SQL Server集成服务是一种选择。

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

你设计了一个工作流,从MySQL到MSSQL的每个转换步骤。

然后创建一个作业并配置它的调度,SQL Server将执行它。

不需要从头开始开发,也不需要维护。

如果您已经准备好将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数据库。

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

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

如果你必须通过Windows服务来做到这一点,我很好奇你是如何从MySQL接收数据的?是什么在初始化对服务的调用,数据以什么形式传入?是进行更改还是对数据进行几次刷新?

如果你收到一个DataTable或其他类型的IEnumerable,它是一个完整的刷新,例如,你可以使用SqlBulkCopy.WriteToServer()。那将是最快和最有效的。

汤姆