Cómo automatizar copias de seguridad de bases de datos en SQL Server: paso a paso
Este tutorial muestra cómo automatizar copias de seguridad de bases de datos en SQL Server, incluyendo copias completas y diferenciales, y cómo programar tareas con el SQL Server Agent. Automatizar copias de seguridad es útil para proteger datos, cumplir SLAs de recuperación y reducir el error humano.
Requisitos previos
- Instancia de SQL Server con el SQL Server Agent activo.
- Permisos de sysadmin o permiso para crear jobs y ejecutar BACKUP.
- Carpeta en el disco o recurso compartido donde guardar los archivos .bak.
- SQL Server Management Studio (SSMS) recomendado.
Paso 1: Crear una carpeta para backups y definir permisos
Es importante tener una carpeta dedicada para los archivos .bak y asegurarse de que la cuenta del servicio del SQL Server tiene permiso de escritura. En Windows, cree por ejemplo C:\SQLBackups y asigne Full Control a la cuenta de servicio del SQL Server.
Paso 2: Script T-SQL para backup completo
Crear y probar un script T-SQL para realizar un backup completo de la base de datos. Esto permite validar que la ruta y los permisos están correctos antes de programar.
BACKUP DATABASE [MinhaBaseDados]
TO DISK = N'C:\SQLBackups\MinhaBaseDados_FULL.bak'
WITH FORMAT, INIT, NAME = N'MinhaBaseDados-FULL',
COMPRESSION, STATS = 10;
Explicación: WITH FORMAT e INIT sobrescriben el archivo; COMPRESSION reduce espacio (si está soportado); STATS muestra el progreso.
Paso 3: Script T-SQL para backup diferencial
Un backup diferencial es más pequeño y más rápido. Ejecútelo después de un backup completo y antes de programarlo con mayor cadencia.
BACKUP DATABASE [MinhaBaseDados]
TO DISK = N'C:\SQLBackups\MinhaBaseDados_DIFF.bak'
WITH DIFFERENTIAL, INIT, NAME = N'MinhaBaseDados-DIFF', STATS = 10;
Error común: intentar hacer un diferencial sin un backup completo válido previo — eso provoca fallo en la restauración.
Paso 4: Crear un Job del SQL Server Agent para backup completo
Utilice el SQL Server Agent para programar el backup automático. En SSMS, expanda SQL Server Agent > Jobs > New Job. Defina un nombre y añada un Step con el script del Paso 2. Después cree un Schedule (por ejemplo, semanalmente fuera del horario punta).
-- Exemplo de criação de job via T-SQL (simplificado)
USE msdb;
GO
EXEC dbo.sp_add_job @job_name = N'Backup_MinhaBaseDados_Full';
GO
EXEC sp_add_jobstep @job_name = N'Backup_MinhaBaseDados_Full',
@step_name = N'FullBackup',
@subsystem = N'TSQL',
@command = N'BACKUP DATABASE [MinhaBaseDados] TO DISK = N''C:\\SQLBackups\\MinhaBaseDados_FULL.bak'' WITH FORMAT, INIT, COMPRESSION, STATS = 10;';
GO
EXEC sp_add_jobschedule @job_name = N'Backup_MinhaBaseDados_Full',
@name = N'WeeklyFull',
@freq_type = 8, -- weekly
@freq_interval = 1, -- every week
@active_start_time = 230000; -- 23:00
GO
EXEC sp_add_jobserver @job_name = N'Backup_MinhaBaseDados_Full';
GO
Explicación: este ejemplo crea un job, añade un paso con el comando T-SQL y programa semanalmente a las 23:00. Ajuste freq_type/freq_interval/active_start_time según sea necesario.
Paso 5: Crear un Job para backups diferenciales regulares
Crear otro job para ejecutar backups diferenciales con mayor frecuencia (por ejemplo, diariamente o cada hora). Utilice el script del Paso 3 como Step.
-- Exemplo T-SQL para job diferencial (resumido)
USE msdb;
GO
EXEC dbo.sp_add_job @job_name = N'Backup_MinhaBaseDados_Diff';
GO
EXEC sp_add_jobstep @job_name = N'Backup_MinhaBaseDados_Diff',
@step_name = N'DiffBackup',
@subsystem = N'TSQL',
@command = N'BACKUP DATABASE [MinhaBaseDados] TO DISK = N''C:\\SQLBackups\\MinhaBaseDados_DIFF.bak'' WITH DIFFERENTIAL, INIT, STATS = 10;';
GO
EXEC sp_add_jobschedule @job_name = N'Backup_MinhaBaseDados_Diff',
@name = N'DailyDiff',
@freq_type = 4, -- daily
@active_start_time = 020000; -- 02:00
GO
EXEC sp_add_jobserver @job_name = N'Backup_MinhaBaseDados_Diff';
GO
Paso 6: Notificaciones y limpieza de archivos antiguos
Añada notificaciones al job para enviar correo en caso de fallo/éxito e implemente una política de retención para no llenar el disco (script para eliminar .bak antiguos).
-- Exemplo simples para apagar ficheiros com mais de 7 dias (PowerShell via job step)
$path = 'C:\SQLBackups'
Get-ChildItem -Path $path -Filter *.bak | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } | Remove-Item -Verbose
En el SQL Server Agent, cree un job step del tipo PowerShell con este script. Error común: no probar el script de limpieza manualmente antes de automatizarlo.
Verificar el resultado
Valide que los archivos .bak se generan en la carpeta en las horas previstas y que los jobs aparecen como éxitos en el SQL Server Agent. Para confirmar la integridad, restaure un backup a una base de datos temporal:
RESTORE DATABASE [MinhaBaseDados_Teste]
FROM DISK = N'C:\SQLBackups\MinhaBaseDados_FULL.bak'
WITH MOVE 'MinhaBaseDados_Data' TO 'C:\SQLData\MinhaBaseDados_Teste.mdf',
MOVE 'MinhaBaseDados_Log' TO 'C:\SQLData\MinhaBaseDados_Teste_log.ldf',
REPLACE, STATS = 10;
Si la restauración tiene éxito, las copias son válidas. Pruebe también restaurar combinando FULL + DIFFERENTIAL, si aplica.
Conclusión
Automatizar copias de seguridad en SQL Server con scripts T-SQL y el SQL Server Agent reduce el riesgo de pérdida de datos y simplifica la recuperación. Próximos pasos: añadir backups de logs (transaction log) para RPOs más bajos, hacer copias a una ubicación remota o a Azure Blob Storage. Consejo: pruebe siempre la restauración — una copia que no restaura es inútil.