Limpar arquivos de backup sem xp_cmdshell ou planos de manutenção

2

Histórico:

Temos um script de backup que precisa do xp_cmdshell para ser executado. Eu decidi que em novos servidores, não vamos habilitar o xp_cmdshell. Ativei xp_cmdshell quando o trabalho é iniciado e desligo no final. O problema é que, se um backup completo for iniciado e o backup de log por hora for executado e concluído, ele desativará o xp_cmdshell e o backup por hora falhará.

Isso me leva ao caminho de tentar detectar se um trabalho está em execução, etc. Mas há talvez uma maneira melhor de limpar?

A pergunta atual:

Como posso excluir arquivos de backup antigos após a execução de um trabalho de backup bem-sucedido?

Ele precisa ser programável por script, o que exclui os planos de manutenção se eu for informado corretamente.

Ele não usaria o xp_cmdshell para evitar toda essa interação de trabalho e seguir as boas práticas.

O melhor cenário permitiria que ele fosse executado a partir do script de backup, para que fosse excluído os arquivos de backup depois que um backup bem-sucedido fosse feito. Se houver um erro em um backup por qualquer motivo, isso permitirá que o backup continue para outros bancos de dados.

Especulação: Talvez um roteiro de powershell faria o truque? Isso poderia ser roteirizado em uma etapa de trabalho e executado condicionalmente em caso de sucesso ... mas tudo isso acontece no final, deixando os backups se falharmos no meio - a unidade de backup precisaria ser limpa manualmente se estivermos apertados espaço.

Talvez eu apenas verifique se o trabalho por hora está em execução quando eu vou desligar o xp_cmdshell no trabalho por hora. Eu provavelmente vou com isso, mas o que você faria ?

    
por Sam 21.09.2011 / 02:33

1 resposta

0

Eu adiciono uma etapa de trabalho ao meu trabalho de backup após a etapa de backup e executo uma versão do código abaixo. Isso removeria todos os arquivos BAK com mais de um dia de duração.

declare
    @Ext NVARCHAR(4)
    ,@DelDt VARCHAR(19)
    ,@BackupPath VARCHAR(800)

select
    @Ext = 'bak'
    ,@BackupPath = 'D:\SQLBAK'

SELECT
    @DelDt = CONVERT(VARCHAR(19), DATEADD(hh, -24, GETDATE()), 126)

EXEC master.dbo.xp_delete_file 0, @BackupPath, @Ext, @DelDt
    
por 21.09.2011 / 16:21