Process/SPID被自己阻塞了,如何clear/kill不重启Sql服务器

Process/SPID is being blocked by itself, how to clear/kill without restarting Sql Server

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

现在,进程处于挂起状态。它还声明在查询 sp_who2.

后它被自己阻止了

在activity监视器中,这里是waitresource信息:

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

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

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

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

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

编辑:来自 activity 监视器的更多信息: 命令 = 'KILLED/ROLLBACK' 任务状态 = 'SUSPENDED'

嗯,由于 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 中,您必须等到事务回滚。之后,该进程将被杀死并删除。你不能做别的,因为必须给交易安全。

这可能我经历过很多次。当您终止一个大型 INSERT/UDPATE/DELETE 语句时,可能需要数小时才能从该状态恢复(如果它曾经恢复)。

运行 使用 statusonly 杀死

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

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

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