Skip to main content

Backup de MS SQL Server

Backups de MS SQLSERVER

Vamos a ver un script sencillo que nos va a permitir realizar backups de SQL Server de Microsoft aunque tengamos la versión Express

El script es bastante sencillo, y debemos de arrancar el Windows Powershell ISE con permisos de Administrador

Una vez arrancado, creamos un archivo nuevo

Escribimos la siguiente sentencia:

Backup-SqlDatabase -ServerInstance "NOMBRE_DEL_SERVIDOR\INSTANCIA_MS_SQL" -Database " BASE_DE_DATOS_A_COPIAR" -BackupFile" C:\CARPETA_DE_COPIAS\BASE_DE_DATOS_A_COPIAR_$(get-date -f yyyy-MM-dd).BAK"

Debes de sustituir los textos (NOMBRE_DEL_SERVIDOR, INSTANCIA_MS_SQL,BASE_DE_DATOS_A_COPIAR, C:\CARPETA_DE_COPIAS) por los datos correspondientes a la instalación. SI tenemos que crear copias de varias bases de datos, generaremos una línea por cada Base de Datos a respaldar

Borrar copias anteriores

Ahora si no tenemos cuidado, llenaremos el disco de copias, para ello es conveniente borrar las copias anteriores a una fecha.

En el mismo script (O en otro nuevo), escribimos lo siguiente:

Get-ChildItem –Path "c:\CARPETA_DE_COPIAS" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-31))} | Remove-Item

Esta línea, nos permite borrar los archivos anteriores a los últimos 31 días. (Get-Date).AddDays(-31))

Copia completa con anclajes mensuales

A continuación vamos a realizar un ejemplo completo con copias diarias y guardaremos una copia mensual durante un año.

Crearemos dos scripts, uno para las copias mensuales y otro para las copias diarias

Script para las copias diarias

Backup-SqlDatabase -ServerInstance "NOMBRE_DEL_SERVIDOR\INSTANCIA_MS_SQL" -Database "BASE_DE_DATOS_A_COPIAR" -BackupFile "C:\CARPETA_DE_COPIAS\DIARIAS\BASE_DE_DATOS_A_COPIAR_$(get-date -f yyyyMMdd).BAK"

Como puedes ver, hemos quitado los guiones de la fecha, puedes usar la versión con o sin guiones ((get-date -f yyyyMMdd).BAK o (get-date -f yyyy-MM-dd).BAK)

Ahora el script de las copias mensuales

Backup-SqlDatabase -ServerInstance "NOMBRE_DEL_SERVIDOR\INSTANCIA_MS_SQL" -Database "BASE_DE_DATOS_A_COPIAR" -BackupFile "C:\CARPETA_DE_COPIAS\MENSUALES\BASE_DE_DATOS_A_COPIAR_$(get-date -f yyyyMM).BAK"

Ahora ejecutaremos el script que gestiona el borrado de las copias antiguas

Get-ChildItem –Path "c:\CARPETA_DE_COPIAS\DIARIAS" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-31))} | Remove-Item

Get-ChildItem –Path "c:\CARPETA_DE_COPIAS\MENSUALES" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-366))} | Remove-Item

Script completo

El script se puede ver a continuación

Diario

Backup-SqlDatabase -ServerInstance "NOMBRE_DEL_SERVIDOR\INSTANCIA_MS_SQL" -Database "BASE_DE_DATOS_A_COPIAR" -BackupFile "C:\CARPETA_DE_COPIAS\DIARIAS\BASE_DE_DATOS_A_COPIAR_$(get-date -f yyyyMMdd).BAK"
Get-ChildItem –Path "c:\CARPETA_DE_COPIAS\DIARIAS" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-31))} | Remove-Item
Get-ChildItem –Path "c:\CARPETA_DE_COPIAS\MENSUALES" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-366))} | Remove-Item

Planificador de tareas

Ahora, deberemos de crear una tarea, que ejecute la copia diaria y la limpieza, todos los días, y una tarea que se ejecutará mensualmente, que realiza la copia mensual de las Bases de Datos

Pendiente:

Veremos la posibilidad de ponerlo todo en un script que ejecute la copia diaria, y si es el último día de mes, o el primer día de mes (Dependiendo de la hora), ejecute la copia mensual.