none
Очистка backup-файлов в соответствии с политикой хранения резервных копий RRS feed

  • Вопрос

  • Добрый день!

    Стоит задача: обеспечить автоматическую очистку папки с резервными копиями SQL-баз. Вообще-то для этих целей существует стандартный Maintanance Cleanup Task, в котором можно настроить автоматическое удаление файлов, старше стольких-то дней. Проблема в том, что очистка должна быть многоуровневой. Т.е., нужно не просто удалять все *.bak файлы, старше N дней, а удалять их по двум разным правилам. В частности, по такому алгоритму: 1-й полный бэкап каждого месяца хранить 6 мес., все прочие полные бэкапы - 2 мес. Сами полные бэкапы идут каждую неделю. Имена бэкап-файлов отличаются только датой, пример: Base01_full_2015-10-24.bak. Есть идеи, как можно решить подобную задачу? Спасибо.

    11 ноября 2015 г. 15:16

Ответы

  • День добрый 

    разнесите по папкам название папки - дата типа 20151110

    далее настройте скрипт (ну и джобку) под себя. тут просто удаляются папки с датами старше @daystore

    нужно выложу полный скрипт 

    можно самим добавить оработку ошибок и отправку по мылу сообщений если что не так

    -------

    set nocount on
    if @path is null exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer',N'BackupDirectory',@path OUTPUT, 'no_output';
    if right(@path,1)<>'\' set @path=@path+'\';

    SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)
    SET @path = @path+@fileDate+'\' 
    declare @DirName varchar(2048)
    DECLARE @cmd1 nvarchar(500),@count1 INT; 
    -- Query to check number of backup files in the location.
    IF OBJECT_ID('tempdb..#DirOutput') IS NOT NULL DROP TABLE #DirOutput;
    SET @cmd1 = 'dir ' +@path  
    CREATE TABLE #DirOutput(files varchar(500))
    INSERT INTO #DirOutput EXEC master.dbo.xp_cmdshell @cmd1
     

    SELECT @count1 = COUNT(*) FROM #DirOutput WHERE files LIKE '%<DIR>%[0-9][0-9]%'
    if @count1<=0 return
     
    DECLARE db_cur1 CURSOR FOR  SELECT ltrim(rtrim(substring(files,charindex('<DIR>',files)+5,1000)))  from #DirOutput where  files LIKE '%<DIR>%[0-9][0-9]%'  and datediff(day,ltrim(rtrim(substring(files,charindex('<DIR>',files)+5,1000))),CONVERT(VARCHAR(20),GETDATE(),112))>@DayStore
       OPEN db_cur1  
       FETCH NEXT FROM db_cur1 INTO @DirName
       WHILE @@FETCH_STATUS = 0  
         BEGIN  
           set @cmd1=''
    set @cmd1='RMDIR /S /Q '+@path+'\'+@DirName
                 EXEC master.dbo.xp_cmdshell @cmd1
            FETCH NEXT FROM db_cur1 INTO @DirName
     END
     CLOSE db_cur1
     DEALLOCATE db_cur1


    11 ноября 2015 г. 15:39

Все ответы

  • День добрый 

    разнесите по папкам название папки - дата типа 20151110

    далее настройте скрипт (ну и джобку) под себя. тут просто удаляются папки с датами старше @daystore

    нужно выложу полный скрипт 

    можно самим добавить оработку ошибок и отправку по мылу сообщений если что не так

    -------

    set nocount on
    if @path is null exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer',N'BackupDirectory',@path OUTPUT, 'no_output';
    if right(@path,1)<>'\' set @path=@path+'\';

    SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)
    SET @path = @path+@fileDate+'\' 
    declare @DirName varchar(2048)
    DECLARE @cmd1 nvarchar(500),@count1 INT; 
    -- Query to check number of backup files in the location.
    IF OBJECT_ID('tempdb..#DirOutput') IS NOT NULL DROP TABLE #DirOutput;
    SET @cmd1 = 'dir ' +@path  
    CREATE TABLE #DirOutput(files varchar(500))
    INSERT INTO #DirOutput EXEC master.dbo.xp_cmdshell @cmd1
     

    SELECT @count1 = COUNT(*) FROM #DirOutput WHERE files LIKE '%<DIR>%[0-9][0-9]%'
    if @count1<=0 return
     
    DECLARE db_cur1 CURSOR FOR  SELECT ltrim(rtrim(substring(files,charindex('<DIR>',files)+5,1000)))  from #DirOutput where  files LIKE '%<DIR>%[0-9][0-9]%'  and datediff(day,ltrim(rtrim(substring(files,charindex('<DIR>',files)+5,1000))),CONVERT(VARCHAR(20),GETDATE(),112))>@DayStore
       OPEN db_cur1  
       FETCH NEXT FROM db_cur1 INTO @DirName
       WHILE @@FETCH_STATUS = 0  
         BEGIN  
           set @cmd1=''
    set @cmd1='RMDIR /S /Q '+@path+'\'+@DirName
                 EXEC master.dbo.xp_cmdshell @cmd1
            FETCH NEXT FROM db_cur1 INTO @DirName
     END
     CLOSE db_cur1
     DEALLOCATE db_cur1


    11 ноября 2015 г. 15:39
  • тут просто удаляются папки с датами старше @daystore

    Спасибо за ответ. Не совсем понял, чем тогда это будет отличаться от Maintanance Cleanup Task? Там тоже можно настроить удаление файлов, старше определенной даты. А мне нужно, чтобы первый бэкап каждого месяца оставался нетронутым и хранился дольше остальных. Т.е., он должен быть либо каким-то образом помечен, чтобы его можно было отфильтровать, либо заранее перемещен в другую папку, чтобы джоб его не скушал.

    Можно, конечно, в дополнение к еженедельным, делать месячный бэкап, заливать его в отдельную папку и на нее уже настраивать собственный Cleanup Task. Но это выглядит как-то кривовато...

    12 ноября 2015 г. 6:24
  • Всё это от того, что стандартные средства не дают вам нормальной гибкости. Напишите лучше свой план и реализуйте его при помощи, например, powershell.
    12 ноября 2015 г. 9:18