SQL Server和MySQL之间的单向同步

时间:2012-02-09 09:27:00

标签: php mysql sql-server synchronization

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

4 个答案:

答案 0 :(得分:2)

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

这很有效:

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

  • 创建一个表'changelog',其中包含id(pk),tablename,tablepk,action,数据文本字段
  • 在操作成功后将更改写入changelog表的相关表上创建触发器
  • 让您的代码将changelog表的内容发送到发送方
  • 如果成功,请将其从更改日志表中删除(介意:此处可能存在争用条件!)

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

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

这个方案工作得很好,即使在两个主机之间只能“对话”它们之间的HTTP - 它也非常强大,因为丢失的连接(或接收方重启)只会缓冲发送端的变化更改日志表,在重新建立连接时清除它。

答案 1 :(得分:1)

可能有用的是ETL工具。专为SQL Server设计的是SSIS。有可能使用它来帮助引入您想要的数据,但我以前从未将它用于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工具。虽然快速的Google搜索显示http://www.benetl.net/,但我并不知道有任何偏见,但我无法保证。

答案 2 :(得分:1)

我认为PHP在这里无关。

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

  • SSIS
  • DTS套餐
  • 已关联的服务器
  • 触发器+同步队列表
  • 各种第三方ETL工具
  • ...

答案 3 :(得分:1)

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