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 :)

Posted in Scripts.

Leave a Reply