Powershell Disk Alert

Powershell Disk Alert

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&nbsp; "<!--"

add-content $report&nbsp; "td {"

add-content $report&nbsp; "font-family: Tahoma;"

add-content $report&nbsp; "font-size: 11px;"

add-content $report&nbsp; "border-top: 1px solid #999999;"

add-content $report&nbsp; "border-right: 1px solid #999999;"

add-content $report&nbsp; "border-bottom: 1px solid #999999;"

add-content $report&nbsp; "border-left: 1px solid #999999;"

add-content $report&nbsp; "padding-top: 0px;"

add-content $report&nbsp; "padding-right: 0px;"

add-content $report&nbsp; "padding-bottom: 0px;"

add-content $report&nbsp; "padding-left: 0px;"

add-content $report&nbsp; "}"

add-content $report&nbsp; "body {"

add-content $report&nbsp; "margin-left: 5px;"

add-content $report&nbsp; "margin-top: 5px;"

add-content $report&nbsp; "margin-right: 0px;"

add-content $report&nbsp; "margin-bottom: 10px;"

add-content $report&nbsp; ""

add-content $report&nbsp; "table {"

add-content $report&nbsp; "border: thin solid #000000;"

add-content $report&nbsp; "}"

add-content $report&nbsp; "-->"

add-content $report&nbsp; "</style>"

Add-Content $report "</head>"

Add-Content $report "<body>"

add-content $report&nbsp; "<table width='100%'>"

add-content $report&nbsp; "<tr bgcolor='Lavender'>"

add-content $report&nbsp; "<td colspan='7' height='25' align='center'>"

add-content $report&nbsp; "<font face='tahoma' color='#003399' size='4'><strong>Sunucu Disk Raporu</strong></font>"

add-content $report&nbsp; "</td>"

add-content $report&nbsp; "</tr>"

add-content $report&nbsp; "</table>"

add-content $report&nbsp; "<table width='100%'>"

Add-Content $report&nbsp; "<tr bgcolor='Blue'>"

Add-Content $report&nbsp; "<td width='5%' align='center'><B>Disk_Adi</B></td>"

Add-Content $report&nbsp; "<td width='10%' align='center'><B>Sunucu Adi</B></td>"

Add-Content $report&nbsp; "<td width='10%' align='center'><B>DeviceID</B></td>"

Add-Content $report&nbsp; "<td width='10%' align='center'><B>Toplam Boyut</B></td>"

Add-Content $report&nbsp; "<td width='10%' align='center'><B>Boş Alan (GB)</B></td>"

Add-Content $report&nbsp; "<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>&nbsp; <B>$name</B></td>"

Add-Content $report "<td bgcolor= 'White' align=center>&nbsp; <B>$name2</B></td>"

Add-Content $report "<td bgcolor= 'White' align=center>&nbsp; <B>$drive</B></td>"

Add-Content $report "<td bgcolor= 'White' align=center>&nbsp; <B>$disk1</B></td>"

Add-Content $report "<td bgcolor= 'Red' align=center>&nbsp; <B>$disk2</B></td>"

Add-Content $report "<td bgcolor= 'Red' align=center>&nbsp; <B>$disk3</B></td>"

Add-Content $report "</tr>"

$count++

}

}

}

Add-content $report&nbsp; "</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.

 

<span style="font-family: helvetica, arial, sans-serif; font-size: 12pt;">$smtphost = "<span style="color: #ff0000;">smpthostunun ip’si .</span>"

$from = "<span style="color: #ff0000;">relay hakkına sahip mail gönderecek mail adresi</span> "

$email1 = "<span style="color: #ff0000;">gönderilecek kişi veya kişi adresi</span>  "</span>

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.

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.

<span style="font-family: helvetica, arial, sans-serif; font-size: 12pt;"> powershell.exe -file "C:\Scripts\disk.ps1"</span>

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.

Loading