PowerShell ile SQL Veritabanı Raporları


Bunun çalışması için SQLPS modülüne ihtiyacınız var. Veya PowerShell uzaktan iletişimini Invoke-Command ile kullanabilmelisiniz. Windows 8.1 masaüstümde ücretsiz SQL 2012 Express sürümüne sahibim; bu sayede öncelikle PowerShell modülüne ve özellikle de masaüstümden herhangi bir SQL sunucusuna bir T-SQL komutu çalıştırmamı sağlayan Invoke-SQLCMD cmdlet'ine erişebiliyorum. Ama bugün bu durum ortada değil.

Bunun yerine SQL Server sağlayıcısından yararlanacağız. SQLPS modülünü içe aktardığınızda, SQLSERVER: adında yeni bir PSDrive alırsınız.

Artık SQL sunucusu örneğimde bir dosya sistemi gibi gezinebiliyorum.

cd .\SQL\jh-win81-ent\default\databases

SQL “klasörüne”, ardından sunucuya (jh-win81-ent-01 benim yerel ana bilgisayarımdır) ve ardından adlandırılmış örneğe, bu durumda Varsayılana ve son olarak Veritabanları konteynerine geçtim.

Artık nereye bakacağımı bildiğim için sadece istediğim bilgiyi görüntülüyorum.

dir sqlserver:\sql\jh-win81-ent\default\databases | 
Select Name,Size,SpaceAvailable,PrimaryFilePath

Bu özellikleri Get-Member kullanarak ve Select *'e yönlendirerek keşfettim.

dir sqlserver:\sql\jh-win81-ent\default\databases | 
Select Name,Size,SpaceAvailable,PrimaryFilePath,
@{Name="Path";Expression={$_.Filegroups.files.filename}},
@{Name="LogPath";Expression={$_.LogFiles.filename}},
@{Name="LogSize";Expression={$_.LogFiles.Size}}

Bu arada boyutlar MB cinsindendir. Sonuçlar PowerShell'deki diğer nesnelere benzer nesnelerdir; böylece bu bilgileri sıralayabilir, filtreleyebilir, dışa aktarabilir, dönüştürebilir veya bu bilgilerle ne yapmanız gerekiyorsa yapın. Sanırım bir HTML raporu oluşturacağım.

$head = @"
<Title>SQL Database Report</Title>
<style>
body { background-color:#FFFFFF;
       font-family:Tahoma;
       font-size:10pt; }
td, th { border:1px solid black; 
         border-collapse:collapse; }
th { color:white;
     background-color:black; }
table, tr, td, th { padding: 2px; margin: 0px }
tr:nth-child(odd) {background-color: lightgray}
tr:nth-child(odd) {background-color: lightgray}
table { width:95%;margin-left:5px; margin-bottom:20px;}
</style>
<br>
<H1>SQL Database Report</H1>
"@

dir sqlserver:\sql\jh-win81-ent\default\databases | 
Select Name,Size,SpaceAvailable,PrimaryFilePath,
@{Name="Path";Expression={$_.Filegroups.files.filename}},
@{Name="LogPath";Expression={$_.LogFiles.filename}},
@{Name="LogSize";Expression={$_.LogFiles.Size}} | 
Convertto-html -Head $head  -PreContent "<H2>$env:Computername</H2>" -PostContent "All sizes are in MB.<br><I>Report run $(Get-Date)</I>" |
Out-File c:\work\sqldbreport.htm

Geçerli kimlik bilgilerinin uzak bir SQL Server'da doğru izinlere sahip olduğunu varsayarsak, bunu uzaktan da yapabilirsiniz. Yoldaki makine adını değiştirmeniz yeterlidir. İşte değiştirilmiş HTML rapor kodum.

$Computername = "Win81-ent-01"

$head = @"
<Title>SQL Database Report - $($computername.ToUpper())</Title>
<style>
body { background-color:#FFFFFF;
       font-family:Tahoma;
       font-size:10pt; }
td, th { border:1px solid black; 
         border-collapse:collapse; }
th { color:white;
     background-color:black; }
table, tr, td, th { padding: 2px; margin: 0px }
tr:nth-child(odd) {background-color: lightgray}
tr:nth-child(odd) {background-color: lightgray}
table { width:95%;margin-left:5px; margin-bottom:20px;}
</style>
<br>
<H1>SQL Database Report</H1>
"@

dir sqlserver:\sql\$computername\default\databases | 
Select Name,Size,SpaceAvailable,PrimaryFilePath,
@{Name="Path";Expression={$_.Filegroups.files.filename}},
@{Name="LogPath";Expression={$_.LogFiles.filename}},
@{Name="LogSize";Expression={$_.LogFiles.Size}} | 
Convertto-html -Head $head  -PreContent "<H2>$Computername</H2>" -PostContent "All sizes are in MB.<br><I>Report run $(Get-Date)</I>" |
Out-File "c:\work\sqldbreport-$computername.htm"

Performans veya zamanlama sorunlarıyla karşılaşırsanız uzaktan iletişimi kullanın.

$sb = {
Import-module SQLPS
dir sqlserver:\sql\$env:computername\default\databases |
Select Name,Size,SpaceAvailable,PrimaryFilePath,
@{Name="Path";Expression={$_.Filegroups.files.filename}},
@{Name="LogPath";Expression={$_.LogFiles.filename}},
@{Name="LogSize";Expression={$_.LogFiles.Size}} 
}

invoke-command -ScriptBlock $sb -ComputerName $computername -HideComputerName | 
Select Name,Size,SpaceAvailable,PrimaryFilePath,Path,LogPath,Logsize |
Convertto-html -Head $head  -PreContent "<H2>$Computername</H2>" -PostContent "All sizes are in MB.<br><I>Report run $(Get-Date)</I>" |
Out-File "c:\work\sqldbreport-$computername.htm"

Alternatif kimlik bilgileri kullanmanız gerekiyorsa veya aynı anda birden fazla SQL Sunucusunu işlemek istiyorsanız uzaktan iletişim harika bir seçenektir.

PowerShell, bir işleme, olay günlüğüne veya SQL Server veritabanına bakıyor olmanızdan bağımsız olarak aynı şekilde çalışır. Temel konularda uzmanlaştıktan sonra başarabileceklerinizin sonu yoktur.

İlgili makaleler