Inchiderea sesiunilor inactive vechi de pe o instanta de SQL Server

Configurare noua (How To)

Situatie

Adeseori avem probleme cu sesiuni vechi de sql ramase conectate la server. Aceste sesiuni consuma resurse (in general  memorie). Este bine ca , periodic, sa verificam daca avem astfel de sesiuni ramase si sa le deconectam, pt a elibera resursele.

Solutie

Deconectarea sesiunilor se poate face manual, una cate una, ceea ce inseamna pierdere de timp, sau se poate face din script, alegand ca sesiunile mai vechi de x ore ( relative la coloana LastBatch) sa fie automat deconectate.

Pt acest lucru am conceput o procedura de sql. 

 

create procedure Kill_old_sessions_prc

@NrOre int

as

 

 

declare @spid int

declare @last_batch datetime

 

 

select

spid

,  substring( convert(varchar,last_batch,111) ,6  ,5 ) + ‘ ‘

+ substring( convert(varchar,last_batch,113) ,13 ,8 )

as ‘last_batch_char’

 

into #procese

from sys.sysprocesses

where spid>55 and cmd not like ‘%DB MIRROR%’ and status not like ‘%background%’ and loginame<>’sa’ and status like ‘%sleeping%’ and cmd like ‘%AWAITING COMMAND%’

 

alter table #procese alter column last_batch_char varchar(max)

 

update #procese

set last_batch_char = convert(varchar(max),YEAR(getdate()))+’/’+CONVERT(varchar(max),last_batch_char)

 

alter table #procese alter column last_batch_char datetime

 

declare @diferenta int

declare @sql varchar(max)

 

 

declare x cursor forward_only

for

select * from #procese

open x

fetch next from x into @spid, @last_batch

while @@FETCH_STATUS=0

begin

if DATEDIFF (HH, @last_batch, GETDATE()) > @NrOre

begin

set @sql = ‘kill ‘+ CONVERT(varchar(max),@spid)

exec (@sql)

print ‘am dat kill la spid ‘+ CONVERT(varchar(max),@spid)

end

fetch next from x into @spid, @last_batch

end

 

close x

deallocate x

 

drop table #procese

 

 Se pune aceasta procedura pe serverul pe care se doreste rulata (de preferat in baza de date Master, dar nu e obligatoriu sa fie aceasta baza).

Dupa care se ruleaza alegand ca parametru numarul maxim de ore pt o sesiune inactiva (de retinut ca se vor deconecta doar sesiunile INACTIVE)

Exemplu: Pt a deconecta sesiunile mai vechi de 48 de ore se executa: exec Kill_old_sessions_prc 48

In timpul rularii procedura va spune la ce sesiuni (SPID-ul) a dat disconect. (ca mai jos)

am dat kill la spid 56
am dat kill la spid 59
am dat kill la spid 60

 

Tip solutie

Permanent

Voteaza

(13 din 30 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?