通过windows服务同步MySQL和MSSQL数据库
本文关键字:MSSQL 数据库 MySQL 同步 windows 服务 通过 | 更新日期: 2023-09-27 18:01:23
我必须同步两个数据库的2个表,其中一个是MSSQL,另一个是MySQL。我必须通过Windows服务来做这件事。我目前已经创建了一个Windows服务,我目前添加到该服务的是:从MySQL数据库获取数据并将其插入到数据适配器中,我计划使用插入事务将数据从该适配器移动到MSSQL数据库。你能告诉我解决这个问题的最好方法是什么吗?我现在所做的是否在正确的轨道上,这是我第一次做这样的事情。
可能有几种方法可以解决这个问题。您没有提到表的数量和大小,期望的同步频率,所以我的答案可能不是100%相关。总之,我的建议是:
- 每个表应该有额外的列- SyncDate (TIMESTAMP),默认为空。
在Windows Service中实现的同步逻辑定期检查每个表是否有一些数据需要同步,通过执行这样的查询(出于性能原因使用纯IDataReader):
SELECT * from TEST_TABLE where SyncDate is null
如果上述语句返回数据则:
- 收集要插入的行包(例如500行)
- 在目标数据库上开始事务,并为收集到的包执行插入语句(将列SyncDate的值设置为DateTime.Now)
- 当插入完成时,在源数据库中执行如下语句:
- <
- 提交事务/gh>
- 收集另一个包并重复算法,直到DataReader提供数据
以上算法应同时应用于两个数据库
- 可能你的数据库有外键,所以你必须记住从属表应该按照有效的顺序同步 只要有可能,你就可以从多线程中受益。
对于这种工作,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()。那将是最快和最有效的。
汤姆