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.