SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析

今天遇到一个很奇怪的情况,发现一个会话异常,这个会话只是在执行一个简单的存储过程,里面使用了链接服务器(Linked Server)查询另外一台服务器数据(存储过程里面没有任何显性事务、UPDATE、DELETE操作,只有几个简单的SELECT查询,其中有两个查询使用了链接服务器Linked Server,由于生产环境,不好贴出SQL语句),在DPA监控工具里面,发现该会话引起了非常长的OLEDB等待时间,手工执行测试,发现并不耗费很长时间,KILL该会话后, 回滚状态已完成一直是0%, 估计剩余时间也一直是0秒。如下截图所示:

 

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

 

如下所示,这个会话的start_time(Timestamp when the request arrived. Is not nullable.)为2016-10-18 02:17:58.210,到现在2016-10-19 16:02:30.173已经有几十个小时了,我kill会话的时间点为2016-10-19 12:00:01。

 

 

 

可以看到它的等待类型是OLEDB等待(图一),也就是说等待链接服务器所指的服务器返回结果。另外这个事务的transaction_type为2,意味这只是一个Read-only transaction(避免别人误解,这是一个证据),transaction_state为2,表示事务处于活动状态(The transaction is active)。事务出现的这个时间点引起了我的注意,因为链接服务器所指向的这台服务器出现宕机(参考链接VmWare平台Windows Server 2012 无响应宕机),刚好是那台服务器虚拟机出现宕机时候,重启的时间点前面一点(那台服务器凌晨1点多宕机,2:22AM的时候重启的)。从DPA监控工具也能看到确实是那个点出现的。如下所示:

 

 

这种分布式查询,由于Linked Server所指的服务器出现异常(例如宕机),这边的会话进程一直在等待其返回结果,但是Linked Server所指服务器由于异常永远都无法给这个会话进程反馈任何结果,就出现了这种情况,不过有点奇怪的是,这种情况无法通过KILL会话来结束。 只能通过重启服务器来解决问题, 也不能通过Kill进程解决(因为SQL Server是单进程多线程架构,不像ORACLE那种多进程架构,可以从操作系统层面杀掉进程或线程(Windows平台,Oracle提供了一个工具ORAKILL utility 可以Kill线程)),但是重启数据库是一个很麻烦的事情。 所以这个僵尸会话就一直存在数据库里面,对于我这个有强迫症的人,看着它的存在,总想干掉它. 确实是个折磨人的事情.

时间: 2024-09-19 09:20:43

SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析的相关文章

捕捉一个SQL Server会话的所有语句

问题:有一件事让我感到特别沮丧,那就是我经常写一些复杂的查询,但是我经常忘记保存它们或者不记得在我运行五个迭代之前的查询是什么样的.一个明智的做法是一直保存着你的脚本,但是当你处在尝试做一堆不同的事情时,你总有可能忘记了某些事情.在本技巧中,我们看看怎样创建一个会话的服务器端跟踪并且完整地捕捉所有运行的脚本,这样你可以找到你认为可能会丢失的复杂查询. 首先需要做的是创建两个存储过程,在这个技巧中,我在自己的主数据库上创建它们.它们允许你创建一个服务器端的跟踪,也允许你关掉一个服务器端的跟踪.要了

将MS SQL SERVER数据库运行在普通用户(独立用户)状态下的设置方法终结篇

看了脚本之家网上的很多文章,整理了如下步骤,基本上可以说是终结解决方法了,这里给详细的整理下了, 希望可以帮助更新的朋友,让我们的服务器更加安全.脚本之家奉献. 首先是大家已经安装好了sqlserver 企业版. 第一步: Win2003 MSSQL以普通用户运行安全设置篇 这个里面主要是讲解了,普通用户的创建与设置,但需要注意的是,权限的设置 C盘需要以下权限: C:\administrators 全部权限 System 全部权限 IIS_WPG只读与运行的权限(只应用在当前文件夹) SQL2

使用SQL Server In

从以前的 "classic" ASP 到目前的 ASP.NET 4.5 Web Forms,很多开发者依赖ASP.NET 会话状态作为重要的临时保存每个用户的数据的主要手段. 它的特征是在用户访问web应用程序的过程中,允许开发者存储和读取用户的数据. 会话数据是自动从存储中持续保存和恢复,并且自动过期删除. 问题 使用Session State的替代方案这些内容超出了本文的范围. 对于依赖Session State的应用程序也有陷阱,最常见的是访问每个用户,每个请求的Session基

SQL Server数据库文件恢复技术

server|恢复|数据|数据库 SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志文件ldf的方式.下面将主要讨论一下后者的备份与恢复.本文假定您能熟练使用SQL Server Enterprise Manager(SQL Server企业管理器)和SQL Server Quwey Analyser(SQL Server查询分析器) 1.正常的备份.恢复方式 正常方式下,我们要备份一个数据库,首先要

MDF文件在SQL Server数据库中恢复技术

server|恢复|数据|数据库 先把要恢复的文件置于MS SQL里的DATA文件里,进入MS SQL主数据库服务器后 1.我们使用默认方式建立一个供恢复使用的数据库(如MHDYF2005).可以在SQL Server里面建立. 2.停掉数据库服务器. 3.将刚才生成的数据库的日志文件MHDYF2005_log.ldf删除,用要恢复的数据库mdf(yu1.mdf)文件覆盖刚才生成的数据库数据文件MHDYF2005_data.mdf. 4.启动数据库服务器.(刷新之后)此时会看到数据库MHDYF2

SQL Server 2005常见问题浅析

问题1:使用.net2005自带的SQL-Express连接不上. 解决方法: 1.网络防火墙阻止数据库连接: 2.默认SQL-Express没有启动Sa账户->下载一个management studio express界面工具管理SQL-Express 3.无线网络会出现根据机器名找不到SQL服务器的情况,直接用IP连接 4.服务端通过开始菜单打开->配置工具->SQL Server外围应用配置器->服务和连接的外围应用配置器->远程连接->右边选择"本地连

SQL Server的文件恢复技术

SQL Server有两种备份方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志文件ldf的方式.本文中,我们将主要介绍一下后者的备份与恢复.(本文中假定您目前已经能够熟练使用Server企业管理器和SQL Server查询分析器) 1.正常的备份.恢复方式 正常方式下,我们要备份一个数据库,首先要先将该数据库从运行的数据服务器中断开,或者停掉整个数据库服务器,然后复制文件. 卸下数据库的命令: Sp_detach_db 数据库名 连接

如何恢复和修复SQL Server的MDF文件

  如果备份的数据库有2个文件,分别是.LDF 和 .MDF,打开企业管理器,在实例上右击---所有任务--附加数据库,然后选择那个.MDF文件,就可以了. 或者在查询分析器中输入: sp_attach_db "数据库名称","路径文件名.ldf","路径文件名.MDF" SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志文件ldf的方式.下面将主要讨

修复SQL Server的MDF文件的方法

  修复SQL Server的MDF文件的方法 如果备份的数据库有2个文件,分别是.LDF 和 .MDF,打开企业管理器,在实例上右击---所有任务--附加数据库,然后选择那个.MDF文件,就可以了. 或者在查询分析器中输入: sp_attach_db "数据库名称","路径文件名.ldf","路径文件名.MDF" SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文