sábado, 20 de abril de 2019

Respaldar Base de Datos SQL SERVER utilizando Powershell

Power Shell es un poderoso shell desarrollado por Microsoft que nos facilitará la automatización de tareas por medio de la programación de scripts, es la versión mejorada de lo que es la consola MS-DOS de Windows, y mediante esta herramienta podremos automatizar muchas de las tareas que hacemos de manera manual, en este caso vamos a respaldar por medio de PowerShell una base de datos de SQL Server.


Para respaldar una base de datos SQL SERVER es necesario utilizar el comando Backup-SqlDatabase

Lo primero que tenemos que hacer es abir Powershell de preferencia PowerShell ISE, para poder crear nuestros archivos con script.


Una de las ventajas entre muchas otras que tiene PowerShell, es que podemos utilizar clases y funciones que utilizamos en .NET, así que si sabes usar .NET, ya tienes mucho avance en el conocimiento de PowerShell.

Para comenzar debemos instalar las librerías para el manejo de SQL Server. Ya que el comando Backup-sqldatabase no estará disponible hasta descargar las librerías, para descargar las librerías ejecutaremos en la consola de PowerShell el siguiente comando:
 
Install-Module -Name SqlServer
 
Con este comando instalaremos los módulos necesarios para controlar SQL SERVER
desde el PowerShell, es importante ejecutar el comando con derechos de administrador.

Nos aparecerá un mensaje como el siguiente al cual responderemos que Sí


Una vez que confirmamos la solicitud de PowerShell comienza la instalación de los módulos


Una vez terminada la instalación lo que tenemos que hacer es habilitar la ejecución de scripts, ya que viene deshabilitada por default, para habilitar la ejecución de scripts teclearemos el siguiente comando:

Set-ExecutionPolicy Unrestricted


Al ejecutar este comando, nos aparecerá un cuadro de diálogo de confirmación, al confirmar, ya podremos ejecutar scripts sin problemas, es importante que PowerShell, se esté ejecutando como administrador

Ahora procederemos a crear el script que nos permita realizar los respaldos de la base de datos

function exo-basesdatos($instancia)
{
   
    $query = "SELECT name FROM sys.databases where database_id > 6"
    $bd=Invoke-Sqlcmd -Query $query -ServerInstance $instancia -Database master
    return $bd
  
}
function exo-respaldarbases($bd, $instancia)
{
    $fecha = Get-Date -Format ddMMyyyy-HHmmss
    $dir = "C:\BD1", "C:\BD2"
    foreach($a in $bd)
    {
      

       $archivo = "c:\basesdatos\" + $a.name + " $fecha" + ".bak"
       Backup-SqlDatabase -ServerInstance $instancia -Database $a.name -BackupFile $archivo -CopyOnly

       foreach ($b in $dir)
       {
            Copy-Item $archivo -Destination $b
       }

    }
}
$instance = "DESKTOP-BF69QH1\$instancia"
get-fnMensaje $instance
$bd = exo-basesdatos($instance)
$bd
exo-respaldarbases -bd $bd -instancia $instance


En la primera función recibe como parámetro la instancia a la cual haremos el respaldo, buscaremos las bases de datos que se encuentran en la instancia, que no sean de sistema, por eso el operad >6, la variable $bd, sera la encargada de guardar el arreglo resultante de ese query, con el comando Invoke-Sqlcmd ejecutaremos una consulta, como vemos es necesario poner la instancia, el query y la base de datos donde se ejecutará.


function exo-basesdatos($instancia)
{
   
    $query = "SELECT name FROM sys.databases where database_id > 6"
    $bd=Invoke-Sqlcmd -Query $query -ServerInstance $instancia -Database master
    return $bd
  
}


La segunda función respalda las bases de datos y colocara los archivos en las rutas que le indiquemos. Lo primero que hacemos es obtener la $fecha, esto para que el nombre del archivo de respaldo tenga la fecha y la hora del respaldo, la variable $dir, guarda las rutas a las que se copiará el respaldo.

Para realizar el respaldo, es necesario utilizar la función Backup-SqlDatabase, función, como vemos, necesita algunos parámetros, como son la base de datos a respaldar, el archivo como se llamará y la instancia, ademas de algunos parámetros opcionales, como en mi caso -CopyOnly.

Después viene el ciclo, mediante el cual copiaremos los archivos de respaldo a las rutas indicadas en el arreglo $dir

function exo-respaldarbases($bd, $instancia)
{
    $fecha = Get-Date -Format ddMMyyyy-HHmmss
    $dir = "C:\BD1", "C:\BD2"
    foreach($a in $bd)
    {
      

       $archivo = "c:\basesdatos\" + $a.name + " $fecha" + ".bak"
       Backup-SqlDatabase -ServerInstance $instancia -Database $a.name -BackupFile $archivo -CopyOnly

       foreach ($b in $dir)
       {
            Copy-Item $archivo -Destination $b
       }

    }
}

Por ultimo, tenemos la ejecución del archivo, lo que sería el main


$instance = "DESKTOP-BF69QH1\$instancia"
get-fnMensaje $instance
$bd = exo-basesdatos($instance)
$bd
exo-respaldarbases -bd $bd -instancia $instance.

Para ejecutarlo:


Hasta aquí el post, espero haya sido de su agrado y utilidad, cualquier duda que tengan pregunten y les responderé a todos, compartan, comenten, y den clic en algún anuncio.

Saludos

No hay comentarios.:

Publicar un comentario

Sinónimos de palabras similares en SQL SERVER

Buenas tardes. Hace un tiempo publique un post que hablaba sobre Sinónimos en SQL SERVER, sin embargo trataba de sinónimos en en objetos, e...