Задний план:
У нас есть сценарий резервного копирования, для работы которого требуется 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