Search Wiki:
SQL Server的连接过多及释放


定期清理长时间没动作的SPID来避免问题发生的SQL脚本:

USE Master

GO

SET NOCOUNT ON

DECLARE @DBID int

DECLARE @CMD1 varchar(8000)

DECLARE @spidNumber int

DECLARE @SpidListLoop int

DECLARE @SpidListTable table

(UIDSpidList int IDENTITY (1,1),SpidNumber int)

INSERT INTO @SpidListTable (SpidNumber)

SELECT spid

FROM Master.dbo.sysprocesses

WHERE DBID NOT IN (1,2,3,4) -- Master, Tempdb, Model, MSDB

AND spid > 50 -- 代表非系统SPID

AND spid<> @@spid -- 代表非运行这个脚本的SPID本身

AND status = 'sleeping' -- SPID在sleep

AND DATEDIFF(minute, last_batch, getdate()) >120 -- 该SPID从上一个语句执行以后已经空闲了2个小时。 这个时间可以有唐先生根据实际情况做调整。

AND programname like ‘MS SQLEM%’ --通过programname来区分是否来自特定应用程序的连接。 这个如果不确定,可以删掉这一行。

ORDER BY spid DESC

SELECT @SpidListLoop = MAX(UIDSpidList) FROM @SpidListTable

WHILE @SpidListLoop > 0

BEGIN

SELECT @spidNumber = spidnumber

FROM @spidListTable

WHERE UIDspidList = @SpidListLoop

SELECT @CMD1 = 'KILL ' + CAST(@spidNumber AS varchar(5))

EXEC (@CMD1)

SELECT @SpidListLoop = @SpidListLoop - 1

END

SET NOCOUNT OFF

GO

Last edited Sep 27 2008 at 9:20 AM  by zhangai, version 3
Updating...
Page view tracker