停止在SQL Server中复制大型事务

o29*_*908 5 sql sql-server replication sql-server-2008 transactional-replication

我有一个问题,试图阻止发布者分发给订阅者的大型交易.假设某人不小心更新了包含5000万条记录的表中的每条记录,然后在意识到错误后,将所有记录设置回来.在这种情况下,更改将在事务复制设置中分发给两个订户.在系统上,它表示将向用户复制2天,但是克服这个问题的最佳方法是什么?

我已经看到它可能并且实际上很容易使用事务跳过命令xact_seqno,sp_helpsubscriptionerrors并且sp_setsubscriptionxactseqno.但是,如果将其用于正在分发的交易,会发生什么?有什么需要停止的吗?

如果这不是解决问题的最佳方法,那会是什么?

小智 0

不过,我还没有特别测试过这一点:停止正在进行的事务本身并不一定会导致问题,并且会回滚 - 任何类型的事务,包括发布者在订阅者上复制的事务。这是因为 ACID 属性始终适用于事务,具体而言,A原子- 事务中的所有内容要么发生,要么什么都不发生。因此,停止或失败的事务将完全回滚。

我不知道有什么其他方法可以阻止事务被复制,但是请sp_setsubscriptionxactseqno谨慎使用,您不仅需要确保 LSN 正确,而且无论发生什么,都意味着您不再是发布者和订阅者真正同步。在实践中这可能并不重要,但它应该是一个考虑因素。

如果您还没有看过Technet / MSDN(或多或少同一篇文章取决于您是否更喜欢 devNet 的 Tnet),那么MSDN 上的这篇博客文章将会有所帮助。NBsp_setsubscriptionxactseqno需要在订阅服务器上运行(以及您希望它跳过的每个订阅服务器)。

在没有其他信息的情况下,我建议的替代方案就是让它运行。这可能并不理想,但它是最安全且工作量最少的。该系统是否是任务关键型且依赖时间的系统,这两天会导致重大问题?

最后,作为一般建议,如果您不确定该怎么做,请将决定权交给您的经理或其他上级。提出选项、涉及的工作和风险/影响(包括什么也不做的选项),并责怪(巧妙地且在办公室政治上适当的)制造最初“事故”的人(除非那是你,那么也许你不这样做)不想告诉上级)。