Eu tenho uma tarefa Executar SQL em meu fluxo de controle do SSIS que está fazendo backup de vários bancos de dados antes de executar o ETL durante a noite:
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\DQ'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\master'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\Metadata'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\NDS'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\Staging'
GO
BACKUP DATABASE [DQ] TO DISK = N'G:\Backups\DQ\DQ.bak' WITH RETAINDAYS = 3, NOFORMAT, NOINIT, NAME = N'DQ', SKIP, REWIND, NOUNLOAD, STATS = 10
GO
BACKUP DATABASE [master] TO DISK = N'G:\Backups\master\master.bak' WITH RETAINDAYS = 3, NOFORMAT, NOINIT, NAME = N'master', SKIP, REWIND, NOUNLOAD, STATS = 10
GO
BACKUP DATABASE [Metadata] TO DISK = N'G:\Backups\Metadata\Metadata.bak' WITH RETAINDAYS = 3, NOFORMAT, NOINIT, NAME = N'Metadata', SKIP, REWIND, NOUNLOAD, STATS = 10
GO
BACKUP DATABASE [NDS] TO DISK = N'G:\Backups\NDS\NDS.bak' WITH RETAINDAYS = 3, NOFORMAT, NOINIT, NAME = N'NDS', SKIP, REWIND, NOUNLOAD, STATS = 10
GO
BACKUP DATABASE [Staging] TO DISK = N'G:\Backups\Staging\Staging.bak' WITH RETAINDAYS = 3, NOFORMAT, NOINIT, NAME = N'Staging', SKIP, REWIND, NOUNLOAD, STATS = 10
A intenção é reter apenas 3 dias e descartar qualquer coisa mais antiga.
O problema é que os arquivos .bak continuam crescendo e crescendo por uma ou duas semanas, até que a unidade G fique cheia e a tarefa Executar SQL falhe, o que interrompe o ETL noturno.
Parece que o .bak aparentemente não está descartando backups antigos; parece que eu poderia voltar até a última vez que excluí todos os backups para liberar algum espaço em disco naquela unidade G:
A questão é simples: parece que minha Tarefa Execute SQL está errada. Como faço para corrigir isso? Ou é outra coisa?
Minha melhor recomendação para você é usar a já elogiada solução de backup da Ola
Normalmente, uso
backup database ... with init
e excluo os arquivos de backup com mais de X dias.A solução da Ola é uma solução única e muito flexível, para que você possa ajustá-la de acordo com suas necessidades.
Infelizmente, você terá que procurar em outro lugar além do comando BACKUP para fazer o que procura de maneira automática.
Crie um script ou use uma ferramenta de terceiros, como SQLSafe ou RedGate SQL Backup.
Se você ler este breve discurso chamado Backup e a opção maligna RETAINDAYS ( arquivo ), verá que, na verdade, apenas define um sinalizador de expiração que gerará erros se você tentar fazer backup usando o INIT.
Você vai querer mudar para usar uma instrução de backup de:
Crie seu
BackupName
usando uma variável que inclua talvez o tempo de execução do pacote. Converta esse carimbo de data/hora para algo comoyyyymmddm
onde o nome do arquivo de backup completo sai para algo como:DatabaseName_FULL_2015122205.bak
Você pode simplesmente adicionar uma tarefa de processo em seu pacote para executar um comando do PowerShell para excluir arquivos com mais de 3 dias. Seu processo pode ser: