【问题标题】:How to synchronize two (or n) replication processes for SQL Server databases?如何同步 SQL Server 数据库的两个(或 n 个)复制进程?
【发布时间】:2011-03-01 01:01:04
【问题描述】:

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

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

我们在 19:00 和 19:03 存储了 2 个订单。映射过程从 19:05 开始,但是到映射的时刻 A 数据库复制处理了到 19:03 的所有更改,而 B 数据库复制处理了直到 19:00 的所有更改。映射后,我们将拥有截至 19:03 的订单和截至 19:00 的行的订单实体。麻烦是有保证的:)

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

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

更新:

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

【问题讨论】:

  • 鉴于您的 cmets 此处和下方,定期在两个数据库中插入一个新的日期时间,将其复制到共享数据库,并且仅在这两个日期之前提取数据似乎是可行的方法。看起来您回答了自己的问题...

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


【解决方案1】:

似乎,给定的任务无法在给定的约束条件下解决。 如果我理解正确,数据库的数量和行的架构是常量。

那么,剩下的变量:

  • 对数据库的额外“注入”
  • 临时技巧
  • 触发技巧
  • 未及时复制的更改的“后期绑定”

目前,我只发现了一个似乎可行的想法:

  1. 在“Lines”表上添加触发器,以修改“Order”记录时间戳(last_line_time)
  2. 在副本中,等到一个带有时间的 Line,等于 last_line_time 出现。
    • 如果 max(lines.line_time) > order.last_line_time 比 order 过时
    • 如果 max(lines.line_time)
    • 如果 max(lines.line_time) == order.last_line_time 比现在一切正常 :)

但是,如果 Lines 不断被修改,并且 Lines 表副本总是滞后,这种情况可能会陷入无限循环。

【讨论】:

  • 这种方法需要从数据库和应用程序两方面进行重大开发。但是它解决了问题,谢谢。
【解决方案2】:

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

您最好的选择是两个返回绘图板并重新设计您的应用程序,使其仅将状态保留在一个数据库中,就像所有应用程序一样。如果你不能做到这一点,那么你将不得不放弃副本的一致性。

【讨论】:

  • 我知道有很多问题,但很遗憾我无法重新设计系统,因为它已经运行了大约 10 年,并且有大约 1000 名开发人员围绕它开发应用程序。
  • 另一种选择是您是否可以进行逻辑复制(操作),而不是物理复制(表)。例如。在主服务器上,事务在 A 中写入发票标题,在 B 中写入发票详细信息。您无需复制两个插入,而是将使用给定标题和详细信息写入发票的操作复制为一个单一的原子操作。如果操作是通过存储过程完成的,复制可以做到这一点:它可以复制 invocation 而不是它的效果。其他解决方案可能是发送 SSB 消息。但它很难实现和维护。
  • 你又在谈论我无法影响的事情。我已经有大量的应用程序写入主数据库和复制数据库,我必须从中读取。我唯一能做的就是注入某种同步机制。至于 SSB 消息,它有什么帮助?仍然有可能出现数据在master,发送SSM消息,但是replica中数据不可用的情况。
【解决方案3】:

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

【讨论】:

  • 好点。但是源数据库的复制旨在避免在获取大量数据时产生巨大的负载。如果您的情况 db A 和 db b 仍然处于负载状态。 (我想强调这不是我的决定,但这是我必须忍受的)
  • 也许您可以选择“索引”视图,这可能会相对减少 db A 和 db B 的负载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多