删除超过7天的备份文件

时间:2009-12-13 06:10:41

标签: sql backup

使用osql命令创建数据库的SSQL备份。 它保存到磁盘。 然后重命名以匹配当天的备份日期。 所有这些文件始终保存在一个文件夹中。

例如: Batch1.bat执行以下操作 1)创建backup.bak 2)重命名为备份12-13-2009.bak(这是通过%〜 - etc组合来获取日期参数)

现在,Windows中的任务计划程序每天都会自动进行备份。

是否还可以修改批处理文件以删除超过7天的备份文件?如果是这样,怎么样?

如果通过批处理文件无法实现,除了手动删除文件之外还有其他选择来自动删除作业吗?

提前致谢,Balaji S

4 个答案:

答案 0 :(得分:2)

如果您安装了RoboCopy(Windows Server 2003资源工具包工具的一部分)。

可以将以下行添加到Batch1.bat文件中以移动和删除超过七天的文件:

ROBOCOPY C:\Temp\New C:\Temp\Old *.* /move /minage:7
DEL C:\Temp\Old\*.*

第一行将“新建”文件夹中超过七天的所有文件移动到“旧”文件夹。

第二行删除“旧”文件夹中的所有文件

答案 1 :(得分:0)

我使用相同的技术从数据库进行备份。我已经创建了一个存储过程如下。

Create Procedure [dbo].[CreateBackup]
As
Begin

 Declare @path nvarchar(256),
            @filename nvarchar(256),
   @currentDateTime datetime

 Set @currentDateTime = GetDate()
 Set @path = 'C:\DBBackup\'
 Set @filename = @path + Cast(DatePart(month, @currentDateTime) As nvarchar) + Cast(DatePart(day, @currentDateTime) As nvarchar) + '.bak'

 Backup Database Foo To Disk = @filename

 Set @currentDateTime = DateAdd(day, -3, @currentDateTime)
 Set @filename = 'del ' + @path + Cast(DatePart(month, @currentDateTime) As nvarchar) + Cast(DatePart(day, @currentDateTime) As nvarchar) + '.bak'

 Exec xp_cmdshell @filename

End

要使用xp_cmdshell,您应该先启用它。

http://weblogs.sqlteam.com/tarad/archive/2006/09/14/12103.aspx

答案 2 :(得分:0)

enter code here此过程备份给定指定的@retentionPeriod的数据库到给定的网络位置(或本地)

    USE [master]
