TempDB Büyüme Alarm Mekanizması

Hazırlamış olduğum script ile sistem database iniz olan TempDB nin verdiğiniz değerin daha üstüne çıktığında haberdar eden bir mekanizmanız olmuş olacak.

Bu süreç 3 adımda gerçekleşecek.

İlk adımımız demo veritabanımızı oluşturup içerisine sp_ mizi oluşturuyoruz. İkinci adım JOB ‘ımızı tanımlamak ve son adım ise ALERT ‘imizi oluşturmak

ADIM I :

CREATE	DATABASE DBA_Performance
GO

USE DBA_Performance
GO
CREATE PROC SQLTURKIYE_SP_TempDBGrowth
AS
DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)
SET @xml = CAST(( SELECT TOP 5 -
                            su.session_id AS 'td' ,
                            '' ,
                            ss.login_name AS 'td' ,
                            '' ,
                            rq.command AS 'td' ,
                            '' ,
                            su.Task_Alloc AS 'td' ,
                            '' ,
                            su.Task_Dealloc AS 'td' ,
                            '' ,
                            ( SELECT    SUBSTRING(text,
                                                  rq.statement_start_offset
                                                  / 2 + 1,
                                                  ( CASE WHEN statement_end_offset = -1
                                                         THEN LEN(CONVERT(NVARCHAR(MAX), text))
                                                              * 2
                                                         ELSE statement_end_offset
                                                    END
                                                    - rq.statement_start_offset )
                                                  / 2)
                              FROM      sys.dm_exec_sql_text(sql_handle)
                            ) AS 'td'
                  FROM      ( SELECT    su.session_id ,
                                        su.request_id ,
                                        SUM(su.internal_objects_alloc_page_count
                                            + su.user_objects_alloc_page_count) AS Task_Alloc ,
                                        SUM(su.internal_objects_dealloc_page_count
                                            + su.user_objects_dealloc_page_count) AS Task_Dealloc
                              FROM      sys.dm_db_task_space_usage AS su
                              GROUP BY  session_id ,
                                        request_id
                            ) AS su ,
                            sys.dm_exec_sessions AS ss ,
                            sys.dm_exec_requests AS rq
                  WHERE     su.session_id = rq.session_id
                            AND ( su.request_id = rq.request_id )
                            AND ( ss.session_id = su.session_id )
                            AND su.session_id > 50  
                            AND su.session_id <> ( SELECT   @@SPID
                                                 ) 
                  ORDER BY  su.Task_Alloc DESC  
                FOR
                  XML PATH('tr') ,
                      ELEMENTS
                ) AS NVARCHAR(MAX))
--BODY OF EMAIL - Edit for your environment
SET @body = '<html><H1>Tempdb Large Query</H1>
<body bgcolor=white> Aşağıda ki sorgulardan bir tanesi  <u> yüksek ihtimalle TempDB nin büyümesine sebep oluyor.</u>. 
NOT: Lütfen  <b>Aşağıda gelen tüm Session ları düşürmeyiniz...</b> 
<U>Kullanımı fazla olan sorguları aşağıda tespit edip inceledikten sonra sürecinizi başlatınız.</U><BR> 
<BR>
Session ı Nasıl Düşürürüz ? :<BR>
<BR>
1. <b>SQL Server Management Studio</b> Aç <BR>
2. <b>Database Engine -  Windows Authentication veya SQL Authentication olarak Bağlantını yap.</b><BR>
3. <b>"New Query"</b> tabına tıklayarak yeni bir Query Penceresi Aç<BR>
4. <b>KILL [Session_Id]; ( KILL komutundan sonra  düşüreceğimiz Session ın ID sini yaz )</b> - Örnek olarak :   KILL 199; <BR>
5. <b>F5</b> butonuna bas ya da <b>!EXECUTE</b> tabına tıkla. <BR>
<BR>
Session düşürüldükten sonra herhangi bir Restart ınızda TempDb eski haline gelecektir.
<BR>
<BR>
<table border = 2><tr><th>Session_ID</th><th>Login_Name</th><th>Command</th><th>Task_Alloc</th><th>Task_Dealloc</th><th>Query_Text</th></tr>' 
SET @body = @body + @xml + '</table></body></html>'
--Send email to recipients:
EXEC msdb.dbo.sp_send_dbmail 
	@recipients = N'[email protected]',
    @copy_recipients = '[email protected]', --Ek bir mail adresi ekleyecek iseniz ';' ile ayırmanız yeterli olacaktır.ÖR: [email protected];[email protected]
    @body = @body, @body_format = 'HTML', @importance = 'HIGH',
    @subject = 'TempDB Büyümesi Gerçekleşmiştir !!! - TempDB Growth Alert - >5 GB ı aşmış durumda...', 
    @profile_name = 'SQLTURKIYE' --Veritabanı Mail Profile isminizi giriniz.

ADIM II

Şimdi TempDBGrowth adında bir JOB tanımlayacağız ;

Tanımladığımız JOB DBA_Performance DB miz içerisinde ki    SQLTURKIYE_SP_TempDBGrowth isimli  sp_ mizi çalıştıracak.

NOT : Job Schedule edilmeyecek JOB ‘ı tetikleyen Alert olacaktır.

ADIM III

Şimdi ise ALERT ü tanımlayacağız.

Name bölümünde Alert ümüze vereceğimiz ismi giriyoruz. Type kısmında Alert ümüzün tipini belirliyoruz bizim alert ümüz performance condition alert tipinde. Object de alarm üreteceğimiz tipi seçiyoruz biz burada Database ‘i seçiyoruz. Counter yapacağımız türü seçiyoruz ve Instance kısmında veritabanımızı seçip  Alert if counter da ise belirlediğimiz sınır size değerini giriyoruz KB cinsinden.

Alert ekranında Response bölümünde ise sınır değere gelindiğinde Job ‘ımızın tetiklenmesi ayarlayarak ALERt ‘ümüzü oluşturuyoruz.

Şimdi ise 3 adımımızı da gerçekleştirdik ve mail gelmesini bekliyoruz.

Evet Alert mailimiz sistemimize düştü 🙂

 

İyi Çalışmalar.

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *