Vamos a crear backups de forma automática de nuestras bases de datos SQL Server 2017 en Linux.
Usaremos un script que lanzaremos desde el crontab. Así de sencillo.
Preparación del script de backup
El script de backup se compone de un lanzador, por ejemplo Launch_Backup.sh y de un script sql para el backup, por ejemplo, Backup.sql
Preparación del lanzador
Éste lanzador no es estrictamente necesario, vamos a ver que no se trata más que de la invocación a «sqlcmd» para la ejecución del script de sql de backup.
En esta entrada creamos un archivo llamado Launch_Backup.sh con el siguiente contenido:
#!/bin/bash sqlcmd -S localhost -i Backup.sql -U BackupUser -P BackupPassword
Como puede verse, se necesitan las credenciales de conexión con la instancia de base de datos, en el ejemplo, BackupUser y su contraseña BackupPassword.
Puedes crear, si así lo deseas, un usuario especializado en backup.
Creación de un usuario (Login) en SQL Server para realizar backups
Podemos crear un usuario especializado para hacer backups. Por supuesto, valdrá un usuario con el rol de «sysadmin» otorgado, pero podemos realizar uno específico para las tareas de respaldo.
Para crear un login personalizado, hay que crear dicho login y darle rol de «db_backupoperator» en cada una de las bases de datos de las que necesitamos hacer backup.
Preparación del script sql
Ahora crearemos el script de backup, Backup.sql.
Como se puede ver más adelante, es un script bastante completo, donde podemos especificar la ruta de los backup, el nombre del archivo/dispositivo de backup, los días de retención del backup, etc.
DECLARE @name VARCHAR(50) -- database name DECLARE @path VARCHAR(256) -- path for backup files DECLARE @fileName VARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used for file name -- specify database backup directory SET @path = '\\Backups\' -- specify filename format SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) + REPLACE(CONVERT(VARCHAR(20),GETDATE(),108),':','') DECLARE db_cursor CURSOR FOR SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('tempdb') -- exclude these databases OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = @path + @name + '_' + @fileDate + '_FULL' + '.BAK' BACKUP DATABASE @name TO DISK = @fileName WITH RETAINDAYS = 40 FETCH NEXT FROM db_cursor INTO @name END CLOSE db_cursor DEALLOCATE db_cursor
Cualquier duda sobre el script podéis preguntarla en los comentarios.
Programación en crontab
Nada particular en este apartado. Abre el crontab como habitualmente con «crontab -e» y añade la ejecución del backup que hemos preparado.
10 7 * * * /paht/to/LaunchBackup.sh
En este caso, el backup se ejecutará todos los días a las 07:10.
En el archivo .sh, pones todos los comandos, el lanzador y el script?
Hola Mercedes,
En el ejemplo usamos 2 scripts, uno el script de SQL «Backup.sql» y otro BASH «Launch_Backup.sh» que solo vale para lanzar dicho backup.
El primero contiene las sentencias sql, y el segundo es solo la linea de sqlcmd que lanza el script de backup contra la instancia de base de datos desde la linea de comandos del sistema.
Puedes revisar el artículo de nuevo, donde explicamos cada apartado.
Para probar el script de sql puedes hacerlo desde el SQL Management Studio o la herramienta que utilices normalmente para conectar a la instancia, y luego crear el lanzador para automatizarlo, si así te resulta más sencillo.
Hola me funciona perfecto una consulta como puedo hacer el backup de log de la base de datos el .trn ???
Hola disculpa el script esta super, una consulta como puedo hacer el backup de log tendria que crear otro script y agregar algo asi
BEGIN
SET @fileName = @path + @name + ‘_’ + @fileDate + ‘.TRN’
BACKUP LOG @name TO DISK = @fileName
FETCH NEXT FROM db_cursor INTO @name
END
???