GO
/****** Object:  StoredProcedure [dbo].[scrDoRemoteBackup]    Script Date: 12/13/2009 09:20:20 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO



ALTER                proc [dbo].[scrDoRemoteBackup] as
set NoCount on
declare @dbName Varchar(100)
   ,@fName varchar(100)
   ,@RetentionPeriod Int -- in days 
   ,@i int
   ,@n int
   ,@NetPath varchar(400)
   ,@BackupSetName Varchar(300)
   ,@params nvarchar(300)
   ,@q nvarchar(3400)
   ,@cmd nvarchar(4000)
   ,@error int
Declare @DataBases2Backup table(id int identity(1,1),dbName Varchar(100))

-- total back time 4:24 2nd Nov 06
set @NetPath='\\rapidsnet01s\RapidsDbBackup'
set @netPath='\\mail1\RapidsDbBackup'
set @netPath = '\\rapidsweb02p\Backup'
set @netPath='\\BUP2D-2K\_RapidsDB$\SAABZXO1D' -- 26th Feb 2008 - ap/li rapidsweb02p\backup space runout
set @netPath='\\saacsfs\RapidsBackup\SAABZXo1d' -- 22nd Oct 2009
---- insert all databaes to be backed up
--Insert @DataBases2Backup select 'Rapids'
--Insert @DataBases2Backup select 'GDC'
--Insert @DataBases2Backup select 'Master'
--
--
----Insert @DataBases2Backup select 'GDCComDev'
--
--Insert @DataBases2Backup select 'saaNCP'
----Insert @DataBases2Backup select 'US_Reps'
--Insert @DataBases2Backup select 'saaPackageWorx'
--Insert @DataBases2Backup select 'saaExtract'
Insert @DataBases2Backup select 'Master'
Insert @DataBases2Backup select 'QuickPickDBprod'
Insert @DataBases2Backup select 'QuickPickDBStaging'


--Set @RetentionPeriod = 13
Set @RetentionPeriod = 6  -- For Terry McCraith   Jan06'09
select @n= count(*) from @DataBases2Backup
set @i = 1;

-- Set the Network path for the Backup location ; 
-- ( re-establish the connection if the connection was broken)
set @q = 'net use '+@Netpath --+' * /USER:apeiris@armlink.com'
print @q
exec master.dbo.xp_cmdShell @q

While @i <= @n
 Begin
  select @dbName=dbName from @DataBases2Backup where id = @i
  -- Get the backupset name prior to Retention Period 
  set @BackupSetName=@dbName+ dbo.fnGetDateNameBefore(GetDate(),@RetentionPeriod)
  -- Delete the old backup device
  set @q='Del '+@NetPath+'\'+@BackupSetName+'.bkp'
  exec master.dbo.xp_cmdShell @q
  -- Now get the current backupset name and backit up
  set @BackupSetName=@dbName+ dbo.fnGetDateNameBefore(GetDate(),0)
   set @fname = @netPath +'\'+@BackupSetName+'.bkp'
  print 'Fname ='+@fname
  Print 'Drop and Add Dumpdevice ' + @dbname + ' Fname='+@fname
  exec @error=sp_dropDevice @dbname  
  print 'Error drop device-----------'+Convert(varchar,@error)+':'+Convert(varchar,@@error)

  exec @error=sp_addumpDevice 'disk',@dbName,@fname 
  exec sp_helpdevice @dbName
  print 'Error -----------'+Convert(varchar,@error)
  set @i=@i+1
  if @error <> 0
     Begin
   print 'send alert'
      exec  saabzt01p.alerts.dbo.prDispatchAlertV2 'RemoteDBBackupError' ,@@servername,'test','RemoteDBBackupError','test'

     End
  else
      Begin
    Backup Log @dbname with truncate_only
    Backup Database @dbname to @dbname with format
   if @@Error <> 0
   Begin
    print 'Send alert'
    exec  saabzt01p.alerts.dbo.prDispatchAlertV2 'RemoteDBBackupError',@@servername,'test','RemoteDBBackupError','test'
        Goto Errors
   end
      end 
 End

Errors:

这里有支持功能

-- This function returns oldest data set name compared to retentionPeriod
Create     function [dbo].[fnGetDateNameBefore](@d Datetime,@nDays int) returns varchar(40) as
Begin
 declare @OD datetime
    ,@dName Varchar(40);

 set @OD=DateAdd(dd,@nDays * -1,@d)

 select @dName= DateName(yy,@od)+Left(DateName(Month,@od),3)+DateName(dd,@od)
 Return @dName
end

- 与retentionPeriod相比,此函数返回最旧的数据集名称 创建函数[dbo]。[fnGetDateNameBefore](@ d Datetime,@ nDays int)返回varchar(40)as 开始  声明@OD datetime     ,@ dName Varchar(40);

设置@ OD = DateAdd(dd,@ nDays * -1,@ d)

选择@ dName = DateName(yy,@ od)+左(DateName(月,@ od),3)+ DateName(dd,@ od)  返回@dName 端

答案 3 :(得分:0)

不是那样做的。这样做吧。 从命令行使用SQL备份管理器,并使用备份管理器快速编写一个schedlue脚本。它包含在您的SQL bin文件夹中。运行一次,如果它给你一个错误,修改注册表。然后再跑,ot应该工作。执行此方法以定期备份备份。