找出占走Single_User Mode数据库唯一连线的Session ID

找出占走Single_User Mode数据库唯一连线的Session ID


当数据库的状态被改为Single_User模式后,只容许一个Session登入该数据库。

万一该数据库的唯一连线被占走后,必须找出是哪一个Session占走连线并Kill该

Session才有机会取得该数据库唯一连线来连接该数据库。

下图中,我们开启一个Session Id为56的查询窗口,我们先连线到数据库DB2,

然后再对DB2数据库操作设为Single_User模式。

1

完成上述步骤后,我们用sp_who2来看看目前占住DB2的Session ID是多少呢?由下图

可以看见(红色圈选处),目前占住DB2唯一的连线Session ID就是56。

2

当我们知道是谁占住DB2后,就可以如下图方式,Kill该Session后再用Alter Database

命令将DB2这一个数据库改回Multi_User。

3

相信朋友们会想说找出是谁占住Session有什么难呢?下图中我们换一个方式来将

DB2改为Single_User模式。我们一样用56号Session,然后先连线到master数据库再

下Alter Database命令(如下图)。

4

此时我们再用sp_who2来看,会发现56号Session目前是连线到master。然而我们检视

sysprocesses数据表,看看哪个Session连线在DB2呢?如下图所示sysprocesses中找不到

任何Session连线在DB2。我也用过sys.dm_exec_sessions等相关DMV来查询,都是找不

到占住DB2唯一连线的Session ID。

当我们找不到连线的Session ID,那我们怎么知道该Kill哪一个Session呢?

5

后来无意间发现可以利用数据库ACID的重要关键,就是Lock。因为任何连线到数据

库的Session都会在该数据库对象上要求一个S锁定。我们就先用sp_lock来看看吧。

如下图所示,56号的Session在dbid为8的数据库下了一个S锁定。

透过这样的方式,我们就可以顺利找出哪个Session占走唯一的连线,即使是SQL背景

工作占走连线,也可以利用这种方式找出该Session。

6

下图只是利用syslockinfo数据表搭配Where条件式搜寻出是否有Session在DB2下S锁定

,比用sp_lock会更简单判读一点。

7

结语 :

也许会有更简单的方式去找出Session,我也不晓得这样的方式是不是很精准,提供

给大家参考,如果您有其他的方式,欢迎一起讨论。

我是ROCK

[email protected]

原文:大专栏  找出占走Single_User Mode数据库唯一连线的Session ID


猜你喜欢

转载自www.cnblogs.com/chinatrump/p/11518156.html