Windows Sunucu Disk Boyutlarını Mail ile Bildirme

Bu makalede sunucumuz üzerinde bulunan Disklerin boyutunu bir tabloya kaydeden daha sonra disk doluluk oranı yüzde 80 üzerine olan diskleri bizlere mail olarak bildiren yapıyı görmüş olacağız.

İlk olarak tablomuzu oluşturup daha sonra sıkıntı yaşamamak için index yapılarıını oluşturuyoruz.

USE [DBAMON]
GO

CREATE TABLE [dbo].[DiskTakip](
    [instance] [nvarchar](255) NULL,
    [host] [nvarchar](255) NULL,
    [disc] [nvarchar](255) NULL,
    [kalanAlan] [decimal](10,2) NULL,
    [dolulukYuzdesi] [decimal](10,2) NULL,
    [KontrolTarihi] [datetime] NULL
) ON [PRIMARY]
GO

-- İndeksleri de ekleyelim (opsiyonel)
CREATE NONCLUSTERED INDEX [IX_DiskTakip_KontrolTarihi] ON [dbo].[DiskTakip]
(
    [KontrolTarihi] ASC
) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [IX_DiskTakip_Instance_Host_Disc] ON [dbo].[DiskTakip]
(
    [instance] ASC,
    [host] ASC,
    [disc] ASC
) ON [PRIMARY]
GO

Aşağıdaki procedure ile verilerimizi ekleme işlemi yapıyoruz. Aynı zamanda değerleri diske kaydetmiş oluyoruz.

use DBAMON
GO
CREATE OR ALTER PROCEDURE dbo.prc_DiskAlanKaydetVeUyar_HTML
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @HostName NVARCHAR(255) = HOST_NAME();
    DECLARE @InstanceName NVARCHAR(255) = @@SERVERNAME;
    DECLARE @KontrolTarihi DATETIME = GETDATE();
    DECLARE @Threshold DECIMAL(5,2) = 80.00;  -- %80 üzeri doluluk uyarısı eşiği
    DECLARE @MailBody NVARCHAR(MAX) = N'';
    DECLARE @Count INT;

    ;WITH DiskBilgisi AS
    (
        SELECT 
            vs.volume_mount_point AS DriveLetter,
            MAX(vs.total_bytes) / 1024.0 / 1024.0 AS TotalMB,
            MAX(vs.available_bytes) / 1024.0 / 1024.0 AS FreeMB
        FROM sys.master_files AS f
        CROSS APPLY sys.dm_os_volume_stats(f.database_id, f.file_id) AS vs
        GROUP BY vs.volume_mount_point
    )
    INSERT INTO dbo.DiskTakip (instance, host, disc, kalanAlan, dolulukYuzdesi, KontrolTarihi)
    SELECT 
        @InstanceName AS instance,
        @HostName AS host,
        d.DriveLetter AS disc,
        CAST(d.FreeMB / 1024.0 AS DECIMAL(10,2)) AS kalanAlan_GB,  -- GB cinsinden
        CAST(100 - ((d.FreeMB / d.TotalMB) * 100) AS DECIMAL(10,2)) AS dolulukYuzdesi,
        @KontrolTarihi AS KontrolTarihi
    FROM DiskBilgisi AS d;

    ------------------------------------------------------------
    -- %80 üzeri diskleri bul
    ------------------------------------------------------------
    SELECT @Count = COUNT(*) 
    FROM dbo.DiskTakip
    WHERE KontrolTarihi = @KontrolTarihi
      AND dolulukYuzdesi >= @Threshold;

    IF (@Count > 0)
    BEGIN
        -- HTML tablo oluştur
        SET @MailBody = 
        N'<html>
        <head>
        <style>
            body { font-family: Arial, sans-serif; font-size: 13px; color: #333; }
            table { border-collapse: collapse; width: 600px; }
            th, td { border: 1px solid #ccc; padding: 6px; text-align: left; }
            th { background-color: #0078D7; color: white; }
            tr:nth-child(even) { background-color: #f2f2f2; }
            .high { background-color: #ffcccc; font-weight: bold; }
        </style>
        </head>
        <body>' +
        N'<h3>⚠️ Disk Doluluk Uyarısı</h3>' +
        N'<p><b>Sunucu:</b> ' + @HostName + '<br>' +
        N'<b>Instance:</b> ' + @InstanceName + '<br>' +
        N'<b>Kontrol Tarihi:</b> ' + CONVERT(NVARCHAR(20), @KontrolTarihi, 120) + '</p>' +
        N'<table>' +
        N'<tr><th>Disk</th><th>Kalan Alan (GB)</th><th>Doluluk (%)</th></tr>';

        -- Her disk satırını HTML'e ekle
        SELECT 
            @MailBody = @MailBody + 
                N'<tr' + CASE WHEN dolulukYuzdesi >= @Threshold THEN ' class="high"' ELSE '' END + N'>' +
                N'<td>' + disc + N'</td>' +
                N'<td>' + CAST(kalanAlan AS NVARCHAR(20)) + N'</td>' +
                N'<td>' + CAST(dolulukYuzdesi AS NVARCHAR(10)) + N'</td>' +
                N'</tr>'
        FROM dbo.DiskTakip
        WHERE KontrolTarihi = @KontrolTarihi
          AND dolulukYuzdesi >= @Threshold;

        -- Tabloyu ve HTML gövdesini kapat
        SET @MailBody = @MailBody + 
            N'</table><br><p style="color:#666;">Bu e-posta SQL Server tarafından otomatik olarak gönderilmiştir.</p></body></html>';

        -- Mail gönder
		exec msdb.dbo.sysmail_start_sp
        EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'SQLProfile_NAME',  -- Database Mail profili
            @recipients = 'DByonetimi@xxx.gov.tr',  -- Uyarı gidecek e-posta adres(ler)i
            @subject = ' Disk Doluluk Uyarısı - SQL Sunucusu ',
            @body = @MailBody,
            @body_format = 'HTML';
    END
END;
GO

İlgili procedure yapısının çalıştırılması sonucunda

exec dbo.prc_DiskAlanKaydetVeUyar_HTML

Mailimizin başarılı bir şekilde yollandığı görülmektedir.

Veritabanı altına kaydetmiş olduğumuz tablomuzu kontrol edildiğinde değerlerimizin kaydedildiği görülmektedir.

Bu makalede Sunucu üzerinde bulunan Disklerin Boyutunu Mail ile Bildirme ve Tabloya Kaydetme konusunu detaylı bir şekilde görmüş olduk. Başka makalede görüşmek dileğiyle..

“İslâm, güzel ahlâktır.”(Hadis)

Author: Yunus YÜCEL

Bir yanıt yazın

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