使用spid = -2在sql server 2008 R2上运行的进程

时间:2014-07-16 16:50:41

标签: c# sql sql-server-2008-r2

在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,

1 个答案:

答案 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