Como apagar backups (.bak e .trn) arquivados pelo agente de backups?

Introdução

Muitas empresas utilizam agentes para fazer backups directamente do SQL Server, como o NetBackup, CommVault, etc…

Os agentes podem fazer o backup de uma forma directa, acedendo a instância de SQL Server, porém muitos DBAs preferem fazer o backup utilizando o SQL Server e passando os ficheiros para disco. Desta forma o agente irá buscar os ficheiros de full backup e log backup no disco.

As a principais vantagens da segunda abordagem são:

  • O controle dos backups continua nas mãos dos DBAs.
  • Os ficheiros estarão acessíveis em disco por um tempo definido, não sendo necessário envolver a equipe de backups, caso seja necessário efectuar um restore para uma janela temporal recente.
    • Ainda dentro deste ponto: Os ficheiros estarão no próprio servidor, não sendo necessário transferir uma grande quantidade de dados pela rede.
Na utilização desta abordagem, deve-se ter em atenção:
  • A periodicidade na qual o agente de backup irá buscar os ficheiros em disco.
    • Isso afecta o RPO (Recovery Point Objective).
  • O período de retenção dos ficheiros em disco.
    • Quanto mais melhor… Porém isso é limitado pelo espaço disponível para este fim.
    • Esta decisão afecta o RTO (Recovery Time Objective).
Mas afinal como limpar os ficheiros do disco de uma forma eficiente?
Sempre que o agente de backups copia um ficheiro, um propriedade “Archive” é alterada para false (o valor default é true). Baseado nisso, podemos identificar os ficheiros que já foram arquivados e remove-los.
O seguinte script em Power Shell faz exactamente isso (obrigado pela ajuda Laerte)!

dir ‘D:Backups’ -r -include ‘*.bak’, ‘*.trn’ | where {$_.attributes -match “Normal”} | Remove-Item -Force

Para testar, adicione -WhatIf no fim:

dir ‘D:Backups’ -r -include ‘*.bak’, ‘*.trn’ | where {$_.attributes -match “Normal”} | Remove-Item -Force -WhatIf

Criei um script que basicamente executa este comando num schedule definido. Faça download aqui.

Apenas altere a seguinte linha, definindo o valor do root folder dos backups:

SET @backup_files_root = N’d:sql_backup’ — Define the backup root folder

Após a criação do job, será necessário adicionar um schedule, que definirá a retenção dos ficheiros em disco.

Sumário

Utilizando esta solução conjunta com PowerShell e SQL Server Agent podemos atingir o objectivo de controle da retenção dos ficheiros de backup em disco. Neste pequeno artigo passei uma solução básica, mas que ainda poderá ser melhorada e adaptada as requerimentos do seu ambiente.

 

Espero ter ajudado! Até a próxima :)

Script – Page Restore

Restaurar bases de dados após um desastre não é uma coisa que sonhamos em fazer muitas vezes… Mas quando o problema acontece, temos que agir rápido!

Por este motivo, disponibilizo para download um script que gera o comando de restore do Full Backup, baseado nas páginas que estão presentes na tabela “suspect_pages”.

Como utilizar?
Altere o valor da variável “vBackupPath” e o nome da base de dados na clausula where, no exemplo abaixo é “AdventureWorks2012“.

Com este script, um comando de restore será gerado. Basta copiar, colar e executar.
Atenção: Após a execução deste script será necessário o restore de todos os backups de t-log, até a BD ficar consistente.
Atenção 2: Não execute restore de páginas sem experiência prévia. A probabilidade de problemas pode ser grande. Faça alguns testes com uma DB não produtiva primeiro.
Faça download do scrip aqui. E tenha muito cuidado :)