MSSQL Lock Alert

Veritabanlarında bazı durumlarda locklar meydana gelmektedir.Örneğin index işlemlerinde online=on yapılmadığında indexe gelen sorgularda locklanma ,updatelerin selectleri(bazı durumlarda locklanmaz), insertlerinizi kilitlemesi durumlarında  ve veritabanında yapılan diğer  işlemleri locklayabilir ve siz bunu instance’ı dar boğaza düşürdüğünde ya da  uygulamacının mail, telefon ile size ulaşması durumunda öğreniyorsanız aşağıdaki t-sql tam size göre.

Aşağıdaki scriptte neler olduğundan kısaca bahsetmek istiyorum.

 Çalışmış olduğunuz  instance da ki lockların sayısını dakika da bir  hesaplayarak sizin belirlemiş olduğunuz sayıdan büyük ise , mail içeriğinde scriptin çalıştığı instance adını ,sınırı aştığına dair uyarı metini sistemde önceden tanımladığınız mail profil ismini otomatik olarak bularak sizin belirteceğiniz mail adresine  bilgilendirme maili atan scripttir.


Bu script’in düzgün çalışması  için aşağıdaki parametreleri değiştirmeniz gerekmektedir.

 

@mail_gönderilecek_kisi  ==> Lock ile ilgili bilgilendirme mailini gönderilecek hesap

@lockcount                         ==>  Bu parametrede belirttiğiniz sayıdan fazla lock olursa size bilgilendirme maili atacaktır. (default değer 100)

USE [msdb]
GO

BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'lock alert',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'No description available.',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'lock_script',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'declare @lockcount int,
@mail_gönderilecek_kisi nvarchar(max) =''farukerdemm@outlook.com.tr'',-- mail gönderilecek hesap
 @msj nvarchar(max) = (select @@SERVERNAME+'' instancenda belirtilen sayıdan fazla lock bulunmaktadır.Gerekli Kontrolleri sağlarmısınız?''),
 @profle nvarchar(max) =(select name from msdb.dbo.sysmail_profile)
set @lockcount=( select count(t1.resource_type)                
from
sys.dm_tran_locks t1,
sys.dm_os_waiting_tasks t2
where
t1.lock_owner_address = t2.resource_address)
if @lockcount>100  --lock sayısı
begin
EXEC msdb.dbo.sp_send_dbmail
@profile_name =@profle,  --profil adı
@recipients = @mail_gönderilecek_kisi,
@subject = ''Lock Alert'', -- konu başlığı
@body=@msj  --Mail içeriği
end',
@database_name=N'master',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO


Yukarıdaki script’i çalıştırdığınızda lock olduğunda  aşağıdaki gibi bilgilendirme maili alacaksınız.

Loading