SQL Server Üzerinde Uzun Süren Oturumların Otomatik E-Posta Uyarısı ile İzlenmesi

MSSQL Server

Veritabanı yönetimi ve sistem performansının sürdürülebilirliği açısından, uzun süren sorguların izlenmesi son derece kritik bir süreçtir. Sunucularda beklenmeyen yük oluşturan, kilitlemelere (locking) veya kaynak kilitlenmelerine (deadlock) yol açan süreçlerin tespiti için SQL Server Dynamic Management Views (DMV) yapıları ve otomatik bildirim mekanizmaları sıklıkla kullanılır.

İncelediğimiz SQL betiği, sistem üzerinde 3 saati (180 dakika) aşan aktif kullanıcı sorgularını otomatik olarak tespit ederek veritabanı yöneticilerine HTML formatında e-posta uyarısı göndermek amacıyla yapılandırılmıştır.

DECLARE @Body NVARCHAR(MAX);
DECLARE @Subject NVARCHAR(250);

-- Mail başlığı
SET @Subject = 'SQL Server Uyarısı: 3 Saatten Uzun Süren Sessionlar (' + @@SERVERNAME + ')';

-- 3 saatten (180 dk) uzun süren sessionları HTML tablo olarak hazırlama
SET @Body = N'<h3>3 Saatten Uzun Süren Oturumlar(Slepping Hariç)</h3>' +
    N'<table border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse; font-family:Arial; font-size:12px;">' +
    N'<tr style="background-color:#f2f2f2;">' +
    N'<th>SPID</th><th>Süre (Dk)</th><th>Durum</th><th>Veritabanı</th><th>Kullanıcı</th><th>Host Name</th><th>Program</th><th>Komut</th><th>Başlangıç Zamanı</th>' +
    N'</tr>' +
    CAST((
        SELECT 
            td = r.session_id, '',
            td = DATEDIFF(MINUTE, r.start_time, GETDATE()), '',
            td = r.status, '', 
            td = DB_NAME(r.database_id), '',
            td = s.login_name, '',
            td = ISNULL(s.host_name, ''), '',
            td = ISNULL(s.program_name, ''), '',
            td = r.command, '',
            td = CONVERT(VARCHAR(19), r.start_time, 120), ''
        FROM sys.dm_exec_requests r
        JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
        WHERE r.session_id <> @@SPID -- Kendi sorgumuzu hariç tutuyoruz
          AND s.is_user_process = 1  -- Sistem sessionlarını hariç tutuyoruz
          AND DATEDIFF(MINUTE, r.start_time, GETDATE()) >= 180 -- Aktif sorgu süresi 3 saati (180 dk) geçenler
          AND s.login_name NOT IN ('sa','NT AUTHORITY\SYSTEM','saVTS23','')
        FOR XML PATH('tr'), TYPE
    ) AS NVARCHAR(MAX)) +
    N'</table>';

-- Eğer 3 saati geçen session varsa e-posta gönder
IF @Body IS NOT NULL AND @Body LIKE '%<tr>%'
BEGIN
    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'MailProfile',  -- SQL Server Database Mail profil adın
        @recipients = 'dbayonetimi@yunusyucel.com.tr', -- Mailin gideceği adres
        @subject = @Subject,
        @body = @Body,
        @body_format = 'HTML';
END

Bu yapı sayesinde veritabanı yöneticileri (DBA), kullanıcıların veya uygulamaların kilitli kalan ya da optimize edilmemiş uzun süreli sorgularından anında haberdar olur. Bu otomasyon, sistem kesintilerini ve performans kilitlenmelerini büyümeden çözme imkanı tanıyarak veritabanı altyapısının sürdürülebilirliğine doğrudan katkı sağlar.

Başka makalede görüşmek dileğiyle..

Gelecek Allahtan Korkanlarındır.Taha-132

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir