SQL Server复制是我们常用的一个提高性能和可用性的功能,但这东东确实已存在很多不稳定因素,会造成复制功能的失效,今天就遇到了一个问题是由于SQL Server数据冲突造成的事务复制失败。解决这个问题可以重新初始化复制来保障两边的数据一致性。也可以选择跳过失败的事务,这样虽然可能会有部分数据不一致但如果能够确保这部分数据不是关键数据则可以使用这个方案。
跳过失败的事务需要用到两个SP,第一个是sp_helpsubscriptionerrors,用于查询具体是哪个事务造成了数据冲突,此存储过程在分发服务器的分发数据库中执行。
语法
sp_helpsubscriptionerrors [ @publisher = ] 'publisher' , [ @publisher_db = ] 'publisher_db' , [ @publication = ] 'publication' , [ @subscriber = ] 'subscriber' , [ @subscriber_db = ] 'subscriber_db'
在返回的表格中xact_seqno列就是我们要找的事务ID。
这时候就可以使用我们的第二个SP:sp_setsubscriptionxactseqno
语法
sp_setsubscriptionxactseqno [ @publisher = ] 'publisher' , [ @publisher_db = ] 'publisher_db' , [ @publication = ] 'publication' , [ @xact_seqno = ] xact_seqno
此存储过程在订阅服务器上对订阅数据库(业务数据库)执行。非 SQL Server 订阅服务器不支持该过程。
执行成功后,就可以跳过这个事务,复制就可以继续执行了。当然最好能够在复制修复后验证是否存在关键数据的缺失或不一致。