我的目标很简单。我想让 SQL Server 连续 5 天每晚备份一次数据库。
因此,每天晚上的某个时间我都希望制作一个新的数据库备份并删除一个备份,以便磁盘上可以连续保存 5 天的数据。
我正在尝试设置一个维护计划来处理这项工作并保存文件(我认为)。我已附加备份,因此单个 bak 文件将包含连续 5 天的数据(不确定这是否有效,因为 SQL 如何知道要删除什么,而删除单个 bak 文件将删除所有备份)。
正如您所知道的,为什么我在弄清楚如何删除数据库的旧备份时遇到问题,以便 Y 在磁盘上只有最新的 5 个备份。
对此有什么建议吗?
答案1
建议的维护计划是一个很好的方法。一种替代方法是使用调用存储过程的计划作业,例如这个;
CREATE PROCEDURE backup_all_databases
@path VARCHAR(255)='c:\backups\'
AS
DECLARE @name VARCHAR(50) -- database name
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
DECLARE @dbIsReadOnly sql_variant -- is database read_only?
DECLARE @dbIsOffline sql_variant -- is database offline?
DECLARE db_cursor CURSOR FOR
SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('tempdb') AND version > 0 AND version IS NOT NULL
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '.bak' -- + '_' + @fileDate + '.BAK'
SET @dbIsReadOnly = (SELECT DATABASEPROPERTY(@name, 'IsReadOnly')) -- 1 = Read Only
SET @dbIsOffline = (SELECT DATABASEPROPERTY(@name, 'IsOffline')) -- 1 = Offline
IF (@dbIsReadOnly = 0 OR @dbIsReadOnly IS NULL) AND @dbIsOffline =0
BEGIN
BACKUP DATABASE @name TO DISK = @fileName WITH INIT
END
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
GO
对其进行调整以将时间戳附加到备份文件名。并添加您需要的任何 expiredate 或 retaindays 参数。如 BOBS 所建议的,您还可以使用维护清理任务来清除超过 5 天的旧备份文件。这为您提供了每天的单独备份。您可以每小时运行一次,也可以在一天中运行 x 次或每天运行一次,无论您需要什么。
答案2
如果您正在使用维护计划,则可以将“维护清理任务”添加到计划中,用于在多天后清理 BAK 文件。只需将此任务放在“备份数据库任务”之后,并将其配置为删除 5 天前的备份文件,就可以了。
HTH,丹
答案3
在 TSQL BACKUP 命令中,有两个可以设置的备份集选项。EXPIREDATE 表示备份过期的日期,RETAINDAYS 表示保留备份的天数。您可以使用 RETAINDAYS 选项并将其设置为 5 天。备份过程将完成剩下的工作。
在维护计划设置中,定义数据库备份任务时您应该会看到类似的选项。您可以指示保留备份的时间。
维护计划中没有选项可以指示要保存的备份数量。