如何停止SQL Server中的所有进程

时间:2018-12-14 20:23:06

标签: sql-server tsql database-administration

我有一个作业由于阻塞而失败,我想做的是在运行该作业时停止所有到数据库的事务,以避免阻塞。那么,有人可以帮助您如何停止所有事务然后运行该作业吗?

2 个答案:

答案 0 :(得分:0)

我相信您首先需要发现根本原因,但是如果绝对需要,那么您可能需要执行以下操作-

  1. 在游标中的代码下方运行-

     SELECT conn.session_id
     FROM sys.dm_exec_sessions AS sess
     JOIN sys.dm_exec_connections AS conn
     ON sess.session_id = conn.session_id;
    
  2. 在光标中,将每个会话ID(@sessionId)放入变量中,并使用以下命令-

    kill @sessionId
    

下面是完整的代码-

    DECLARE @session_id int
    declare Mycursor cursor for 
       SELECT conn.session_id
       FROM sys.dm_exec_sessions AS sess
       JOIN sys.dm_exec_connections AS conn
       ON sess.session_id = conn.session_id

   OPEN Mycursor
   FETCH NEXT FROM Mycursor INTO @session_id 
   WHILE @@FETCH_STATUS = 0  

   BEGIN  
       Exec ('kill ' + @session_id)

    FETCH NEXT FROM Mycursor INTO @session_id  

  END   
 CLOSE Mycursor;  
 DEALLOCATE Mycursor;   

答案 1 :(得分:0)

有时候,您只需要解决一个问题,然后再有时间调查根本问题。因此,考虑到这一点,您可以创建计划任务以仅重新启动SQL Server(https://blog.sqlauthority.com/2014/11/03/sql-server-powershell-way-of-restarting-sql-server-service/)。我不建议您将其作为永久解决方案,但如有必要,它可以帮助您解决问题。

可以通过多种方式解决您的问题。鉴于您提供的信息有限,我将提供一些建议:

1)在合理的地方添加SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED(在失败的工作以及proc或代码中的任何其他SQL上)。您想要将此与需要绝对精确的东西一起使用。例如,请勿将其与任何涉及金钱的物品一起使用。但这通常是非常安全的(某些理想主义者会对此进行争论……如果您是理想主义者,那么请忽略此建议。如果您是实用主义者,那么这是必须的)。

WITH(NO LOCK)也执行相同的操作,但是逐表进行。我将把这些条款留给您,以谷歌搜索这些条款并进一步了解它们。

2)使用“活动监视器”(在SQL Server Management Studio的工具栏中应该是它的图标)来查看作业执行时正在运行的内容,以了解可能是什么问题,也可以使用它来终止进程

3)使用Sql Server Profiler(在工具菜单下)查看正在运行的查询。

4)使用查询查看所有查询正在运行:https://blog.sqlauthority.com/2009/01/07/sql-server-find-currently-running-query-t-sql/