Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何同步SQL Server数据库的两个(或n个)复制进程?_Sql Server_Sql Server 2008_Synchronization_Replication - Fatal编程技术网

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

Sql server 如何同步SQL Server数据库的两个(或n个)复制进程?,sql-server,sql-server-2008,synchronization,replication,Sql Server,Sql Server 2008,Synchronization,Replication,有两个主数据库和两个只读副本由标准事务复制更新。需要从两个只读数据库映射一些实体,假设A数据库包含订单,B数据库包含行 问题在于,对一个数据库的复制可能会滞后于对第二个数据库的复制,并且在映射R数据库时,会有不一致的数据。比如说 我们在19:00和19:03储存了两份订单,订单行为。映射过程在19:05开始,但到映射时,数据库复制处理了19:03之前的所有更改,而B数据库复制只处理了19:00之前的更改。映射后,我们将有订单实体,订单截止19:03,行截止19:00。问题是肯定的:) 在我的

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

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

我们在19:00和19:03储存了两份订单,订单行为。映射过程在19:05开始,但到映射时,数据库复制处理了19:03之前的所有更改,而B数据库复制只处理了19:00之前的更改。映射后,我们将有订单实体,订单截止19:03,行截止19:00。问题是肯定的:)

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

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

UPD:


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

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


您最好的选择是:返回绘图板,重新设计应用程序,使其只在一个数据库中保存状态,就像所有应用程序应该做的那样。如果无法实现这一点,则必须放弃副本的一致性

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

所以,剩下的变量是:

  • 数据库的附加“注入”
  • 时态技巧
  • 触发技巧
  • 未及时复制的更改的“后期绑定”
目前,我只发现了一个似乎有效的想法:

  • 在“行”表上添加触发器,以修改“订单”记录时间戳(最后一行时间)
  • 在复制中,等待一行时间等于最后一行出现的时间。
    • 如果max(line.line\u time)>order.last\u line\u time,则订单已过时
    • 如果max(lines.line\u time)
    • 如果max(lines.line\u time)=order.last\u line\u time比一切正常,目前:)

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

    为什么不从数据库A和数据库B(例如数据库C中的数据库A和数据库B)创建视图,将具有适当状态的表连接起来,然后复制它们?我认为这样你会得到一致的数据

    我知道存在很多问题,但不幸的是,我无法重新设计该系统,因为它已经存在了大约10年,大约有1000名开发人员围绕着它开发应用程序。一种替代方法是,如果您可以进行逻辑复制(操作),而不是物理复制(表)。例如,在主服务器上,事务在a中写入发票标题,在B中写入发票详细信息。您不复制这两个插入,而是将使用给定标题和详细信息写入发票的操作复制为单个原子操作。如果操作是通过存储过程完成的,则复制可以做到这一点:它可以复制调用,而不是其效果。另一种解决方案是发送SSB消息。但这很难实施和维持。你再说一遍,你说的是我不能影响的事情。我已经在主数据库和复制数据库中编写了大量的应用程序,我必须从中阅读。我唯一能做的就是注入某种同步机制。至于SSB消息,它有什么帮助?当数据在主数据中,SSM消息已发送,但数据在副本中不可用时,仍然存在这种情况。这种方法需要从数据库和应用程序两方面进行重大开发。但是它解决了这个问题,谢谢。根据您在这里和下面的评论,定期在两个数据库中插入一个新的日期时间,将其复制到共享数据库中,并且只在这两个日期之前提取数据似乎是可行的。看起来你回答了你自己的问题…很好。但是源数据库的复制是为了在获取大量数据时避免巨大的负载。在您的情况下,db A和db b仍处于负载状态。(我想强调这不是我的决定,但这是我必须忍受的)也许你可以选择“索引”视图,这样可以相对减少db A和db B的负载。