SQL Server 复制

Der*_*rny 6 replication sql-server sql-server-2012 transactional-replication

我们遇到了复制问题,其中在 3300 万行的表上进行了大型(750 万行)更新。复制将其转换为 750 万条单独的更新语句。当我的警报通知我我们的出版物低于我们的门槛时,我开始检查这个问题。

我发现更新已被执行,并且需要几天时间来仔细阅读这些更新语句。所以我决定看看我们是否可以跳过它试图处理的那些记录。使用系统表和存储过程,我能够确定执行更新的时间段。一旦找到最后一个xact_seqno,我就停止分发代理,并手动更新订阅者数据库。然后我执行sp_setsubscriptionxactseqno, 跳过所有这 750 万笔交易。当我启动分发代理时,它似乎工作正常并且能够处理剩余的事务。

为了更好地衡量,我使用 Redgate 的数据比较来查看数据是否混乱,但我丢失了大约 24 条记录(最初可能没有,因为我没有设置它)。

我的问题是这是修复它的正确方法吗?你怎么总是保证得到下一个Xact_seqno?您是按Xact_Seqnoentry_time 或 entry_time订购交易?

Hpk*_*Hpk 1

另一种方法是从发布中删除该文章并重新添加,从而对表生成新的快照。这样,订阅者中是否存在正确的数据就毫无疑问了。

为此,您需要确保将发布属性设置为 FALSE allow_anonymous and immediate_sync- 如果其中任何一个为 true,则在删除并重新添加表而不仅仅是表时将拍摄数据库快照。

检查sp_helppublication针对发行版的运行情况。

要更改其中任一设置为 1 的情况:

EXEC sp_changepublication
@publication = 'REP_P', --Enter your publication_name
@property = 'allow_anonymous' ,
@value = 'false'
GO
EXEC sp_changepublication
@publication = 'REP_P', --Enter your publication name
@property = 'immediate_sync' , 
@value = 'false' 
GO 
Run Code Online (Sandbox Code Playgroud)

我已经对此进行了测试,它在我的环境中有效,但强烈建议您先在实验室中执行此操作。