Disklerdeki Boş Alanların Veritabanı Yöneticilerine Mail ile Bildirilmesi
SQL Server’da karşılaştığımız bazı sorunları Powershell yardımı ile çözebiliriz. İş yoğunluğunda dolayı bazen diskler’de ne kadar boş alan kaldığını kontrol edemeyebilirsiniz. Bazen uygulamacıların veritabanında yaptığı habersiz çalışmadan dolayı veritabanı beklenmedik şekilde büyüyerek diskleri doldurabilir veya veritabanı log dosyasının backup’ı alınmadıysa bu log dosyası aşırı büyüyerek bulunduğu diski doldurabilir. Bu tip beklenmedik durumlarla başa çıkabilmek için disk dolmadan haberimiz olması gerekir. Bu makalede disklerdeki boş alan miktarını kontrol ederek veritabanı yöneticilerine mail ile rapor yollayacak powershell script’ini aşağıda bulabilirsiniz.
$reportpath = "c:\Scripts\SQLDisk.htm" # burada raporlamak için kullana if((test-path $reportpath) -like $false) { new-item $reportpath -type file } $smtphost = "" $from = " " $email1 = "" $timeout = "60" $report = $reportpath Clear-Content $report Add-Content $report "<html>" Add-Content $report "<head>" Add-Content $report "<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>" Add-Content $report '<title>Disk Raporu</title>' add-content $report '<STYLE TYPE="text/css">' add-content $report "<!--" add-content $report "td {" add-content $report "font-family: Tahoma;" add-content $report "font-size: 11px;" add-content $report "border-top: 1px solid #999999;" add-content $report "border-right: 1px solid #999999;" add-content $report "border-bottom: 1px solid #999999;" add-content $report "border-left: 1px solid #999999;" add-content $report "padding-top: 0px;" add-content $report "padding-right: 0px;" add-content $report "padding-bottom: 0px;" add-content $report "padding-left: 0px;" add-content $report "}" add-content $report "body {" add-content $report "margin-left: 5px;" add-content $report "margin-top: 5px;" add-content $report "margin-right: 0px;" add-content $report "margin-bottom: 10px;" add-content $report "" add-content $report "table {" add-content $report "border: thin solid #000000;" add-content $report "}" add-content $report "-->" add-content $report "</style>" Add-Content $report "</head>" Add-Content $report "<body>" add-content $report "<table width='100%'>" add-content $report "<tr bgcolor='Lavender'>" add-content $report "<td colspan='7' height='25' align='center'>" add-content $report "<font face='tahoma' color='#003399' size='4'><strong>Sunucu Disk Raporu</strong></font>" add-content $report "</td>" add-content $report "</tr>" add-content $report "</table>" add-content $report "<table width='100%'>" Add-Content $report "<tr bgcolor='Blue'>" Add-Content $report "<td width='5%' align='center'><B>Disk_Adi</B></td>" Add-Content $report "<td width='10%' align='center'><B>Sunucu Adi</B></td>" Add-Content $report "<td width='10%' align='center'><B>DeviceID</B></td>" Add-Content $report "<td width='10%' align='center'><B>Toplam Boyut</B></td>" Add-Content $report "<td width='10%' align='center'><B>Boş Alan (GB)</B></td>" Add-Content $report "<td width='10%' align='center'><B>Boş Alan Yüzdesi (%)</B></td>" Add-Content $report "</tr>" $disk = Get-WmiObject win32_volume | Where-Object {($_.freespace/$_.Capacity) -le '0.2'} if ($disk -ne $null) { $disk | % { if ($_.Name -ne "\\?\Volume{ef35e484-1604-11e5-80b4-806e6f6e6963}\") { $name = $_.Name $name2 = $_.SystemName $drive = $_.DeviceID $disk1 = "{0:N1}" -f( $_.Capacity / 1gb) $disk2 = "{0:N1}" -f( $_.Freespace / 1gb ) $disk3 = "{0:P0}" -f ($_.freespace/$_.Capacity) Add-Content $report "<tr>" Add-Content $report "<td bgcolor= 'White' align=center> <B>$name</B></td>" Add-Content $report "<td bgcolor= 'White' align=center> <B>$name2</B></td>" Add-Content $report "<td bgcolor= 'White' align=center> <B>$drive</B></td>" Add-Content $report "<td bgcolor= 'White' align=center> <B>$disk1</B></td>" Add-Content $report "<td bgcolor= 'Red' align=center> <B>$disk2</B></td>" Add-Content $report "<td bgcolor= 'Red' align=center> <B>$disk3</B></td>" Add-Content $report "</tr>" $count++ } } } Add-content $report "</table>" Add-Content $report "</body>" Add-Content $report "</html>" if($count -gt 0) { $subject = "Disk Monitor" $body = Get-Content "c:\Scripts\SQLDisk.htm" $smtp= New-Object System.Net.Mail.SmtpClient $smtphost $msg = New-Object System.Net.Mail.MailMessage $msg.To.Add($email1) $msg.from = $from $msg.subject = $subject $msg.body = $body $msg.isBodyhtml = $true $smtp.send($msg) }
İlk adım olarak belirlediğimiz disk de yeni bir klasör oluşturup, oluşturduğumuz path’i aşağıda ki kod bloğunda ki reportpath ve aşağıda yer alan body kısmında belirtmemiz gerekiyor. Aşağıdaki örnekte C diski altında Scripts isminde bir klasör oluşturduk.
Yukarıda ki işlem Disklerin Free Space raporunu htm uzantılı raporu kaydetmesi için gereklidir. Mail gönderebilmemiz için smpt, from,mail kısımlarını doldurmamız gerekmektedir. Aşağıda kırmızı ile yazılı alanlara dikkat ederek doldurabilirsiniz.
$smtphost = "smpthostunun ip’si ."
$from = "relay hakkına sahip mail gönderecek mail adresi "
$email1 = "gönderilecek kişi veya kişi adresi "
Yukarıda ki bilgiler girildikten sonra aşağıda seçili olan yere disk de belirlediğimiz yüzdenin altında boş alan kaldığında bize mail atması için gerekli yeri doldurmamız gerekmektedir. aşağıdaki örnekte 0.2 %20 anlamına gelmektedir.
Buraya kadar ki işlemler bittiğinde dosyayı kaydediyoruz. Karışık olmasını engellemek amaçlı başta oluşturduğunuz klasöre kaydedebilirsiniz. Uzantısının “.ps1 ” olmasına dikkat ediniz.
Yazdığımız powershell scriptini SQL Server Job haline getirerek belirli aralıklarla çalışmasını sağlayabilirsiniz. “SQL Server Job Oluşturmak” isimli makalede bu işlemin nasıl yapılacağının detaylarını bulabilirsiniz.
Eğer SQL Server’ın Express Edition’ını kullanıyorsanız job tanımlayamacağınız için Windows’un kendi aracı olan Task Scheduler(Görev Zamanlayıcısı)’ni kullanmamız gerekmektedir. Powershell dosyamızı Task Scheduler’a tanımlamak için yeni not defteri açarak aşağıda ki komutu yazarak “diskfreesize.bat” şeklinde kaydetmeniz gerekmektedir.
powershell.exe -file "C:\Scripts\disk.ps1"
Bu işlemler sonrasında simgeler ve type kısmında yazanlar sizin klasörünüz de de aynı ise doğru yoldasınız 🙂
Task Scheduler toolunu Başlangıç menüsünden açtığımızda Task Scheduler Library üstünde sağ click yapıp Create Task sekmesine tıklıyoruz.
Task Scheduler’ın General kısmında Name yazan bölümde Task’ımızın adını yazıyoruz .
Security Options Bölümünde ikinci kısmı seçmeniz gerekmektedir. Default da “Run only when user is logged on “ kısmı seçili olarak gelir fakat kullanıcı login olmadığında da çalışmasını istediğimiz için ikinci seçeneği yani “ Run whether user İs logged on or not” seçeneğini seçmemiz gerekmektedir.
Triggers kısmından her gün çalışacak şekilde ayarlamaları yapıyoruz.
Actions bölümünden new butonuna tıklıyoruz. Açılan sekmede Browse butonuna tıkladığımızda açılan pencere de oluşturduğumuz powershell dosyamızı kaydetmemiz için kullanacağımız “ .bat” uzantılı dosyayı seçiyoruz ve açılan pencerelerde ki OK butonuna tıklayarak işlemimizi tamamlıyoruz.
İşlemimiz tamamlandı testini yapmak için sağ tuş run seçeneğini seçtikten sonra powershell içerisinde $email1 karşısında yazdığınız maili kontrol edip mailin gelip gelmediğini kontrol ediniz.