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