如何进行跨数据库信息同步?

时间:2011-06-04 08:30:38

标签: php mysql sql-server active-directory

我正在设计一个目录,其中多个来源中的数据在更改或更新时必须覆盖其他来源中的数据。一些数据库是MySQL,SQL Server,一些信息将是AD / LDAP。

我的问题是:这种类型的数据库传播是否有设计模式,以减少流量并防止错误?此项目也将使用PHP,因此如果有人知道我可以适应的类似开源项目,那也会很好。某些数据库之间可能需要有一些逻辑。

1 个答案:

答案 0 :(得分:1)

您需要一些方法来标记要同步的记录。我们使用这样的系统,其中每个要同步的表都有一个保持同步状态的列。修改记录时,它也会修改其状态(在触发器中),同步工具每隔几分钟就会查询修改过的记录。

缺点是您需要大量代码才能正确处理此问题,尤其是因为您无法直接删除记录。同步工具首先需要知道并需要执行实际删除。除此之外,很难以这种方式建立一个好的队列,所以如果记录在父母之前同步,你就会收到错误。每个必须同步的表都需要一个额外的列。

所以现在有一个新的解决方案即将实施。此解决方案为队列使用单独的表。该队列包含指向其他表中记录的指针(主键值和对表名/字段名的引用)。此队列现在是唯一用于监视更改的表,因此所有表需要执行的是实现单个触发器,该触发器将已修改的记录标记为队列中已修改的记录。因为它是单独表中的单个队列,所以这为我前面提到的问题添加了解决方案:

  • 可以立即删除记录。同步工具在队列中找到一个id,验证它不再存在,因此它也会从其他数据库中删除它
  • 自动解决子父级依赖项。新的父级将在其子级之前处于队列中,并且已删除的父级将位于其子级之后。您可以在交叉链接记录中找到唯一的问题,尽管延迟提交可能是解决方案。
  • 不需要在所有表格中添加额外的列。只有一个队列,一些帮助程序表和一个包含单个函数调用的触发器才能同步每个表。

不幸的是我们还没有完全实现这个解决方案,所以我不能告诉你它是否会更好地工作,尽管测试肯定是这样的。

请注意,此系统会对记录进行一对一的复制。我认为这也是最好的方法。复制数据,然后(之后)在目标服务器上处理它。我不认为在复制数据时处理数据是个好主意。如果出现任何问题,您将无法调试和恢复/重新计算数据。