SQL 服务器上的许多 KILLED/ROLLBACK 任务 运行,2 天后进度为 0%

Many KILLED/ROLLBACK tasks running on SQL Server with 0% progress after 2 days

我创建了一个发送电子邮件的存储过程,不小心在其内部调用了该存储过程,造成了无限循环。在执行存储过程的几秒钟内,我意识到我做了什么并修复了循环,但它已经创建了 517 个进程。我杀死了所有 SPID,但它们仍处于 KILLED/ROLLBACK 状态。

这段代码向我展示了过程:

select session_id,handle.percent_complete, *
from sys.dm_exec_requests handle   
outer apply sys.fn_get_sql(handle.sql_handle) spname
where cast(handle.start_time as date) = '2022-01-10' 

spname.text 显示所有 SPID 的 'xp_sysmail_format_query'。两天过去了,517进程全部卡在这个回滚状态,进度为0%。我们仍然能够使用我们所有的业务应用程序并执行查询,但 EXEC msdb.dbo.sp_send_dbmail 除外,即使在启动测试电子邮件时,它也会卡在执行中并且必须被取消。这不好,因为不会发送任何自动生成的电子邮件警告,并且所有其他 sql 电子邮件功能都被阻止。我不确定目前还有哪些工作被屏蔽了。

这是个大问题,我找不到解决办法。我已经阅读了所有我能找到的 post。除了重新启动 SQL 服务器之外,我已经尝试了所有我能想到的方法。一些 post 声明重启 SQL 服务器可以解决这个问题,而一些声明不重启它或者任务将在重启时恢复到 killed/rollback 状态。我尝试再次使用 statusonly 杀死 spid,但这只是告诉我它们处于 0% 完成的回滚状态。

我应该重新启动服务器吗?这样可以解决任何问题吗?除了将数据库恢复到超过 2 天的备份并丢失整个企业在过去几天所做的所有工作之外,还有其他解决方案吗?

如有任何帮助,我们将不胜感激。

尽管它很健壮,但有时(幸运的是很少)SQL当服务器杀死采用IT口头禅的过程时,我们别无选择在回滚未及时完成时将其关闭并再次打开

当事务使用外部方法或函数时,这种情况会更加普遍,电子邮件在这一点上尤其臭名昭著。

尽管它不受欢迎,但它通常是最省时的,当唾手可得的选择已经用尽时,应尽快将其视为诊断过程中的一个选择。