2008-12-15 101 views
2

我似乎在我的開發服務器上有一個應用程序,它有很多開放連接(它們應該在那裏,但是一些不良數據層被用來打開它們,忘記關閉它們)。我只是想讓它們關閉,這樣我就可以讓其他應用程序在服務器上運行。我如何強制所有連接關閉?SQL Server 2005 - 關閉睡眠連接

回答

5

使用以下腳本從特定主機/登錄中終止非活動會話。你可以從預定的工作中使用它,當然你的優先級應該是修復你的應用層。

SET NOCOUNT ON; 

DECLARE @host VARCHAR(50), @login NVARCHAR(128); 

SET @host = 'fooHost'; --NULL to kill sessions from all hosts. 
SET @login = 'fooLogin'; 

DECLARE @cmd NVARCHAR(255); 
DECLARE @possition INT, @total INT, @selSpid SMALLINT; 
DECLARE @spidInfo TABLE 
(
    [id] INT IDENTITY(1,1), 
    spid SMALLINT, 
    loginame NVARCHAR(128) 
); 

INSERT @spidInfo(spid, loginame) 
SELECT session_id, login_name 
FROM sys.dm_exec_sessions 
WHERE is_user_process = 1 AND [status] = 'sleeping' AND 
    login_name = @login AND [host_name] = COALESCE(@host, [host_name]); 

SELECT @total = @@IDENTITY, @selSpid = 0, @possition = 0; 

WHILE @possition < @total 
    BEGIN 
     SELECT TOP 1 @selSpid = spid, @possition = [id] 
     FROM @spidInfo 
     WHERE [ID] > @possition 

     SET @cmd = N'KILL ' + CAST(@selSpid AS NVARCHAR(10)); 
     EXEC sp_executesql @cmd; 
     PRINT 'SessionId = ' + CAST(@selSpid AS NVARCHAR(10)) + '[' + @login + 
      '] killed by ' + system_user + ' at ' + CAST(GETDATE() AS VARCHAR(50)); 
    END; 

IF (@total = 0) 
    PRINT 'No sessions owned by user ' + '[' + @login + ']'; 
3

除了手動殺死你的連接,可以

  • 連接的處置。也就是說,以某種方式檢索Connection對象並在它們上調用.Close和.Dispose()。使用「使用」將是理想的,因爲它會自動調用.Dispose()。
  • 回收您的應用程序池。
+0

謝謝 - 我有一個數據這個層是一次性的,並且殺死了所有的處理連接,但由於某種原因,開發者在這個應用程序上工作時決定不殺死數據訪問。回收應用程序池是什麼意思? – digiguru 2008-12-15 11:16:41

+0

這與SQL Server連接無關...... – gbn 2008-12-15 11:16:45

3

使用sysprocesses中的last_batch列來判斷它是否真的有效。 SPID> 50(或> = 50?)以避免殺死系統SPID。

將此與您想要的睡眠時間和KILL spid進行比較。

你必須循環。

DECLARE @kill_id smallint 
DECLARE spid_cursor CURSOR FOR 
select spid from sysprocesses 
where dbid = > 4 and last_batch < dateadd(hour, -24, getdate()) and spid >= 50 

OPEN spid_cursor 

FETCH NEXT FROM spid_cursor INTO @kill_id 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
-- Kill the current spid here 
-- KILL @kill_id <---This line will not work 

-- Get the next cursor row 
FETCH NEXT FROM spid_cursor INTO @kill_id 
END 

CLOSE spid_cursor 

DEALLOCATE spid_cursor 
2

首先運行此找到有問題的數據庫.....

SELECT DB_NAME(dbid) as 'Database Name', 
COUNT(dbid) as 'Total Connections' 
FROM master.dbo.sysprocesses WITH (nolock) 
WHERE dbid > 0 
GROUP BY dbid 
SELECT @@MAX_CONNECTIONS AS 'Max Allowed Connections' 

然後運行這個殺人所需DB連接

USE master 
go 

DECLARE @dbname sysname 

SET @dbname = 'Events' 

DECLARE @spid int 
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) 
WHILE @spid IS NOT NULL 
BEGIN 
EXECUTE ('KILL ' + @spid) 
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid 
END