为什么SQL Server不允许在配置后完全删除分发服务器?

时间:2012-04-17 14:41:23

标签: sql-server sql-server-2008 replication distribution database-replication

我使用向导和T-SQL在SQL Server 2008中配置了一个分发,但在我想要删除它之后使用向导(右键单击复制并选择“禁用发布和分发...”)或执行以下命令有和没有参数:

exec sp_dropdistributor @no_checks = 1 -- no new results with @ignore_distributor = 1

将出现此错误:

  

Msq 21122,Level 16,State 1,Procedure sp_dropdistributiondb Line 124   不能删除分发数据库'lobloblob',因为它是   目前正在使用中。

我没有发布任何内容,没有配置任何订阅但是给出了这个错误 我该怎么办?

3 个答案:

答案 0 :(得分:8)

试试这个:

  

SELECT spid FROM sys.sysprocesses WHERE dbid = db_id('distribution')

杀死spid并再试一次。现在应该可以了。

答案 1 :(得分:3)

我使用了以下脚本:

SELECT spid FROM sys.sysprocesses WHERE dbid = db_id('distribution')

并发现当前会话的session_id(包含分发配置脚本)不允许禁用分发,因此我建议此脚本终止运行spid以丢弃分发:

use [master]
declare @spid varchar(10)
select @spid=spid from sys.sysprocesses where dbid = DB_ID('distribution')

while @@ROWCOUNTS <> 0
    exec ('KILL ' + @spid)

exec sp_dropdistributor @no_checks = 1

答案 2 :(得分:1)

我的猜测是分发清理工作导致问题。但是,要检查,准备在SSMS中的一个窗口中执行sp_dropdistributor并记下窗口的session_id。在一秒钟内,准备运行select session_id from sys.dm_os_waiting_tasks where blocked_session_id = <spid from window 1>。回到窗口1,运行proc然后切换回窗口2并运行select。它会告诉你阻止数据库丢弃的会话的session_ids。