Назад | Перейти на главную страницу

Очистить файлы резервных копий без xp_cmdshell или планов обслуживания

Задний план:

У нас есть сценарий резервного копирования, для работы которого требуется xp_cmdshell. Я решил, что на новых серверах мы не будем включать xp_cmdshell. Я включил xp_cmdshell при запуске задания и выключил его в конце. Проблема в том, что если начинается полное резервное копирование, а почасовое резервное копирование журнала запускается и заканчивается, оно отключит xp_cmdshell и ежечасное резервное копирование завершится ошибкой.

Это привело меня к попытке определить, выполняется ли задание и т. Д. Но есть ли способ лучше очистить?

Актуальный вопрос:

Как я могу удалить старые файлы резервных копий после успешного выполнения задания резервного копирования?

Он должен быть скриптовым, что исключает планы обслуживания, если я правильно проинформирован.

Он не будет использовать xp_cmdshell, чтобы избежать всего этого взаимодействия с работой и следовать передовой практике.

Наилучший сценарий - позволить ему выполняться из сценария резервного копирования, чтобы файлы резервных копий удалялись после успешного создания резервной копии. Если по какой-либо причине в резервной копии возникла ошибка, это позволяет продолжить резервное копирование для других баз данных.

Предположение: Может быть, сценарий PowerShell поможет? Это можно было бы записать в сценарий на этапе задания и условно выполнить в случае успеха ... но тогда все это происходит в конце, оставляя резервные копии, если мы терпим неудачу на полпути - тогда резервный диск нужно будет вручную очистить, если у нас мало пространство.

Может быть, я просто проверю, выполняется ли почасовая работа, когда я собираюсь отключить xp_cmdshell в почасовой работе. Я, наверное, пойду с этим, но что бы ты сделал?

Я добавляю этап задания к своему заданию резервного копирования после этапа резервного копирования и запускаю версию кода ниже. Это приведет к удалению всех файлов BAK, возраст которых превышает 1 день.

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