zoukankan      html  css  js  c++  java
  • Sql Server 备份文件管理(自动删除、过期)

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

     

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

     

    a. 设置备份过期详情:

     

    删除 Sql Server 备份文件

     

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

     

    Sql Server备份文件管理

     

    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

     

     

     

  • 相关阅读:
    C++ 单例模式
    单链表快速排序
    美团后台面经
    排序算法及其优化总结
    (转)再谈互斥量与环境变量
    互斥锁和自旋锁
    算法题总结----数组(二分查找)
    Linux里的2>&1的理解
    Ubuntu下开启mysql远程访问
    说说eclipse调优,缩短启动时间
  • 原文地址:https://www.cnblogs.com/xunziji/p/2072030.html
Copyright © 2011-2022 走看看