批量备份多个数据库
在日常运维中,备份数据库是非常重要的一项任务。如果数据库出现问题,可以快速恢复数据是至关重要的。在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命令或其他方式来删除旧的备份文件,以便释放磁盘空间。定期备份和删除是日常运维必不可少的一项任务,也是数据库恢复的重要保障。