5

我们有一个运行了 4 个小时的进程。因为运行时间太长,导致数据库出现其他问题,所以决定杀掉这个进程。

现在,该进程处于挂起状态。它还声明它在查询 sp_who2 后被自己阻止。

在活动监视器中,这是 waitresource 信息:

objectlock lockPartition=0 objid=xxx subresource=FULL dbid=2 id=lockyyyy mode=X associatedObjectid=xxx

您会注意到 objid 和 associatedObjectId 是相同的值。

查询 sys.objects 表显示该对象 ID 没有结果。

Sql Server 是否正在等待一个不再存在的对象的锁定?如何在不重新启动 Sql Server 的情况下摆脱这个过程?(我们的 DBA 没有响应帮助请求)。

请记住,这是一个测试环境,但它正在停止所有开发/测试,因为我们无法将任何更改部署到我们的数据库,因为其中一项更改正在影响进程正在访问的对象之一。

编辑:来自活动监视器的更多信息:Command = 'KILLED/ROLLBACK' TASK STATE = 'SUSPENDED'

4

2 回答 2

2

我经历过这可能的时间。当您终止大型 INSERT/UDPATE/DELETE 语句时,可能需要数小时才能从该状态恢复(如果它确实恢复)。

使用 statusonly 运行 kill <spid>。

它将为您提供 ROLLBACK 过程的百分比和估计等待时间。

有时它会说 0% 或 100% 和 0 估计时间。如果你有耐心,它最终可能会恢复。如果重新启动服务器,回滚过程将离线完成,数据库将显示 IN RECOVERY 状态,通常比等待服务器自行恢复要快。

请注意,在恢复过程结束之前,用户将无法使用数据库,但如果处于 KILLED/ROLLBACK 状态的 SPID 正在锁定其他进程,则可以选择重新启动。

于 2016-02-20T00:29:27.423 回答
1

好吧,这似乎是由于 tempdb 内部的并行处理而被锁定的。

kill [processid]有权限可以试试吗?

另一种方法是通过以下方式获取更详细的过程信息:

SELECT * FROM sys.sysprocesses WHERE spid = YOURSPID

当进程在 DB:2 中运行时,试试这个:

SELECT * FROM tempdb.sys.all_objects WHERE object_id = OBJECTID

正如我所看到的,您已经编辑了您的问题。如果 Spid 处于 KILLED/ROLLBACK 状态,则必须等到事务回滚。之后,该进程将被终止并删除。您不能做任何其他事情,因为必须提供交易安全性。

于 2015-06-17T13:21:30.657 回答