对于 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