在Sql Server 2008 R2 SP2上,我无法删除数据库。 错误是:数据库正在使用中。
查看活动监视器,我什么也看不见
运行DBCC OPENTRAN我看到一个带有SPID的活动事务:13s。因为“我不能杀人”而无法杀人。似乎是一个系统交易。
这是命令DBCC opentran的结果:
Oldest active transaction:
SPID (server process ID): 35s
UID (user ID) : -1
Name : offline index build
LSN : (4082851:348:145)
Start time : Jul 25 2014 4:06:51:260PM
SID : 0x0
syslockinfo lokk的内容如下:
rsc_text rsc_bin rsc_valblk rsc_dbid rsc_indid rsc_objid rsc_type rsc_flag req_mode req_status req_refcnt req_cryrefcnt req_lifetime req_spid req_ecid req_ownertype req_transactionID req_transactionUOW
-------------------------------- ---------------------------------- ---------------------------------- -------- --------- ----------- -------- -------- -------- ---------- ---------- ------------- ------------ ----------- ----------- ------------- -------------------- ------------------------------------
0x00000000000000000000000016000200 0x00000000000000000000000000000000 22 0 0 2 0 3 1 1 0 0 -2 0 4 0 00000000-0000-0000-0000-000000000000
0x00000000000000000000000016000200 0x00000000000000000000000000000000 22 0 0 2 0 3 1 1 0 0 122 0 4 0 00000000-0000-0000-0000-000000000000
如果我使用其他namre备份和恢复该数据库,我会遇到同样的问题。所以我认为这与未经授权的交易有关。当然无法缩小不断增长和增长的日志。
每次我们使用使用Microsoft.SqlServer.Management.Smo<的C#客户端应用程序时,似乎都会出现此问题。 - 这是一个不好的假设!!!
事实上,我们采取备份的女巫的源数据库已经包含了spid = -2的trasaction。所以它对C#客户端没有任何帮助。 问题是我们如何摆脱源数据库中的那个-2事务?
任何帮助理解这个问题都会很棒!
THX,
答案 0 :(得分:4)
SPID -2是孤立的DTC交易。
您可以使用以下查询找到有关SPID-2的信息(UOW编号或工作单元编号):
select req_transactionUOW
from master..syslockinfo
where req_spid = -2
你不能正常杀死这种过程,所以你需要UOW id才能这样做。
以下命令可用于终止GUID号为上述查询找到的工作单位ID的过程。
KILL 'C2645B98-2962-4c3e-83AC-8A5626A0C0A3'
下面是一些关于sql server中负spid id的有趣读物。
我在这篇原帖中找到了这个帖子:http://social.msdn.microsoft.com/forums/sqlserver/en-US/c856fb4b-9c61-4180-a172-f6ceed5b0c45/blocking-caused-by-2-spid
关于spid -2还有一些额外的信息,我在下面给你阅读。
当用户触发交易时,SPID将转换为MSDTC() 当数据被复制一个或多个时,事务使用数据 服务器,所以MSDTC必须协调,所以这将由SQL db负责 发动机。所以在这种类型的活动中出现了一些问题 复制服务器上的任何停电MSDTC必须遵循ACID 规则如果MSDTC能够从这种情况中恢复并标记 SPID到Orpahned SPID,因此您可以看到SPID更改 +到-ve数字像-2(在这种情况下)。
你看到阻止的原因是由于它仍然持有一些 像它可能是页面/行或任何其他对象的资源。所以 显然,这将阻止其他spid尝试的其他spid 访问相同...
所以Kill命令不适用于-ve spid因此你必须这样做 为spid选择UNIT OF WORK(UOW)id然后在它上面使用kill .. 请注意,你不能停止这种类型的活动...... 来自:Rama Udaya.K