对于 Sql Server 备份文件的管理,是十分有讲究的,特别是对于磁盘空间不大或者DB服务器过多的管理员来说,真的比较难。同时也比较重要,因为如果不定时清理,磁盘肯定会满,也会导致新的备份无法进行。因为。当然,人工整理备份文件最好,但是却不智能。没办法,只能通过程序来做了。
1. 利用(Maintenance Plans) 中的备份文件过期策略和 清除维护 来管理备份文件
a. 设置备份过期详情:
b.根据磁盘空间,自动覆盖过期备份(Maintenance Plans(维护计划) 中的 清除维护(Maintenance Cleanup) )
Maintenance Plans(维护计划)的详情
2. 利用 job 和 T-Sql 来删除备份文件
这个做法很悲剧,为什么呢?因为上面方法的 job 被禁用掉了,我还说,为什么找不到原因不能删除文件,不认真啊,不过这种查找方法还是蛮能学习的,希望对大家有所帮助
首先,google 一下,却发现,删除 备份文件的都是 这段 SQL:
--删除过期的备份文件
declare @str varchar(100),@dir varchar(100),@fileName varchar(30)
set @dir='del D:\DBtext\jgj\DBABak\'
set @filename=left(replace(replace(replace(convert(varchar,getdate()-15,20),'-',''),' ',''),':',''),8)
set @str=@dir+'fullbak'+@filename+'*.bak'
exec xp_cmdshell @str
set @filename=left(replace(replace(replace(convert(varchar,getdate()-8,20),'-',''),' ',''),':',''),8)
set @str=@dir+'diffbak'+@filename+'*.diff'
exec xp_cmdshell @str
set @filename=left(replace(replace(replace(convert(varchar,getdate()-8,20),'-',''),' ',''),':',''),8)
set @str=@dir+'logbak'+@filename+'*.trn'
exec xp_cmdshell @str
虽然这段 SQL 能达到效果,但是却十分的弱智,十分的不智能
1. 这短Sql 要手工的输入备份文件磁盘地址,要拼参数,拼参数,通用性十分不好,对于不同的 DB,都要再次手工更改,非常不智能!
2. 不能智能的得到哪个备份过期了
之后,我就对这段 Sql 语句进行了改造,改造成了更通用,更智能的删除备份文件:
-- use the cursor to delete the expire bak
-- also could not user the cursor if you only want to delete the top 1 oldest bak
-- @filePath : the expire bak's path
declare fileCursor CURSOR for
SELECT * from
(
SELECT TOP 3 b.physical_device_name
FROM [msdb].[dbo].[backupset] a,[msdb].[dbo].[backupmediafamily] b
where a.media_set_id=b.media_set_id and [expiration_date]<GETDATE()
order by [expiration_date] asc
)
as filetable
declare @filePath varchar(100)
open fileCursor
fetch next from fileCursor into @filePath
while @@fetch_status=0
begin
declare @delCmd varchar(100)
set @delCmd =('del '+@filePath)
-- user xp_cmdshell to delete the bak
exec xp_cmdshell @delCmd
fetch next from fileCursor into @filePath
end
close fileCursor
deallocate fileCursor
虽然这种方法看起来很高科技,但是还推荐你使用第一种方法,除非的sql server 版本过老,不支持 维护计划,另外第二种方法需要开启 xp_cmdshell ,是需要重启 Sql Server 服务的
另外分享一条SQL语句,发现很多同学还不会用,蛮好的,但是不解释了,希望能帮助大家:
with #pager as
(
select FollowID,COUNT(FollowID) as num
from Table2
where FollowType =2 and FollowID>0
group by(FollowID)
)
update Table1 set FollowCount=FollowCount+num
from #pager as p,Table3 c
where p.FollowID=c.ID