Búsqueda de sitios web

Informes de bases de datos SQL con PowerShell


Para que esto funcione necesita el módulo SQLPS. O debería poder utilizar la comunicación remota de PowerShell con Invoke-Command. En mi escritorio de Windows 8.1 tengo la edición SQL 2012 Express gratuita, principalmente para poder tener acceso al módulo PowerShell y específicamente al cmdlet Invoke-SQLCMD que me permite ejecutar un comando T-SQL desde mi escritorio a cualquier servidor SQL. Pero eso no está en el plato hoy.

En su lugar, aprovecharemos el proveedor de SQL Server. Cuando importe el módulo SQLPS, obtendrá un nuevo PSDrive llamado SQLSERVER:.

Ahora puedo navegar por mi instancia de servidor SQL como si fuera un sistema de archivos.

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

Cambié a la “carpeta” de SQL, luego al servidor (jh-win81-ent-01 es mi host local) y luego a la instancia nombrada, en este caso Predeterminada y finalmente al contenedor de Bases de datos.

Ahora que sé dónde buscar, muestro solo la información que quiero.

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

Descubrí estas propiedades usando Get-Member y canalizando a Select *.

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}}

Por cierto, los tamaños están en MB. Los resultados son objetos como cualquier otra cosa en PowerShell, por lo que puedes ordenar, filtrar, exportar, convertir o lo que necesites hacer con esta información. Creo que crearé un informe HTML.

$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

Suponiendo que las credenciales actuales tengan los permisos correctos en un servidor SQL remoto, también puede hacerlo de forma remota. Simplemente cambie el nombre de la máquina en la ruta. Aquí está mi código de informe HTML modificado.

$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"

Si tiene problemas de rendimiento o sincronización, simplemente utilice la comunicación remota.

$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"

La comunicación remota es una excelente opción si necesita usar credenciales alternativas o si desea procesar varios servidores SQL a la vez.

PowerShell funciona igual ya sea que esté viendo un proceso, un registro de eventos o una base de datos de SQL Server. Una vez que domines los fundamentos, lo que puedes lograr no tiene fin.

Artículos relacionados