Friday, August 8, 2008

Utilizando PoweShell con SQL 2005 SMO.

Ultimamente he estado utilizando PowerShell para ir creando un procedimiento para un Disaster Recovery Plan de SQL. En las siguientes entradas iré posteando información sobre como ir haciendo pequeños scripts que nos ayudarán para la administración de servidores SQL y como una herramienta para un DR.

Primeramente es necesario bajar de la página de Microsoft el PowerShell 1.0 y tener instaladas las herramientas de SQL 2005.

Es recomendable bajar la documentación del PowerShell de la misma página de Microsoft, la página que tiene The Mak en Database Journal es muy útil para ir aprendiendo de SQL 2005 con PowerShell, les estaré dando algunos ejemplos prácticos de cómo se puede utilizar como una herramienta para asegurar que se tiene un servidor backup de SQL listo para entrar en operación.

Una de las cosas que se tienen que asegurar siempre en un servidor es tener un respaldo de la configuración del servidor y de las bases de datos, así que voy a empezar con algunos ejemplos para obtener scripts de los servidores SQL.

Para correr los scripts solamente hay que guardar los scripts siguientes como archivo .ps1 y pasar de parámetro el nombre del servidor SQL con el quieren trabajar, por ejemplo: .\script1 "myserver".

Script para Recrear todos los jobs configurados en el servidor:

param (
[string] $serverName
)
$RutaScripts = "c:\scripts\"
void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")
$MyScripter.Options.FileName = $f
$MyScripter.Options.AppendToFile = $true
$MyScripter.Server=$srv
$jobs=$srv.jobserver.jobs

write-host "Obteniendo el script para recrear los jobs..."
$f = [System.IO.Path]::Combine($RutaScripts, $nombre + "_jobs.sql")
out-file -filePath $f -inputobject "USE MASTER `nGO`n"
foreach ($job in $srv.jobserver.jobs) {
$MyScripter.Script($job) >> $f
out-file -filePath $f -inputobject "`n" -append
}

Con este script se obtiene en un archivo de texto todos los jobs configurados en el servidor, con este script se puede configurar un servidor de respaldo en segundos (solamente hay que cambiar la variable Enabled a 0)


Script para recrear todos los logins:
param (
[string] $serverName
)
$RutaScripts = "c:\scripts\"
void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")
$MyScripter.Options.FileName = $f
$MyScripter.Options.AppendToFile = $true
$MyScripter.Server=$srv
write-host "Obteniendo el script para recrear los logins..."
$f = [System.IO.Path]::Combine($RutaScripts, $nombre + "_logins.sql")
out-file -filePath $f -inputobject "USE MASTER `nGO`n"
foreach($login in $srv.logins) {
$MyScripter.options.IncludeDatabaseContext = $true
$MyScripter.Options.IncludeIfNotExists = $true
$MyScripter.Options.ScriptDrops = $true
$MyScripter.Script($login) | out-file $f -append

$MyScripter.Options.IncludeIfNotExists = $true
$MyScripter.Options.ScriptDrops = $false
$MyScripter.Script($login) | out-file $f -append
out-file -filePath $f -inputobject "`n" -append
}

Este script es muy útil también cuando se está configurando un servidor de respaldo, obtiene todos los logins configurados, solamente hay que sustituir el password por el correcto y quitar la línea del disable, ya que por default SQL 2005 crea los logins deshabilitados.

Script para recrear todos los backup devices:
param (
[string] $serverName
)
$RutaScripts = "c:\scripts\"
void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")
$MyScripter.Options.FileName = $f
$MyScripter.Options.AppendToFile = $true
$MyScripter.Server=$srv

out-file -filepath $ArchivoLog -inputobject "$hora Obteniendo el script para recrear los Backup Devices..." -append
write-host "Obteniendo el script para recrear los Backup Devices..."
$f = [System.IO.Path]::Combine($RutaScripts, $nombre + "_Backup_devices.sql")
out-file -filePath $f -inputobject "USE MASTER `nGO`n"

foreach($backup in $srv.backupdevices) {
$MyScripter.Script($backup) | out-file $f -append
out-file -filePath $f -inputobject "`n" -append
}

Con este script como se indica en la descripción se obtiene el script de todos los backup devices, con este script puedes instalar el servidor en segundos.

Script para recrear los linked servers:
param (
[string] $serverName
)
$RutaScripts = "c:\scripts\"
void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$MyScripter=new-object ("Microsoft.SqlServer.Management.Smo.Scripter")
$MyScripter.Options.FileName = $f
$MyScripter.Options.AppendToFile = $true
$MyScripter.Server=$srv

write-host "Obteniendo el script para recrear los linked servers..."
$f = [System.IO.Path]::Combine($RutaScripts, $nombre + "_linked.sql")
out-file -filePath $f -inputobject "USE MASTER `nGO`n"

foreach($linked in $srv.linkedservers) {
$MyScripter.options.IncludeDatabaseContext = $true
$MyScripter.Options.IncludeIfNotExists = $true
$MyScripter.Options.ScriptDrops = $true
$MyScripter.Script($linked) | out-file $f -append

$MyScripter.Options.IncludeIfNotExists = $true
$MyScripter.Options.ScriptDrops = $false
$MyScripter.Script($linked) | out-file $f -append
out-file -filePath $f -inputobject "`n" -append
}
Con este script se genera un script con el que se pueden crear todos los linked server, ojo, hay que recteclear el password y una vez creados cambiar la seguridad, ya que por default SQL los crea con: "Be made using the login's current security context".

En las siguientes posts iré publicando otros scripts que son útiles tambien para recrear usuarios, permisos y otras cosas.

2 comments:

Anonymous said...

como hago encender y apagar el motor sql 2005 desde codigo .net (c#)????

Anonymous said...

Ya lo logre ....! gracias