SqlServer如何批量备份多个数据库并删除3天前的备份

批量备份多个数据库

在日常运维中,备份数据库是非常重要的一项任务。如果数据库出现问题,可以快速恢复数据是至关重要的。在SqlServer中,我们可以使用T-SQL脚本来批量备份多个数据库。下面是备份多个数据库的T-SQL脚本示例:

USE master;

GO

DECLARE @dbList TABLE (

dbId integer IDENTITY,

dbName sysname,

path varchar(255),

retention_days integer

);

INSERT INTO @dbList

VALUES ('Database1', 'C:\Backup\Database1', 7),

('Database2', 'C:\Backup\Database2', 7),

('Database3', 'C:\Backup\Database3', 7);

DECLARE @dbCount integer = (SELECT COUNT(*) FROM @dbList);

DECLARE @index integer = 1;

DECLARE @dbName sysname;

DECLARE @path varchar(255);

DECLARE @retention integer;

WHILE @index <= @dbCount

BEGIN

SELECT @dbName = dbName, @path = path, @retention = retention_days

FROM @dbList

WHERE dbId = @index;

BACKUP DATABASE @dbName

TO DISK = @path + '.bak'

WITH COMPRESSION, COPY_ONLY;

SET @index += 1;

END;

以上T-SQL脚本示例中,我们在master数据库下,先创建一个表变量@dbList,用于存储需要备份的数据库的相关信息。然后我们通过INSERT语句向@dbList中插入需要备份的数据库的信息(包括数据库名称、备份路径、备份保留天数)。接下来我们使用WHILE循环语句遍历@dbList中的每个数据库,执行BACKUP DATABASE语句进行备份,备份文件会保存在指定的备份路径下,并开启压缩和复制选项。

删除3天前的备份

在备份数据库之后,为了避免过多的备份文件占用磁盘空间,我们需要及时删除旧的备份文件。下面是删除某个目录下指定日期之前的所有文件的T-SQL脚本示例:

DECLARE @folderPath varchar(255) = 'C:\Backup\';

DECLARE @retentionDays integer = 3;

DECLARE @cmd varchar(8000);

SET @cmd = 'FORFILES /P "' + @folderPath + '" /S /M *.bak /D -' + CAST(@retentionDays AS varchar(10)) + ' /C "CMD /C DEL @PATH"';

EXEC master..xp_cmdshell @cmd;

以上T-SQL脚本示例中,我们使用了xp_cmdshell来执行DOS命令来删除备份文件。其中,@folderPath是需要删除的文件所在目录的绝对路径,@retentionDays是需保留的备份天数。我们使用FORFILES来筛选目录下的所有.bak文件,根据指定日期进行删除。使用xp_cmdshell需要先启用该选项和设置执行账号的权限。

结论

在SqlServer中,我们可以通过编写T-SQL脚本来批量备份多个数据库,并使用DOS命令或其他方式来删除旧的备份文件,以便释放磁盘空间。定期备份和删除是日常运维必不可少的一项任务,也是数据库恢复的重要保障。

数据库标签