如何同步SQL Server数据库的两个(或n)复制过程?

时间:2010-06-08 07:29:27

标签: sql-server sql-server-2008 synchronization replication

通过标准事务复制更新了两个主数据库和两个只读副本。需要从两个只读数据库映射一些实体,假设A数据库包含订单而B数据库包含行。

Replication http://i46.tinypic.com/1tacsx.png

问题是复制到一个数据库可能会滞后于第二个数据库的复制,并且在映射时,R数据库将具有不一致的数据。例如。

我们在19:00和19:03用线存储了2个订单。映射过程从19:05开始,但到映射时刻数据库复制处理所有更改到19:03,但处理的B数据库复制只更改到19:00。映射后,我们将订购实体,订单截止时间为19:03,行截止时间为19:00。麻烦得到保证:)

在我的特定情况下,两个数据库都有时间模型,因此可以获取每个时间片的数据,但问题是确定最新复制的时间。

问题:如何同步多个数据库的复制过程以避免上述情况?或者,换句话说,如何比较每个数据库中的上次复制时间?

UPD:

我看到同步的唯一方法是不断地将时间戳写入每个数据库中的服务表,并检查复制服务器上的这些时间戳。这是可接受的解决方案

3 个答案:

答案 0 :(得分:1)

你做不到。您唯一的解决方案是只有一个主人。您永远不应该将应用程序拆分到不同的数据库中,因为即使没有复制已经存在问题。您无法将A和B 恢复为一致状态。数据库是您的恢复单位,不应将其拆分为单独的实体。

你最好的选择是两个回到绘图板并重新设计你的应用程序,它只在一个数据库中保持状态,就像所有应用程序一样。如果你无法做到这一点,那么你将不得不放弃复制品的一致性。

答案 1 :(得分:1)

看来,给定的任务无法在给定的约束条件下解决。 如果我理解正确,数据库和行的模式是常量。

所以,离开的变量:

  • 对数据库进行额外的“注入”
  • Temporal Tricks
  • 触发技巧
  • 更改的“后期绑定”,不及时复制

目前,我发现只有一个想法,似乎有效:

  1. 在“行”表上添加触发器,修改“订单”记录时间戳(last_line_time)
  2. 在副本中,等到Line with time,等于last_line_time出现。
    • 如果max(lines.line_time)> order.last_line_time比订单已过时
    • 如果max(lines.line_time)< order.last_line_time比行已过时
    • 如果max(lines.line_time)== order.last_line_time,那么一切正常,暂时:)
  3. 但是,如果不断修改Lines,并且Lines表副本总是落后,这种情况可能会失败进入无限循环。

答案 2 :(得分:0)

为什么不创建连接具有数据库A&中的适当状态的表的视图?数据库B在说数据库C,它将同步数据,然后复制它们?我认为这样你就可以拥有一致的数据。