【问题标题】:How to do cross-database information syncing?如何进行跨库信息同步?
【发布时间】:2011-06-04 08:30:38
【问题描述】:

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

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

【问题讨论】:

  • MySQL replication 是你需要的吗?
  • @Nemoden 不完全。尽管希望大多数数据采用相似的格式,但这些数据库的设计目的不同(人力资源、财务、互联网目录),因此我需要添加相当多的规则来确定哪些数据去往何处。如果它们足够相似,我想做一些数据库级别的东西,但是基于 sql server 的东西不会那么容易,部分原因是字段并不总是相同等,如果它在 php 中,我可以更改这些规则更容易,或者在记录尝试的信息更改时添加检查(例如发送电子邮件)。

标签: php mysql sql-server active-directory


【解决方案1】:

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

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

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

  • 可以立即删除记录。同步工具在队列中找到一个 id,验证它不再存在,因此它也将它从另一个数据库中删除
  • 自动解决子父依赖关系。新的父级将在其子级之前在队列中,而已删除的父级将在其子级之后。您可能会在交叉链接记录中发现唯一的问题,尽管延迟提交可能是解决这个问题的方法。
  • 所有表中都不需要额外的列。只有一个队列、一些辅助表和一个触发器,其中包含对要同步的每个表的单个函数调用。

很遗憾,我们还没有完全实施这个解决方案,所以我不能告诉你它是否会更好地工作,尽管测试表明确实如此。

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

【讨论】:

  • +1 谢谢,您的回答很有启发性。一个问题,您将如何监控您的程序在此队列方案中未进行的数据库中的更改?例如。另一个程序更改了数据库。您的程序中的队列如何知道发生了这种情况?
  • 需要同步的表都有触发器。这些触发器会在数据更改时自动调用,无论更改来自哪个源。因此,一旦触发器到位,您就无需在程序中执行任何其他操作。
猜你喜欢
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多