过去 5 天的 SQL Server 备份作业

cus*_*sco 2 sql-server backup

我们一直在 SQL Server 2012 上进行每晚备份作业,但它附加到.bak文件而不是覆盖,所以在谷歌搜索时我发现master.dbo.xp_delete_file

我注意到我可以在date参数之前一次删除多个备份

我想保留 3 天,因此删除如下:

declare @dt datetime
select @dt=getdate()-3
EXECUTE master.dbo.xp_delete_file 0,N'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\',N'bak',@dt,1
Run Code Online (Sandbox Code Playgroud)

看起来一切正常,但是对于备份,我可以创建这样的文件名吗?(注意 CONCAT() 中的 @today )

declare today varchar(10);
SELECT @today=CONVERT(char(10), GetDate(),126);

BACKUP DATABASE perfMaster TO DISK = CONCAT('D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\perfMaster_',@today,'.bak' 
WITH NOFORMAT, NOINIT,  
NAME = N'Full Database perfMaster Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 20
Run Code Online (Sandbox Code Playgroud)

或者您使用什么方法来完成具有几天历史的备份?

Aar*_*and 7

我使用INIT然后我的完整备份是分开的(并包含一个时间戳以立即查看它们是何时被使用的)。我可以使用任何我想清除旧文件的方法(C#、PowerShell,你有什么,根本不需要知道备份文件的内部结构),而不是使用xp_delete_file- 这是没有记录的,不受支持的,并且可以改变或被在将来的版本甚至服务包中删除。我不明白将多个备份文件塞入同一个文件有什么好处(如果您无论如何都使用日期对文件进行不同的命名,则无法这样做)。我也不知道你为什么需要在CONCAT这里使用,但无论如何,你不能以这种方式在 DDL 中定义表达式。为什么不只是:

DECLARE @backup_file VARCHAR(255) = 'D:\Program Files\Microsoft SQL '
  + 'Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\perfMaster_'
  + CONVERT(CHAR(10), GETDATE(), 126) + '.bak';

BACKUP DATABASE perfMaster TO DISK = @backup_file
  WITH INIT, NAME = N'Full Database perfMaster Backup', 
  SKIP, NOREWIND, NOUNLOAD, STATS = 20;
Run Code Online (Sandbox Code Playgroud)

我还建议:

  • 使用COMPRESSION如果您的版本支持它。
  • 不将您的备份存储在本地 D:\ 驱动器上。如果您丢失了硬盘,您就丢失了数据库备份。


RLF*_*RLF 6

我最近使用 Ola Hallengren 的脚本来支持大约 50 个 SQL Server。请参阅:http : //ola.hallengren.com/并下载他的 MaintenanceSolution.sql。这些脚本赢得了多个奖项,并被广泛使用。

该文档非常好,用于指导备份和其他数据库维护功能。您可以选择备份频率、备份类型、备份保留等等。(过去我们使用 SQL Server 的维护计划,然后使用我们自己的一些代码,现在使用 Ola 的脚本。)

我有一个月的备份保留期,有些备份多一些,有些备份少一些。备份保留期以小时为单位指定,而不是以天为单位,因此您有很大的灵活性。

关于删除文件的一个评论是,理想情况下,您应该对单个文件进行每次备份(或者可能是每天的备份)。这样,当您删除备份时,您只会删除一个备份(或一天的备份。)