您的位置:首页 > 数据库

Sql Server 备份文件管理(自动删除、过期)

2012-10-30 09:21 477 查看
对于 Sql Server 备份文件的管理,是十分有讲究的,特别是对于磁盘空间不大或者DB服务器过多的管理员来说,真的比较难。同时也比较重要,因为如果不定时清理,磁盘肯定会满,也会导致新的备份无法进行。因为。当然,人工整理备份文件最好,但是却不智能。没办法,只能通过程序来做了。

1. 利用 管理计划(Maintenance Plans) 中的备份文件过期策略和 清除维护 来管理备份

a. 设置备份过期详情:



b.根据磁盘空间,自动覆盖过期备份(Maintenance Plans(维护计划) 中的 清除维护(Maintenance Cleanup) )



Maintenance Plans(维护计划)的详情请参阅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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: