Programando backups automáticos y periódicos en SQL Server
Es importantísimo tener copias de seguridad de tus datos, y esas copias de seguridad deben ser automáticas y periódicas.
No sé, imagina que se inunda una sala donde tienes varios servidores.
Te garantizo por experiencia que esos escenarios son reales 😥
El daño sufrido no solo es el daño material de los equipos que queden estropeados, tienes que tener en cuenta el coste de perder todo el trabajo sobre esos equipos, que en ocasiones es muchísimo mayor que el coste del material.
Tener copias de seguridad es fundamental para evitar pérdidas de información.
¿Cómo se programa un backup automático en Microsoft SQL Server?
Para crear copias de seguridad o backups de forma automática utilizaremos sqlcmd
.
sqlcmd
es una herramienta de consola proporcionada por Microsoft SQL Server.
Uso sqlcmd
para interactuar con instancias de bases de datos SQL Server mediante comandos y scripts SQL directamente desde la consola.
Esta herramienta es muy conocida entre administradores de bases de datos y desarrolladores que necesitan ejecutar consultas, comandos y scripts de manera automatizada.
El script SQL que creará un backup es:
BACKUP DATABASE [nombre_base_de_datos] TO DISK = N'ruta_local\nombre_backup.bak' WITH NOFORMAT, NOINIT, NAME = N'nombre_base_de_datos-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
El script anterior lo puedes obtener con el Microsoft SQL Server Managment Studio.
Para ejecutar el script anterior con sqlcmd
usa:
sqlcmd -S instancia_de_base_de_datos -d nombre_base_de_datos -U usuario -P contraseña -Q "script_backup"
Imagina los siguientes parámetros:
- Nombre de instancia de base de datos: \SQLEXPRESS
- Nombre de base de datos: MISDATOS
- Usuario: USER
- Constraseña: PASSWORD
- Ruta donde guardar mi backup: C:\backup\
- Nombre del fichero de backup: MIFICHERO
Con los parámetros anteriores, el script para correr desde sqlcmd
quedaría:
sqlcmd -S localhost\SQLEXPRESS -d MISDATOS -U USER -P PASSWORD -Q "BACKUP DATABASE [MISDATOS] TO DISK = N'C:\backup\MIFICHERO.bak' WITH NOFORMAT, NOINIT, NAME = N'MISDATOS-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10"
Ahora crea un fichero .bat con la línea anterior 🔥
¿Programando una tarea repetitiva en Windows?
Ahora lo que queremos es que el script anterior se ejecute automáticamente, para ello:
Programando una tarea repetitiva en Windows con el Programador de tareas
Como casi cualquier programa de Microsoft, es muy fácil usarlo.
Para abrirlo busca en tus programas el Programador de tareas
A continuación elige crear una nueva tarea.
Elige cada cuanto quieres que se ejecute el backup
Elige día y hora si procede.
Y en iniciar programa elige el fichero .bat que creamos en el punto anterior.
Listo, ya tienes tu backup programado en Windows 🎉
Programando una tarea repetitiva en Windows con herramientas universales en otros Sistema Operativos
Te recomiendo en este punto usar los Cron Job que son nativos tanto en Linux como el Mac.
Si te instalas bash en tu Windows también te funcionará.
Para más detalle acerca de qué son y cómo programar los Cron Jobs te dejo el siguiente artículo.
Crear tareas repetitivas
Crear tareas repetitivas o cron jobs
Copiando el backup en la red
Tienes que tener en cuenta una cosa, hasta ahora te he explicado cómo crear una copia de seguridad en local, pero si el servidor se te escropea, concretamente el disco duro de nada te servirá dicha copia de seguridad.
Deberás de tener esa copia de seguridad en más ubicaciones para garantizar que ante un desastre en el servidor tenga los datos de backup en otro.
Podrías indicarle en el script que te explico del punto uno que en lugar de hacer el backup en local lo hiciera en la red, pero en mi caso el usuario de SQL Server con el que ejecuto el sqlcmd
no tiene privilegios de red, por lo que no puede copiar en red.
¿Cómo lo he resuelto?
Añadiendo al fichero .bat donde tengo el script de backup la siguiente línea:
copy "ruta_fichero_backup_local" "ruta_fichero_backup_en_red"
Imagina los siguiente parámetros:
- Ruta local donde está mi backup: C:\backup\
- Nombre del fichero de backup: MIFICHERO
- Ruta en red donde quiero mi backup: \\datos\server\
El script para copiar quedaría:
copy "C:\backup\MIFICHERO.bak" "\\datos\server\MIFICHERO.bak"
Y vualá, si añadir este script al fichero .bat del punto 1 te quedará:
sqlcmd -S localhost\SQLEXPRESS -d MISDATOS -U USER -P PASSWORD -Q "BACKUP DATABASE [MISDATOS] TO DISK = N'C:\backup\MIFICHERO.bak' WITH NOFORMAT, NOINIT, NAME = N'MISDATOS-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10" copy "C:\backup\MIFICHERO.bak" "\\datos\server\MIFICHERO.bak"
Y cada vez que se ejecute el .bat, ya sea manualmente, con el programador de tareas de Windows o con un Cron Job, se creará en local el backup y a continuación se copiará en la red.
Hasta luego 🖖