SQL Server和MySQL之间的单向同步


One way synchronization betwen SQL Server an MySQL

我正在尝试将MySQL表与SQL Server 2008中的表同步。我想要的是从SQL服务器到MySQL的同步。我已经将表从SQL Server转移到MySQL,现在我只需要PHP代码,它将在运行时自动更新表(检查更改、插入新行、删除不存在的行)。有人能帮我吗?

虽然我不完全相信这是一个好主意,但我理解这在某些用例中可能是必要的(见最后一段),因为我们不久前也有类似的需求。

这非常有效:

在发送端(无论是什么,在您的情况下是SQL服务器)

  • 创建一个具有id(pk)、表名、表pk、操作、数据文本字段的表"changelog"
  • 在相关表上创建触发器,在操作成功后将更改写入变更日志表
  • 让您的代码将变更日志表的内容传输到发送端
  • 如果成功,请将其从变更日志表中删除(注意:此处可能存在竞争条件!)

在接收端(无论是什么,在您的情况下是MySQL)

  • 接收变更日志数据
  • 解析它
  • 对数据库运行更改
  • 如果有效,发送确认

这个方案运行得很好,即使在两个只能在它们之间"对话"HTTP的主机之间也是如此——它也很健壮,因为丢失的连接(或接收端重新启动)只会缓冲发送端变更日志表中的更改,并在重新建立连接时将其清除。

可能有用的是ETL工具。SSIS是为SQL Server设计的。也许可以使用它来帮助引入您想要的数据,但我以前从未在MySQL中使用过它。根据这篇帖子[http://blogs.msdn.com/b/mattm/archive/2008/03/03/connecting-to-mysql-from-ssis.aspx]这实际上是可能的。

另一个可以帮助你的帖子:http://www.packtpub.com/article/mysql-data-transfer-using-sql-server-integration-services-ssis

不幸的是,上一篇文章描述了从MySQL到SQL Server的过程,这不是您想要的方向。也许可以用另一种方式让它工作,但您可能需要找到一个适用于MySQL的ETL工具。尽管谷歌快速搜索显示,我没有意识到有任何异常http://www.benetl.net/,但我不能担保。

我认为PHP与此无关。

您可以使用各种决策,例如:

  • SSIS
  • DTS包
  • 链接的服务器
  • 触发器+同步队列表
  • 各种第三方ETL工具

我建议您在每个表中都有一个时间戳列,每次插入或更新时,都要更新每个受影响行的时间戳值。然后,对所有表进行迭代,检查时间戳是否比目标数据库中的时间戳新。如果更新,请检查是否必须插入或更新。观察1:注意物理删除,因为行是从源数据库中删除的,而您必须在服务器数据库中也这样做。您可以解决此问题,避免物理删除或将每次删除都记录在带有时间戳的表中。类似于以下内容:DeletedRows=(id,表名称,pk_column,pk_cocolumn_value,时间戳)因此,您必须读取DeletedRows表的所有新行,并在服务器上使用table_name、pk_column和pk_column_value执行删除。观察2:注意FK,因为在与另一个表相关的表中插入数据可能会失败。应在数据同步之前停用每个FK。