如何立即终止/停止长 SQL 查询?
Posted
技术标签:
【中文标题】如何立即终止/停止长 SQL 查询?【英文标题】:How to kill/stop a long SQL query immediately? 【发布时间】:2013-04-10 09:03:39 【问题描述】:我正在使用 SQL Server 2008 及其管理工作室。我执行了一个产生许多行的查询。我试图通过红色的取消按钮取消它,但它在过去 10 分钟内没有停止。它通常会在 3 分钟内停止。
可能是什么原因,我该如何立即阻止它?
【问题讨论】:
您是否检查过是否有任何应用程序持有此查询?? 停止并再次重新启动您的 sql 服务.. 我遇到过这种情况,因为即使我在 sql 中运行所有内容,我也希望编辑我的配置文件... @user1102001 - 不强迫你做任何事情。我说可以和不应该:) 【参考方案1】:sp_who2 'active'
检查 CPUTime 和 DiskIO 下的值。注意值比较大的进程的SPID。
kill SPID value
【讨论】:
我正在使用 Microsoft SQL Server 2008 R2,我试图找出正在执行和暂停的查询的 SPID 是什么,发现有许多相同的 SELECT SQL 实例具有相同的 SPID。当我尝试执行命令 KILL 114 - 这里 114 是我暂停查询的 SPID 值。我收到以下错误:请指导。消息 102,级别 15,状态 1,第 2 行 '114' 附近的语法不正确。【参考方案2】:可能是什么原因
只要您的attention 可以到达服务器并得到处理,查询就会立即取消。查询必须处于可取消状态,这几乎总是正确的,除非您执行某些操作,例如从 SQLCLR 调用 Web 服务。如果您的注意力无法到达服务器,通常是由于scheduler 过载。
但是,如果您的查询是必须回滚的事务的一部分,则回滚不能被中断。如果需要 10 分钟,则需要 10 分钟,而您对此无能为力。即使重新启动服务器也无济于事,只会使启动时间更长,因为恢复必须完成回滚。
要回答哪个具体原因适用于您的案例,您需要自行调查。
【讨论】:
请注意,SSMS 仅在收到注意回复后才将查询显示为“已取消”(而不是“尝试取消”),这意味着首先排空通信管道中的所有中间结果(例如. 所有结果都在 TCP/IP 发送/接收缓冲区和所有内存缓冲区中)。 我希望它会说“回滚” @RemusRusanu - 如果估计的回滚时间是 20,000 多个小时怎么办?很高兴从备份中恢复。 dba.stackexchange.com/questions/222145/…【参考方案3】:首先执行以下命令:
sp_who2
然后使用 SPID 执行以下命令,您从上面的命令中获得:
KILL SPID value
【讨论】:
【参考方案4】:这是一个愚蠢的答案,但至少在我的情况下它可以可靠地工作: 在管理工作室中,当“取消执行查询”没有停止查询时,我只需单击以关闭当前的 sql 文档。它问我是否要取消查询,我说是,然后你瞧,几秒钟后它就停止执行了。之后它会询问我是否要在关闭之前保存文档。此时我可以单击取消以保持文档打开并继续工作。不知道幕后发生了什么,但它似乎有效。
【讨论】:
在这种情况下,查询实际上可能仍在后台运行/挂起,您将不再看到它。 我认为它会终止连接,因为您必须在此之后重新连接。 它会终止与 SSMS 的连接,但不会(必然)终止与数据库的连接。 我确实试过这个我的 sql 挂了。 T_T 如果你看不到它,它就不存在。【参考方案5】:如果您取消并看到该运行
sp_who2 'active'
(活动监视器在旧的 sql server 2000 FYI 上不可用)
找出你想杀死的 SPID,例如81
Kill 81
再次运行sp_who2 'active'
,您可能会注意到它正在休眠...正在回滚
要让 STATUS 再次运行 KILL
Kill 81
然后你会收到这样的消息
SPID 81: transaction rollback in progress. Estimated rollback completion: 63%. Estimated time remaining: 992 seconds.
【讨论】:
我必须运行KILL spid WITH STATUSONLY
才能看到状态消息。【参考方案6】:
首先,您需要使用以下查询显示/检查所有正在运行的查询-
SELECT text, GETDATE(), *
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
为所有正在运行的查询分别找到 Session-Id
和 Description
,然后复制您要立即终止/停止的特定查询的 Session-Id。
使用此查询使用 Session-Id 终止/停止特定查询:
Kill Session-id
例子:
kill 125 --125 is my Session-Id
【讨论】:
请通过编辑为您的答案添加一些解释,以便其他人可以从中学习【参考方案7】:您可以使用键盘快捷键 ALT + Break 来停止查询执行。但是,这可能不会在所有情况下都成功。
【讨论】:
这个是在管理工作室为我工作的。谢谢【参考方案8】:我很长一段时间以来一直在遭受同样的事情。当您连接到远程服务器(可能很慢)或网络连接不佳时,尤其会发生这种情况。 我怀疑微软是否知道正确答案是什么。
但是因为我试图找到解决方案。只有一种外行方法有效
单击您遇到的查询选项卡上的关闭按钮。 过了一会儿(如果微软对你不苛刻!!!)你可能会看到一个窗口询问这个“查询当前正在执行。您要取消查询吗?”
点击“是”
过一会它会询问你是否要保存这个查询?
点击“取消”
然后发布,可能是您的工作室再次稳定执行您的查询。
它在后台的作用是断开您的查询窗口与连接。因此,为了再次运行查询,再次连接远程服务器需要一些时间。但相信我,这种权衡比看到那个永远运行的计时器的痛苦要好得多。
PS:这对我有用,如果对你也有用的话,谢谢。 !!!
【讨论】:
仍然为我工作并解决了我的问题 -->【参考方案9】:显然在 sql server 2008 r2 64bit 上,从 IIS 长时间运行查询,kill spid 似乎不起作用,查询只是一次又一次地重新启动。它似乎在重用 spid。该查询导致 sql server 不断占用 35% 的 cpu 并挂起网站。我猜 bc/ 它无法响应其他登录查询
【讨论】:
我很想看到这个来源。【参考方案10】:如果红色的“停止”框不起作用,一个简单的答案是尝试按键盘上的“Ctrl + Break”按钮。
如果您在 Linux 上运行 SQL Server,则可以将一个名为“killall”的应用添加到系统托盘中 只需单击“killall”按钮,然后单击陷入循环的程序,它将终止程序。 希望有帮助。
【讨论】:
【参考方案11】:就我而言,当我在无休止地运行时尝试关闭它时,我的 sql 挂断了。所以我所做的是我打开我的任务管理器并结束我的 sql 查询任务。这停止了我的 sql 并重新启动它。
【讨论】:
【参考方案12】:如果使用VSCode mssql Extension,点击F1,在提示符中写入mssql,选择“取消查询”,如@987654322所示@。
【讨论】:
这并不能真正回答手头的问题。如果他们通过 VSCode 询问如何做到这一点,那会更好,但一般来说更多的是关于 Sql Server。 它不适合主要问题之后的所有挑剔细节 - 如何立即终止/停止长 SQL 查询? - 我通过谷歌发现试图解决我的小变种。是的,我搜索了一个与我自己的细节更相关的问题。所以,当我找到这个问题的解决方案(以及我的客户中的这个细微差别)时,我添加了一个很大的免责声明——如果使用这样的客户端——你可以用这种方式取消。试图帮助别人......除了明显正交的答案之外,从来没有理解过这种***。但是,如果您认为删除它会更好,请标记为适度,蒂莫西。和平。以上是关于如何立即终止/停止长 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章