sql server 批量备份数据库及删除N天前的备份数据
Posted 巴蒂青葱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server 批量备份数据库及删除N天前的备份数据相关的知识,希望对你有一定的参考价值。
很多时候,我们都需要将数据库进行备份,当服务器上数据库较多时,不可能一个数据库创建一个定时任务进行备份,这时,就需要进行批量的数据库备份操作,好了,废话不多说,具体实现语句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
--开启文件夹权限 GO SP_CONFIGURE \'SHOW ADVANCED OPTIONS\' ,1 RECONFIGURE GO SP_CONFIGURE \'XP_CMDSHELL\' ,1 RECONFIGURE GO DECLARE @FileName VARCHAR (200), @CurrentTime VARCHAR (50), @DBName VARCHAR (100), @SQL VARCHAR (1000), @FilePath VARCHAR (100) --SET @CurrentTime = CONVERT(CHAR(8),GETDATE(),112) + CAST(DATEPART(hh, GETDATE()) AS VARCHAR) + CAST(DATEPART(mi, GETDATE()) AS VARCHAR) --年月日 SET @CurrentTime = CONVERT ( CHAR (8),GETDATE(),112) SET @FilePath = \'F:\\DB_Daily_backup\\\' + @CurrentTime + \' \\ \' --select CONVERT(CHAR(8),GETDATE(),112) --文件夹不存在,则创建 declare @TEMP TABLE(A INT,B INT,C INT)--建立虚拟表,用来判断文件夹是否存在 INSERT @TEMP EXEC [MASTER]..XP_FILEEXIST @FilePath IF NOT EXISTS(SELECT * FROM @TEMP WHERE B=1) BEGIN --XP_CMDSHELL不允许使用变量拼接,所以使用exec方法 declare @EX NVARCHAR(255) SET @EX = \' EXEC XP_CMDSHELL \'\' MKDIR \' + @FilePath + \' \'\' \'; EXEC(@EX) END --获取所有非系统数据库 DECLARE CurDBName CURSOR FOR SELECT NAME FROM Master..SysDatabases where dbid>4 --循环备份数据库 OPEN CurDBName FETCH NEXT FROM CurDBName INTO @DBName WHILE @@FETCH_STATUS = 0 BEGIN --Execute Backup SET @FileName = @FilePath + @DBName + \' _ \' + @CurrentTime SET @SQL = \' BACKUP DATABASE [ \'+ @DBName +\' ] TO DISK = \'\' \' + @FileName + \' .bak \' + \' \'\' WITH NOINIT, NOUNLOAD, NAME = N \'\' \' + @DBName + \' _backup \'\' , NOSKIP, STATS = 10, NOFORMAT\' EXEC (@SQL) --Get Next DataBase FETCH NEXT FROM CurDBName INTO @DBName END CLOSE CurDBName DEALLOCATE CurDBName |
在SQL代理中,建立定时作业,按指定时间定时执行该脚本即可。
更多时候,我们可能需要对备份的文件做一个定时清理,例如清理1年前的文件,以下示例,清楚30天前备份文件夹:(目录:F:\\DB_Daily_backup下30天前文件,-30代表30天前,/ s q表示无提示删除,下面有参数说明)
这里我是删除文件夹,所以使用的是rd命令:del用来删除文件;rd用来删除文件夹
--开启文件夹权限 GO SP_CONFIGURE \'SHOW ADVANCED OPTIONS\',1 RECONFIGURE GO SP_CONFIGURE \'XP_CMDSHELL\',1 RECONFIGURE GO EXEC xp_cmdshell \'forfiles /p F:\\DB_Daily_backup\\ /m * -d -30 /c "cmd /c rd /s /q @path"\'
附:forfiles基本语法介绍
命令
FORFILES [/P pathname] [/M searchmask] [/S]
[/C command] [/D [+ | -] {yyyy-MM-dd | dd}]
方法1:
描述:可以删除7天以前的后缀名为log的日志文件。如今天是6.29,那么会删除6.22
号以前创建的文件。不会删除到回收站。
指定路径为要删除的文件夹路径,该批处理可以放在任意文件夹下。
forfiles /p D:\\aizzw\\LOG /m *.log -d -7 /c "cmd /c del /f @path"
参数解释:
这里的/p 指的是要删除的备份文件路径
/m 指的是要匹配的字符,通配符为*号,后缀名可以根据实际情况修改。
如zzw*.log;*.bak;*.txt
-d 指的是日期,“-d -7”指的是从但前日期当前日期往前减7天。
/c 指的是执行命令
@path 返回文件完整路径
方法2:
描述:可以删除7天以前的后缀名为log的日志文件。
不需要指定路径,必须放在要删除日志的文件下。删除当前文件夹下的匹配文件。
forfiles /m *.log -d -7 /c "cmd /c del /f @path"
引自:https://www.cnblogs.com/wcLT/p/4761236.html
附:del命令参数说明
/F 强制删除只读文件。
/S 从所有子目录删除指定文件。
/Q 安静模式。删除全局通配符时,不要求确认。
/A 根据属性选择要删除的文件。
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S 除目录本身外,还将删除指定目录下的所有文件。用于删除目录树。
/Q 安静模式,带 /S 删除目录树时不要求确认
以上是关于sql server 批量备份数据库及删除N天前的备份数据的主要内容,如果未能解决你的问题,请参考以下文章
sql server 2005怎么自动定时删除3天前的备份文件?
SQL SERVER 2008怎么设置自动删除三天前的数据?
MSSQL Server2012备份所有数据库到网络共享盘上面,并自动删除几天前的备份。。
使用Python批量删除windows下特定目录的N天前的旧文件实战:Windows下批量删除旧文件清除缓存文件解救C盘拒绝C盘爆炸