仅杀死SQL Server中的用户进程

时间:2017-08-23 15:22:12

标签: sql-server sql-server-2014

我们让用户忘记关闭使用我们的SQL 2014数据库的访问查询。发生这种情况时,它会阻止他们访问的表重建过夜。有没有办法杀死这些用户而不是杀死系统进程。根据我的阅读,系统流程不仅限于SPID> 50。

4 个答案:

答案 0 :(得分:2)

基于spid>=50杀死用户流程似乎不可靠。

来自Adam Machanic:Smashing a DMV Myth: session_id > 50 == User Process

  

最近在MVP邮件列表上的对话显示,这个神奇的数字虽然可能曾经是合法的过滤器,但在SQL Server 2005或SQL Server 2008中使用肯定是不安全的。有几个系统功能可以 - 并且将会 - 使用会话ID大于50,因为没有足够的空间。

示例包括:

  • 使用软NUMA的大型服务器,因为每个NUMA节点有一个检查点和惰性写入程序线程
  • 在大型服务器上再次(尤其是)更新异步统计信息 数据库镜像,尤其是涉及大量数据库时
  • 当使用大量激活任务时,Service Broker激活

也可能有其他情况。 重点是,数字50不再是过滤掉系统会话ID的有效方法。

所以你的选择是

SELECT *
FROM sys.dm_exec_sessions
WHERE
    is_user_process = 1

SELECT *
FROM sys.sysprocesses
WHERE
    hostprocess > ''

您可以使用上面的查询来获取除系统之外的spid / session,并使用kill命令来终止它们

答案 1 :(得分:0)

我认为应该可以使用sp_who和KILL,从sp_who查看登录名,主机名等

答案 2 :(得分:0)

  

我们让用户忘记关闭使用我们的访问查询   SQL 2014数据库。当发生这种情况时,它会阻止它们的表   从重建过夜进入。

您可以在开始维护之前将数据库置于single user模式(立即回滚),然后置于multi user。将回滚所有用户事务。

答案 3 :(得分:0)

此存储过程可以正常工作并终止挂起访问查询,并且不会终止系统进程。

DECLARE @v_spid INT
DECLARE c_Users CURSOR
FAST_FORWARD FOR
SELECT SPID
FROM master..sysprocesses (NOLOCK)
WHERE spid>50 
AND status='sleeping' 
AND DATEDIFF(mi,last_batch,GETDATE())>=60
AND spid<>@@spid


OPEN c_Users
FETCH NEXT FROM c_Users INTO @v_spid
WHILE (@@FETCH_STATUS=0)
BEGIN
PRINT 'KILLing '+CONVERT(VARCHAR,@v_spid)+'...'
EXEC('KILL '+@v_spid)
FETCH NEXT FROM c_Users INTO @v_spid
END

CLOSE c_Users
DEALLOCATE c_Users
相关问题