如何修复 MS SQL Server 上混乱的复制

Tal*_*Guy 11 replication sql-server sql-server-2012 troubleshooting transactional-replication

我从备份中恢复了一个数据库。数据库使用复制发布到不同的服务器。假设数据库还原会破坏复制,我尝试删除复制并重新创建它(我们有一个脚本可以从头开始重新创建它)。我不确定我到底做了什么,但现在它处于完全混乱的状态,我无法修复它。

首先,我尝试取消订阅(在发布服务器上):

EXEC sp_dropsubscription @publication = 'PublicationName', @article = N'all', @subscriber = 'SubscriberServerName'
Run Code Online (Sandbox Code Playgroud)

这似乎有效。SELECT * FROM syssubscriptions显示没有结果。查看订阅服务器,SSMS > {SubscriberServer} > Replication > Local Subscriptions - 订阅不在那里。

然后我尝试删除该出版物。SSMS > {Server} > 复制 > 本地发布 > {PublicationName} > 删除。这给出了以下错误消息:

Could not delete publication 'PublicationName'.
Could not drop article. A subscription exists on it.
Changed database context to 'DatabaseName'. (Microsoft SQL Server, Error: 14046)
Run Code Online (Sandbox Code Playgroud)

好的,所以我尝试删除这些文章:

EXEC sp_droparticle @publication = 'PublicationName', @article = N'all'
Run Code Online (Sandbox Code Playgroud)

并收到此错误:

Invalidated the existing snapshot of the publication. Run the Snapshot Agent again to generate a new snapshot.
Msg 14046, Level 16, State 1, Procedure sp_MSdrop_article, Line 75
Could not drop article. A subscription exists on it.
Run Code Online (Sandbox Code Playgroud)

好的,所以我尝试启动 Snapshot Agent 并收到此内部 SQL 异常:

The SQL command 'sp_MSactivate_auto_sub' had returned fewer rows than expected by the replication agent.
Run Code Online (Sandbox Code Playgroud)

所以我尝试了另一种删除文章的方法,DELETE FROM sysarticles. 这似乎有效 - 我现在已经删除了这些文章,但是当我尝试删除该出版物时,我仍然遇到相同的“无法删除该出版物,因为该出版物至少存在一个订阅”错误。

我也重新启动了 SQL Server - 没有帮助。

我不知道这里发生了什么,我该如何解决?

顺便说一句,这就是当您将数据库的密钥提供给一个知道足够危险的软件开发人员时会发生的情况。幸运的是,这不是生产环境......

Tal*_*Guy 10

域名注册地址:

似乎禁用和重新启用复制可能解决了这个问题:

exec sp_replicationdboption @dbname = N'DatabaseName', @optname = N'publish', @value = N'false'
exec sp_replicationdboption @dbname = N'DatabaseName', @optname = N'publish', @value = N'true'
Run Code Online (Sandbox Code Playgroud)

我想这相当于将其关闭然后再次打开......

更长的版本:

一位同事试图修复它。他尝试了几件事,但没有走多远。他在放弃之前所做的一项更改是禁用复制。

然后我尝试了科迪的建议。sp_dropsubscription 命令抱怨不存在订阅。所以我尝试了 sp_droppublication 命令。这抱怨没有在数据库上启用复制。所以我启用它并重新运行命令。这次它抱怨该出版物不存在。我刷新了 SSMS 中的 Local Publications 节点,果然它已经消失了。我运行了复制设置脚本,生成了一个新快照,现在一切正常。喜悦!

我不能 100% 确定禁用和启用复制实际上解决了问题,但如果复制搞砸了,这绝对值得尝试。


小智 5

我把复制弄得一团糟,用这个解决了

DECLARE @subscriptionDB AS sysname
SET @subscriptionDB = N'DBName'

-- Remove replication objects from a subscription database (if necessary).
USE master
EXEC sp_removedbreplication @subscriptionDB
GO 
Run Code Online (Sandbox Code Playgroud)

那和:

exec sp_cleanupdbreplication
Run Code Online (Sandbox Code Playgroud)

是清理混乱的复制品时的救星。