KILL Linked Server异常中断会话后一直处于KILLED/ROLLBACK状态

一、 问题背景

开发反馈有一个job下午一直没执行,登上数据库检查发现job之前只执行几分钟,但这一次执行了5个小时还在跑。查看SqlServer中当前在执行的语句,发现有一个用到了Linked Server的查询执行了将近5小时,并且正在等待OELDB事件。尝试手动执行这个sql,发现跟平时一样几分钟就能跑完。

这个时间恰好和早上防火墙故障的时间能对上,估计是由于防火墙故障导致 源会话一直在等待Linked Server返回结果,但实际上这个连接已经异常中断了,永远无法给这个会话返回任何结果,导致job一直等待OELDB事件无法结束。

 

我们选择KILL掉该会话,select语句本来应该直接能被KILL掉不用回滚,但是却发现会话状态变成KILLED/ROLLBACK,半个小时之后再看,回滚进度一直是0%,估计剩余时间也一直是0秒。

KILL 129 WITH STATUSONLY; 
SPID 129: 正在进行事务回滚。估计回滚已完成: 0%。估计剩余时间: 0 秒。

 

二、 解决方法

查了网上一些文章,这种Linked Server连接异常中断的语句(包括目标库突然宕机、防火墙故障等),确实是无法通过SqlServer的kill会话来结束,原因暂时没看有人查到。另外根据观察虽然这个会话一直处于KILLED/ROLLBACK状态,但它并不会导致日志无法截断问题。

 

下面整理了网上查到的几种解决方法,第1,2种测试过是可以的,第3种是新发现的,没验证过。

1. 法一

重启SqlServer服务,对于测试库或者能有停机时间的业务,这种是最简单的方法。

 

2. 法二

下载微软的TCPView 软件,在数据库服务器运行,杀掉源库到Linked Server的连接。注意是点end connection,千万别点end process,否则会kill掉SqlServer进程(万一已经点了,重新启动服务就好)。

 

3. 法三

  • 查询出处于阻塞的sql线程
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT
db_id(DB_NAME(er.[database_id])) [DBID]
,er.[session_id] AS [SessionID]
,er.[command] AS [CommandType]
,est.[text] [StatementText]
,er.[status] AS [Status]
,CONVERT(DECIMAL(5, 2), er.[percent_complete]) AS [Complete_Percent]
,CONVERT(DECIMAL(38, 2), er.[total_elapsed_time] / 60000.00) AS [ElapsedTime_m]
,CONVERT(DECIMAL(38, 2), er.[estimated_completion_time] / 60000.00) AS [EstimatedCompletionTime_m]
,er.[last_wait_type] [LastWait]
,er.[wait_resource] [CurrentWait]
FROM sys.dm_exec_requests AS er
INNER JOIN sys.dm_exec_sessions AS es ON er.[session_id] = es.[session_id]
CROSS APPLY sys.dm_exec_sql_text(er.[sql_handle]) est
WHERE er.[command] like 'Killed%';
  • 找到spid(例如是75),根据spid查询系统进程hostprocess
select spid, blocked,waittime,lastwaittype,dbid,last_batch,open_tran,hostprocess,cmd from sysprocesses where spid = 75;

  • 在执行这条语句的机器上,cmd中,利用进程号查进程名
# tasklist|findstr 进程号
tasklist|findstr 20540
  • cmd中,根据进程名称kill进程
# taskkill /f /t /im 进程名称
taskkill /f /t /im /svchost.exe

 

参考

https://docs.microsoft.com/zh-cn/sysinternals/downloads/tcpview

https://www.cnblogs.com/kerrycode/p/5981763.html

https://www.colabug.com/2018/0111/2184621/

https://www.cnblogs.com/kerrycode/p/5981763.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章