SQLServer20111213--会话数管理
SQLServer会话数管理
2009-12-03 15:51:58| 分类:数据库调优| 标签:|字号⼤中⼩订阅
1. 如果要查询是否连接没有释放引起的, 你可以⽤查询分析器连接到你的数据库服务器, 执⾏下⾯的代码:
select * from master.dbo.sysprocesses
where spid>50
and waittype = 0x0000
and waittime = 0
sqlserver备份表语句and status = 'sleeping'
and last_batch < dateadd(minute, -10, getdate())
and login_time < dateadd(minute, -10, getdate())
如果这样的进程很多, 则说明连接确实有很多连接没有释放(上⾯的查询查询出已经超过10分钟都没有做任何动作的连接)
2. 如果确实是连接没有释放的问题, 你可以硬⾏释放连接, 不⼀定要改程序. 在sql server中, 创建⼀个job, 每10分钟⼀次, 执⾏下⾯的代码来定时检查并释放掉空连接就可以了:
declare hcforeach cursor global
for
select 'kill ' + rtrim(spid) from master.dbo.sysprocesses
where spid>50
and waittype = 0x0000
and waittime = 0
and status = 'sleeping'
and last_batch < dateadd(minute, -60, getdate())
and login_time < dateadd(minute, -60, getdate())
exec sp_msforeach_worker '?'
exec sys.sp_who @loginame=null– sysname
我这⾥介绍两个SQL Server ⾥杀数据库连接⽤到的脚本:
⼀个是根据数据库名称,杀掉相关的数据库连接进程p_kill_db_name_session.sql
调⽤⽅法举例:
exec p_kill_db_name_session 'pubs'
它可以⽤在A系统备份数据库然后⾃动还原到B系统数据库前时,杀掉B系统数据库连接,保证对数据库独占。
当然我们还可以根据⼯作需要修改获取进程号的条件,例如下⾯SQL:
select s.spid
from master..sysprocesses s
where ( datediff( hh, www.doczj/doc/4e69c3cb4afe04a1b071de48.html st_batch, getdate())) > 2 and
loginame='web_user' and
s.spid>50 and status='sleeping'
and hostname in ('www2','www')
可以把从www和www2机器上来, 登陆⽤户名称是web_user, 两天不活动的进程号出来, 然后执⾏杀掉进程
另⼀个是根据数据库名称,表名称杀掉相关的数据库连接进程p_kill_db_tab_session.sql
调⽤⽅法举例:
exec p_kill_db_name_session 'pubs','employee'
它可以⽤在对某数据表重建或有⼤量update操作前时,杀掉与之相关的数据库连接进程,并记录锁信息历史⽇志。
⽂章来源:www.doczj/doc/4e69c3cb4afe04a1b071de48.html /news/Content.aspx?id=143
⽂章来源:www.doczj/doc/4e69c3cb4afe04a1b071de48.html /news/Content.aspx?id=143
Transact-SQL KILL 命令⽤来突然结束SQL Server 进程。通常将每个进程都称为⼀个系统进程ID (spid)。“当前活动”下的SQL 企业管理器终⽌进程按钮只是将Transact-SQL KILL 命令发送⾄服务器,因此服务器端的KILL 机制在此情况下是相同的。
spid 可能⽴即响应KILL 命令,或在⼀段延迟后响应,或根本不响应。在某些情况下,延迟或得不到响应的KILL 命令可能是正常的。本⽂讨论KILL 命令的⼯作原理,在哪些情况下会延迟响应或没有响应,以及如何确定这些情况。
注意:本⽂讨论了⼀个不受⽀持的DBCC 命令(DBCC PSS),该命令可能会导致意外的⾏为。Microsoft 不能保证您可以解决因此DBCC 命令使⽤不当⽽导致的问题。使⽤此DBCC 命令需要您⾃担风险。在未来的SQL Server 版本中,此DBCC 命令可能不可⽤。有关受⽀持的DBCC 命令的列表,请参见SQL Server 联机丛书的“Transact-SQL 参考”部分中的“DBCC”主题
每个数据库连接都在sysprocess 中形成⼀⾏,有时称为spid 或系统进程ID。在SQL Server 术语中,每个连接⼜称为“进程”,但这并不是指通常意义上的独⽴进程上下⽂。在SQL Server 6.0 和 6.5 中,
每个进程都⼤致与独⽴的操作系统线程类似,并由其提供服务。每个数据库连接还都包含服务器数据结构,⽤于跟踪进程状态、事务状态、锁持有情况等。其中⼀个结构称为进程状
态结构(PSS),每个连接具有这样⼀个结构。服务器会扫描PSS 的列表,以具体化sysprocesses 虚拟表。sysprocess 中的CPU 和physical_io 列派⽣⾃每个PSS 中的等效值。
Transact-SQL KILL 命令会将“kill yourself”消息发送到spid 的进程插槽结构。它在此作为状态位出现,spid 会定期询问该状态位。如果spid 正在执⾏不询问PSS 状态字段的代码路径,则不响应KILL。下⾯给出了可能发⽣此情况的⼀些已知条件。其中的⼤部分条件都被视为预期⾏为,⽽不被视为错误。
回到顶端
Spid 正在等待⽹络I/O
如果客户端不获取所有结果⾏,服务器在向客户端写⼊时最终会被强制等待。可将此视为sysprocesses.waittype 为0x0800 的⼀种等待。在⽹络上等待时,不会运⾏可以询问PSS 并检测KILL 命令的SQL Server 代码。如果spid 在等待⽹络I/O 之前持有锁,它可能会阻塞其他进程。
如果⽹络连接超时或被⼿动取消,则等待⽹络I/O 的SQL 线程将返回错误,从⽽被释放,以扫描其PSS 并响应KILL。可以使⽤NET SESSION 或NET FILES 命令或等效的服务器管理器命令⼿动关闭命
名管道连接。其他IPC 会话(如TCP/IP 和
SPX/IPX)不能⼿动关闭,此情况下的唯⼀选项是为特定IPC 将会话超时调整为较短的值。有关更多信息,请参见下⾯的Microsoft 知识库⽂章:
137983如何解决SQL Server 中的孤⽴连接
Spid 正在回滚(也称为“正在退出”)
如果事务因任何原因⽽中⽌,则必须回滚该事务。如果是长时间运⾏的事务,则回滚事务所需的时间可能与应⽤事务⼀样长。其中包括长时间运⾏的隐式事务,如单个SELECT INTO、DELETE 或UPDATE 语句。回滚事务时不能将其终⽌,否则,事务性更改将不会⼀致退出。
⽆法终⽌的回滚情况通常可通过观察sp_who 输出来确定,此输出可能会指⽰ROLLBACK 命令。在SQL Server 6.5 Service Pack 2 或更⾼版本中,已向sysprocesses.status 中添加了
ROLLBACK 状态,该状态还会出现在sp_who 输出或SQL 企业管理器的“当前活动”屏幕中。不过,获得此信息的最可靠的⽅法是检查所涉及的阻塞的SPID 的DBCC PSS,并观察pstat 值。例如:
dbcc traceon(3604) /* Return subsequent DBCC output to the client rather
than to the errorlog. */
go
SELECT SUID FROM SYSPROCESSES WHERE SPID=
go
DBCC PSS (suid, spid, 0) /* Where suid is from above, and spid is the
unkillable SPID number. */
go
返回信息的第⼀⾏将包含pstat 值。
例如,此值可能类似于以下内容:
pstat=0x4000, 0x800, 0x100, 0x1
pstat 位的意义:
0x4000 -- 如果位于关键部分中则会延迟 KILL 和 ATTENTION 信号
0x2000 -- 正在终⽌进程
0x800 -- 进程正在退出,因此不能将其选作死锁牺牲品
0x400 -- 进程已收到 ATTENTION 信号,并已通过引发内部异常
做出响应
0x100 -- 单个语句事务中间的进程
0x80 -- 进程参与了多数据库事务
0x8 -- 进程当前正在执⾏触发器
0x2 -- 进程已收到 KILL 命令
0x1 -- 进程已收到 ATTENTION 信号
如果取消了长时间运⾏的数据修改(例如,在GUI 应⽤程序上单击“取消查询”按钮),然后却发现SPI
D(在⼀段时间内)阻塞⽤户并且⽆法终⽌,通常就会得到上述pstat 值。此情况很正常;事务必须退出。可按照上述⽅法通过位进⾏识别。
回到顶端
Spid 1 的状态为0000(正在运⾏恢复)
启动(或重新启动)SQL Server 时,每个数据库都必须先完成启动恢复,然后才能使⽤。这被视为状态为0000 的sp_who 中的第⼀个spid。不能使其终⽌,并且应允许运⾏完恢复,⽽不重新启动服务器。只能终⽌⽤户spid,不能终⽌系统spid,如惰性写⼊器、检查点、RA Manager 等。⽽且不能终⽌⾃⼰的spid。您可以通过执⾏SELECT @@SPID 到⾃⼰的spid。
回到顶端
服务器已有意延迟响应KILL
在⼀些情况下,服务器会有意延迟对KILL 命令或ATTENTION 信号(查询取消请求)的响应。在关键部分中时便属于这种情况。这些间隔通常很短。此情况可以看作pstat 值为0x4000。
回到顶端
代码路径不检查KILL
如果已排除上述所有情况,则可能是当前的代码路径不检查KILL。例如,在SQL Server 6.5 Service Pack 3 之前,DBCC CHECKDB 不能可靠地响应KILL,因为某些代码路径不检查KILL。如果排除了上述所有情况(即⽤户进程未在等待I/O 并且未回滚,数据库不处于恢复中,SQL Server 未有意延迟KILL),但未响应KILL,则可以增强服务器,以使KILL ⼯作。要做出此决定,必须由您的主要⽀持提供商分别对每种情况进⾏检查分析。
回到顶端
其他信息
消息“Process id 10 killed by Hostname JOE”被写⼊错误⽇志这⼀事实并不能确定KILL 已实际发⽣。在发出终⽌请求后会⽴即写⼊此消息,但不表明已响应KILL。
回到顶端
这篇⽂章中的信息适⽤于:
回到顶端
o kbusage KB17
字:
回到顶端
Microsoft和/或其各供应商对于为任何⽬的⽽在本服务器上发布的⽂件及有关图形所含信息的适
⽤性,不作任何声明。所有该等⽂件及有关图形均"依样"提供,⽽不带任何性质的保证。Microsoft
和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件
包括关于适销性、符合特定⽤途、所有权和⾮侵权的所有默⽰保证和条件。在任何情况下,在由
于使⽤或运⾏本服务器上的信息所引起的或与该等使⽤或运⾏有关的诉讼中,Microsoft和/或其
各供应商就因丧失使⽤、数据或利润所导致的任何特别的、间接的、衍⽣性的损害或任何因使⽤
⽽丧失所导致的之损害、数据或利润不负任何责任。
不再更新的KB 内容免责声明
本⽂介绍那些Microsoft 不再提供⽀持的产品。因此本⽂按“原样”提供,并且不再更新。
SQL Server:清除特定db 上的process(SQL Server 2000 & 2005)
[作/译者]:Azens/鹏城万⾥ [⽇期]:2008-07-17 [来源]:yahoo.blog [查看]:
1434
本⽂由【鹏城万⾥】搜集整理。www.doczj/doc/4e69c3cb4afe04a1b071de48.html
SQL Server 的DB Detach & Attach 功能,让DB 的复制或迁移变得⼗分容易,唯⼀
要注意的是,Detach 之前,不能有任何的process 存在,如果利⽤SSMS 进⾏Detach 时,
遇到DB 上还有process,则会出现警告的message,我们可以选择drop process 来清除,达到Detach DB 的⽬的。问题来了,如果Detach DB 是固定的⼯作,是在⽆⼈介⼊的情况
下进⾏,那应该如何清除process 呢?
清除process 的指令⼤家都知道,就是kill,因此我们只要知道⽬前有哪些process 在该DB 上就可以了。于是我写了⼀个Stored Procedure 来达到这个⽬的:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论