Используя сценарии резервного копирования Ola Hallengren, я хочу выполнять резервное копирование каждый час, но сохраняю только 1 резервную копию в день старше 1 дня - PullRequest
0 голосов
/ 23 сентября 2019

У нас есть полное ежечасное резервное копирование, которое действительно накапливается, даже если мы установили для наших операторов Ola Hallengren значение 'cleanuptime = 168', которое удаляет старые резервные копии> 1 недели.Это все еще слишком много резервных копий, и наше дисковое пространство ограничено.Мы не хотим менять частоту или тип резервной копии.Нам нужна очистка, чтобы все резервные копии старше 24 часов, за исключением одного для каждого дня, который выполняется в полночь.Мы рассмотрели возможность использования файловых таблиц для просмотра папки резервных копий, но предпочли бы использовать собственные процессы очистки.Возможно ли то, что мы хотим, через планы обслуживания или даже сценарии Олы?

1 Ответ

0 голосов
/ 23 сентября 2019

В итоге я написал сценарий для работы в 1:30 каждый день.Пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы.

declare @date as datetime
declare @execsql as nvarchar(max)
Declare mycursor cursor for 
WITH BACKUPS AS (
SELECT 
msdb.dbo.backupset.backup_start_date,  
msdb.dbo.backupmediafamily.physical_device_name, ROW_NUMBER() OVER (PARTITION BY CONVERT(CHAR(100), SERVERPROPERTY('Servername')), msdb.dbo.backupset.database_name, CAST(msdb.dbo.backupset.backup_start_date AS date) ORDER BY backup_start_date) AS RN
FROM msdb.dbo.backupmediafamily 
INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id 
where physical_device_name like '%_MSDB%')
SELECT backup_start_date, 'xp_cmdshell ''del ' + physical_device_name + ''''
FROM BACKUPS B
WHERE backup_start_date < DATEADD(DAY,-1,CAST(GETDATE() AS DATE))
AND RN<>1
ORDER BY backup_start_date
open mycursor
fetch next from mycursor into @date, @execsql
while @@FETCH_STATUS = 0
    begin
    print @date
    print @execsql
    exec(@execsql)
    fetch next from mycursor into @date, @execsql
    end
close mycursor
deallocate mycursor
...