我们如何在SQL Server 2012中自动终止或终止挂起的任务?当我运行sp_who2
时,它会显示Suspended
状态下的许多进程。
我想知道有没有办法可以自动终止或终止暂停的进程/任务而不是手动执行。
我知道如何手动杀死SPID
,但我想要一些可以在规定的时间后自动杀死这些任务的东西。
任何帮助将不胜感激。
答案 0 :(得分:2)
这是一个简单的代码段,其中显示所有已暂停的SQL任务,并生成脚本将其全部杀死。
DECLARE @sql NVARCHAR(max) = ''
SELECT @sql = @sql + 'kill ' + cast(session_id as nvarchar(30)) + ';'
-- select *
FROM sys.dm_exec_requests
WHERE status = 'suspended'
--and database_id = DB_ID('master')
--and user_id = USER_ID('sa')
print @sql
--EXEC(@sql)
要在以下行中按数据库取消注释添加过滤器并更改数据库名称
and database_id = DB_ID('master')
您还可以按运行暂停查询的数据库用户对其进行过滤
and user_id = USER_ID('sa')
要自动执行该生成的脚本,请仅取消最后一行的注释
EXEC(@sql)
应该适用于所有SQL Server版本。在Microsoft SQL Server 2008 R2及更高版本上进行了测试
答案 1 :(得分:1)
要做到这一点,你应该:
查询特殊DMV以使PSID处于SUSPENDED状态:
SELECT * FROM sys.dm_exec_requests WHERE status ='suspended'
使用例如光标在该结果集上逐一杀死它们
获取该脚本并将其填入数据库作业;安排工作定期运行
但是,如果您这样做,您应该记住,当他尝试使用的资源被释放/解锁时,暂停的查询可以再次开始运行。如果该查询在例如存储过程在没有事务的情况下修改数据,那么你的kill-automatization可能会因为中断这样的进程而严重搞乱。
答案 2 :(得分:0)
我在这里写了一个样本:
DECLARE @sql NVARCHAR(max) = ''
SELECT @sql = CONCAT(@sql, 'kill ' , session_id, CHAR(13))
FROM sys.dm_exec_requests
WHERE status = 'suspended'
EXEC(@sql)
答案 3 :(得分:0)
DECLARE @ID AS BIGINT
SET @ID = 0
declare @str as nvarchar(Max)
在此示例中,此代码按时间工作:
DECLARE Spliter1_Cursor CURSOR FOR
SELECT SPID
FROM sys.sysprocesses
WHERE hostname ='APPSERVER'
AND datediff(second,last_batch,getdate()) > 999
ORDER BY datediff(second,last_batch,getdate()) DESC
OPEN Spliter1_Cursor FETCH NEXT FROM Spliter1_Cursor
INTO @ID
WHILE @@FETCH_STATUS = 0
BEGIN
SET@str = ''
SET@str = 'kill '+ cast (@id as nvarchar (max))
EXEC (@str)
FETCH NEXT FROM Spliter1_Cursor INTO @ID
END
CLOSE Spliter1_Cursor
DEALLOCATE Spliter1_Cursor