Resistencia al cambio, abrazar PoSH - Script ejecutar en múltiples servers


Normalmente nos quejamos de los clientes que no quieren hacer cambios, sea nuevos sistemas, tecnologías, versiones o hasta un cambio especifico talvez en una pantalla, pero nosotros mismos somos luego resistentes en cambio, en mi caso por decir soy un poco renuente a aprender Oracle, pero en un nivel aun mas cercano a mi uso diario seria PowerShell (PoSH), el cual aunque sabia de su existencia desde el 2013 (es publico desde el 2006), no lo había utilizado o aprendido.


Debido a una necesidad especifica de mi trabajo tenía que ejecutar un query en múltiples servidores, hablando de alrededor de 350. Normalmente esto lo resolvería que "register serveres" lo cual permite hacer una ejecución en un grupo de servidores y dar resultados conjuntos o en ventanas distintas, lamentablemente por limitaciones no me devolvía los resultados esperados.

Otra opción que intente es usar el CMS (Central managment server) que es una función de SQL Server desde el 2008 R2, admito que nunca había tenido la necesidad de usarla, pero por restricciones de negocio de donde trabajo no se puede usar rápidamente ya que encontré unas limitaciones en varias instancias y arreglarlas me tomaría mucho tiempo. Mis otras opciones serian el uso de aplicaciones de 3rd party.


Recurriendo a ayuda en Twitter en el hashtag #sqlhelp el MVP en PowerShell y Data plataform @Mike_Fal me dio una idea y unos links que me gustaría compartir.


Es un repositorio open source aun en beta pero ya usado en produccion con varios comandos utiles para DBA.


Ofrecido por PASS (Profesional association of SQL Server), son webinars de 1h sobre powershell enfocados a SQL Server


Curso en la Microsoft Virtual Academy por @Mike_Fal, el cual seria un muy buen inicio.

Ahora para mi problema tenía una solución, pero no me satisfacía investigando un poco les dejo el script a continuación, este script toma un archivo .sql como fuente del script a correr y una lista de un .txt de servidores a los que ira a ejecutar dejando los resultados en .csv, como nota les recomiendo que a sus scripts les añadan como primera columna @@servername para poder saber de quién son los resultados.

Requisitos

  • Módulo de SQL Server Powershell (en Windows 10 y 2012 R2 al usar version 3) en otras versiones.

Ejecutar de SQL Server esto lo pueden hacer desde el SSMS conectado a cualquier instancia, con un click derecho y ejecutando PowerShell.


  • Para ejecutar el script tener los permisos adecuados en cada servidor que se ejecutara.
  • La lista de servidores soporta instancias nombradas como server\instancia

La ejecución será en powershell ir al directorio donde están los archivos y escribir ./ExecuteQueryMultiServer.ps1

Recuerden tener su archivo query.sql y servers.txt

 # $servers = @('localhost')
 $servers = 'D:\servers.txt'
 $outfile = 'D:\out.csv'
 $queryfile = 'D:\query.sql'
Get-Content $servers | ForEach-Object {Invoke-SqlCmd -inputfile $queryfile -ServerInstance $_ -Database master | 
                              ConvertTo-CSV -NoTypeInformation |
                              Select-Object -Skip 1 | 
                              Out-File -Append $outFile}

Todo esto me llevo a un pequeño script que me soluciono rápidamente mi necesidad, lamentablemente esta es una parte del mismo ya que lo demás es codigo del cliente o no pertinente a este post. Lo que, si es que en un futuro tendremos cuestiones como Azure, Linux y sistemas híbridos los cuales tendrán en común a PowerShell para su administración y es algo que debemos de aprender y dominar, no solo quedarnos en ser administradores de GUI y en el sistema Windows... en ocasiones tenemos que tomar nuestro propio consejo y adecuarnos a los cambios.

Comentarios

Entradas más populares de este blog

Mover indices no clustered a un nuevo filegroup