Como automatizar backups de bases de dados em SQL Server: passo a passo
Este tutorial mostra como automatizar backups de bases de dados em SQL Server, incluindo backups completos e diferenciais, e como agendar tarefas com o SQL Server Agent. Automatizar backups é útil para proteger dados, cumprir SLAs de recuperação e reduzir o erro humano.
Pré-requisitos
- Instância de SQL Server com o SQL Server Agent activo.
- Permissões de sysadmin ou permissão para criar jobs e executar BACKUP.
- Pasta no disco ou partilha onde guardar os ficheiros .bak.
- SQL Server Management Studio (SSMS) recomendado.
Passo 1: Criar uma pasta para backups e definir permissões
É importante ter uma pasta dedicada para os ficheiros .bak e garantir que a conta do serviço do SQL Server tem permissão de escrita. No Windows, crie por exemplo C:\SQLBackups e atribua Full Control à conta de serviço do SQL Server.
Passo 2: Script T-SQL para backup completo
Crie e teste um script T-SQL para efectuar um backup completo da base de dados. Isto permite validar que o caminho e as permissões estão correctos antes de agendar.
BACKUP DATABASE [MinhaBaseDados]
TO DISK = N'C:\SQLBackups\MinhaBaseDados_FULL.bak'
WITH FORMAT, INIT, NAME = N'MinhaBaseDados-FULL',
COMPRESSION, STATS = 10;
Explicação: WITH FORMAT e INIT reescrevem o ficheiro; COMPRESSION reduz espaço (se suportado); STATS mostra o progresso.
Passo 3: Script T-SQL para backup diferencial
Um backup diferencial é mais pequeno e mais rápido. Execute-o após um backup completo e antes de agendar com maior cadência.
BACKUP DATABASE [MinhaBaseDados]
TO DISK = N'C:\SQLBackups\MinhaBaseDados_DIFF.bak'
WITH DIFFERENTIAL, INIT, NAME = N'MinhaBaseDados-DIFF', STATS = 10;
Erro comum: tentar fazer um diferencial sem um backup completo válido antes — isso provoca falha na restauração.
Passo 4: Criar um Job do SQL Server Agent para backup completo
Utilize o SQL Server Agent para agendar o backup automático. No SSMS, expanda SQL Server Agent > Jobs > New Job. Defina um nome e adicione um Step com o script do Passo 2. Depois crie um Schedule (por exemplo, semanalmente fora do horário de pico).
-- 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
Explicação: este exemplo cria um job, adiciona um passo com o comando T-SQL e agenda semanal às 23:00. Ajuste freq_type/freq_interval/active_start_time conforme necessário.
Passo 5: Criar um Job para backups diferenciais regulares
Crie outro job para executar backups diferenciais com maior frequência (por exemplo, diariamente ou de hora a hora). Utilize o script do Passo 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
Passo 6: Notificações e limpeza de ficheiros antigos
Adicione notificações ao job para enviar e-mail em caso de falha/sucesso e implemente uma política de retenção para não encher o disco (script para apagar .bak antigos).
-- 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
No SQL Server Agent, crie um job step do tipo PowerShell com este script. Erro comum: não testar o script de limpeza manualmente antes de o automatizar.
Verificar o resultado
Valide que os ficheiros .bak são gerados na pasta nas horas previstas e que os jobs aparecem como sucessos no SQL Server Agent. Para confirmar a integridade, restaure um backup para uma base de dados temporária:
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;
Se a restauração for bem-sucedida, os backups estão válidos. Teste também restaurar combinando FULL + DIFFERENTIAL, se aplicável.
Conclusão
Automatizar backups em SQL Server com scripts T-SQL e o SQL Server Agent reduz o risco de perda de dados e simplifica a recuperação. Próximos passos: adicionar backups de logs (transaction log) para RPOs mais baixos, fazer cópias para um local remoto ou para o Azure Blob Storage. Dica: teste sempre a restauração — um backup que não restaura é inútil.