sqlserver的维护计划是强大的,特别是体现在备份、删除过期文件这个方面。
可以创建文件夹、备份多个库、删除过期文件……
不过配置时还是有点烦人,要选择很多东西。
那用语句如何实现呢?
--作业步骤1. 备份所有指定数据库
declare @dbs table(
rownum int identity(1, 1) primary key,
dbname nvarchar(200),
bakpath as n'd:\database_bak\' + dbname + '\' + dbname + '_' + replace(replace(replace(convert(char(19), getdate(), 120), '-', ''),':',''),' ','_') + '.bak'
)
set nocount on
--将所有符合条件的db插入到表变量
insert into @dbs(dbname)
select name
from sys.databases d
where name not in ('master', 'tempdb', 'model', 'msdb', 'ag_test')
and name not like '%monitor%'
order by
name
--遍历表变量中的所有数据库
declare @i int,@imax int,@sql nvarchar(max)
select @i = 1,@imax = max(rownum) from @dbs
while @i <= isnull(@imax, 0)
begin
--创建 dbname 开头的子文件夹
select @sql = 'execute master.dbo.xp_create_subdir n''d:\database_bak\' +
dbname + ''''
from @dbs
where rownum = @i
exec (@sql)
--备份
--2005 要去掉 compression
select @sql = 'backup database [' + dbname + '] to disk = n''' + bakpath +
''' with noformat, noinit, skip, rewind, nounload, compression, stats = 20'
from @dbs
where rownum = @i
exec (@sql)
set @i = @i + 1
end
--作业步骤二. 删除过期文件
declare @olddate datetime
--保留 2 天文件(昨天0点之前文件会被删除)
set @olddate = cast(convert(char(10),getdate(),120) as datetime)-1
execute master.dbo.xp_delete_file
0, --0: 备份文件,1: 维护计划文本报告
n'd:\database_bak\', --文件路径
n'bak', --文件扩展名
@olddate, --在此时间之前的文件一律删除
1 --删除子文件夹中的文件