backup(full,diff,log)备份并清理过时备份

需求说明:每天备份数据库,但是备份文件长期积累不删除,极大的浪费磁盘空间,

针对该情况做了2个sp来解决



备份sp: dbo.dba_db_backup

可以做全备,差备,日志备

备份的目录格式 YYYYMMDD_FULL/DF/LOG

/*
editor:Lynn
function desc:
    backup full/diff database   backup log
    backupdir @bakpath\YYYYMMDD_FULL/DF/LOG
exec demo:
EXEC DBO.dba_db_backup
EXEC DBO.dba_db_backup  N‘lynntest,SSB3‘,N‘D:\DbBak‘,N‘FULL‘
*/
create PROC DBO.dba_db_backup
 @db_list nvarchar(2000)=NUll    -- NULL:all db except system db,  N‘lynntest,SSB3‘
    ,@bakpath nvarchar(1000)=N‘D:\BackupDB‘    --N‘D:\bak‘
    ,@backupType nvarchar(4)=N‘FULL‘    --DEFAULT: FULL   --FULL全备份  DF差异备份 LOG日志备份
AS
BEGIN
set nocount on;
/*
    select @db_list=N‘lynntest,SSB3‘
            ,@bakpath =N‘D:\bak‘
            ,@backupType=N‘LOG‘  --DB全备份  DF差异备份 LOG日志备份
*/

    declare  @dblist table (id int identity(1,1), db  sysname)
    IF @db_list IS NOT NULL
    BEGIN
        insert into @dblist(db)
        select  T.name
        from(

            SELECT
                        name = PARSENAME(
                                        LTRIM(RTRIM(T.c.value(‘.[1]‘, ‘sysname‘))),
                                        1
                                )
                    FROM(
                        SELECT
                            database_name_list = CONVERT(xml,
                                                        N‘<c><![CDATA[‘
                                                        + REPLACE(
                                                            REPLACE(
                                                                REPLACE(
                                                                    @db_list,
                                                                    CHAR(13),
                                                                    CHAR(10)
                                                                ),
                                                                CHAR(10),
                                                                N‘,‘
                                                            ),
                                                            N‘,‘,
                                                            N‘]]></c><c><![CDATA[‘
                                                        )
                                                        + N‘]]></c>‘
                                                    )

                    )REQ
                        CROSS APPLY REQ.database_name_list.nodes(‘/c/text()‘) T(c)
                ) T
                inner join sys.databases d
                    on T.name=d.name  and d.state=0
                WHERE T.name > N‘‘
        END
    ELSE
    BEGIN
        insert into @dblist(db)
        select name
        from sys.databases with(nolock)
        WHERE state in ( 0 )  --OFFLINE
        --==============you can filter the system database or not
        and name not in( ‘master‘, ‘tempdb‘, ‘model‘, ‘msdb‘,‘distribution‘ );
    END

        declare @currnpath NVARCHAR(520)
            ,@subpath  nvarchar(200)

        select @subpath=LTRIM( RTRIM(convert(  char(8) ,getdate() ,112)+‘_‘+@backupType))
            ,@currnpath=  @bakpath+‘\‘+@subpath+‘\‘  --RTRIM( @bakpath+‘\‘[email protected]+‘\‘)

        DECLARE @temp table(subdirectory varchar(500),depth int)
        INSERT @temp
        exec xp_dirtree @bakpath
        --select * from @temp

        IF NOT EXISTS(
            SELECT *
            FROM @temp where LTRIM( RTRIM(subdirectory))=@subpath
        )
        --创建目录
        EXEC master.sys.xp_create_subdir @currnpath

        DECLARE @tunid  int,@db sysname,@sql nvarchar(max)
        while exists(select * from @dblist)
        BEGIN
            select @tunid=0,@db=null,@sql=null
            select top(1) @tunid =id,@db=db from @dblist
            select @sql=‘BACKUP ‘+ CASE @backupType
                                        WHEN N‘log ‘ THEN N‘LOG ‘
                                        ELSE N‘DATABASE ‘
                                    END+ @db +char(10)+‘TO DISK =N‘‘‘+@currnpath+@db
                                    +CASE @backupType
                                        WHEN N‘log‘ THEN N‘.trn‘‘ ‘
                                        ELSE N‘.bak‘‘ ‘
                                    END+CHAR(10)
                                    +CASE @backupType
                                        WHEN N‘DF‘ THEN N‘  WITH DIFFERENTIAL, COMPRESSION ‘
                                        ELSE N‘  WITH COMPRESSION ‘
                                    END
            --PRINT @sql
            EXEC(@sql)
            DELETE TOP(1)  @dblist
            WHERE ID=@tunid
        END

END

删除文件目录sp:dbo.dba_db_backup_delDir

删除以上sp生成的格式化目录 ,

/*
editor:Lynn
function dec:
    delete expired backup dirs
exec demo:
  exec dba_db_backup_delDir N‘D:\DbBak‘    ,N‘FULL‘,1    

*/
alter proc dbo.dba_db_backup_delDir
    @bakpath nvarchar(1000)=N‘D:\BackupDB‘    --N‘D:\bak‘
    ,@backupType varchar(10)=N‘FULL‘    --DEFAULT: FULL   --FULL全备份  DF差异备份 LOG日志备份
    ,@n int=2                     --保留最近n次相关备份
AS
BEGIN
    SET NOCOUNT ON
    if object_id(‘tempdb.dbo.#temp‘,‘U‘) IS NOT NULL
        DROP TABLE #temp
    CREATE table #temp (id int identity(1,1),subdirectory varchar(500),depth int,backupType  varchar(10),backupdate date,isdel int)
    INSERT #temp(subdirectory,depth)
    exec xp_dirtree @bakpath

    update #temp
    set subdirectory=rtrim(ltrim(subdirectory))

    update #temp
    set
        backupType=right(subdirectory,len(subdirectory)-9)
        ,backupdate=cast(left(subdirectory,8) as date)

    delete  #temp
    where backupType<>@backupType

    declare @sql nvarchar(max)
    select @sql=N‘update  a
        set isdel=0
    from #temp a
    inner join
    (
        select top (@top) id  from #temp
        where
            backupdate<=getdate()  and [email protected]
        order by backupdate desc
    )b
    on b.id=a.id‘
    exec sp_executesql @sql,N‘@top int,@backupType1 varchar(10)‘, @top=@n,@backupType1=@backupType
    --select * from #temp
    declare @errortb table(id int identity(1,1),errorinfo nvarchar(200))
    declare @turnid int,@subdirectory varchar(500)
    while exists (select * from #temp where isdel is null)
    begin
        select @turnid=null,@subdirectory=null
        select top(1) @turnid=id ,@subdirectory=subdirectory  from #temp where isdel is null

        --print @bakpath +‘\‘+ @subdirectory
        insert into @errortb(errorinfo)
        EXEC(‘xp_cmdshell ‘‘rd /s/q  ‘ + @bakpath +‘\‘+ @subdirectory + ‘‘‘‘)
        delete #temp where id=@turnid
    end
    --select * from @errortb order by id

END

note:

1 创建JOb定时备份和清理目录,可以采用 dbo.dba_db_backup调用dbo.dba_db_backup_delDir简化job创建

2 sp中有创建和删除目录,所以需要开启高级选项

-- 允许配置高级选项
EXEC sp_configure ‘show advanced options‘, 1
GO
-- 重新配置
RECONFIGURE
GO
-- 启用xp_cmdshell
EXEC sp_configure ‘xp_cmdshell‘, 1
GO
--重新配置
RECONFIGURE
GO

时间: 2024-08-01 05:13:45

backup(full,diff,log)备份并清理过时备份的相关文章

MySQL 5.7.10 自动备份、自动清理旧备份集

http://blog.csdn.net/mchdba/article/details/51527081 MySQL版本是5.7.10-log社区版本,需要进行备份,但是备份时间长了后,磁盘不够用,所以需要对指定旧的备份集合进行清理工作. 1,mysqldump备份脚本 备份脚本为,里面有几个需要注意的参数: (1)--master-data=2 :这个参数可以在搭建从库的时候,记录当前备份的复制点信息. (2)--extended-insert=false:这个在形成sql语句的时候,一条记录

MySQL 5.7.10 自动备份、自动清理旧备份集(转)

1,mysqldump备份脚本 备份脚本为,里面有几个需要注意的参数: (1)--master-data=2 :这个参数可以在搭建从库的时候,记录当前备份的复制点信息. (2)--extended-insert=false:这个在形成sql语句的时候,一条记录一个insert语句 (3)--single-transaction:来保证备份的一致性,实际上它的工作原理是设定本次会话的隔离级别为:REPEATABLE READ,以确保本次会话(dump)时,不会看到其他会话已经提交了的数据. 备份脚

如何使用windows自动任务实现oracle数据备份及清理

很多时候,我们需要通过客户机进行oracle的备份,这里我们通过使用windows的自动任务来实现oracle的自动备份及备份的清理 自动任务的使用略 1.建立自动备份脚本 @echo off @echo ================================================ @echo  windows环境下Oracle数据库的自动备份脚本 @echo  说明:启动备份时,需要配置以下变量 @echo    1.BACKUP_DIR           指定要备份到哪

Symantec Backup Exec 2014 备份Exchange 2013之五备份DAG

依次执行如下操作,进入到账户配置页面 可以看到当前的系统登陆服务账号为之前配置的服务账号BackupExecUser 首先登录到[email protected]这个账户,收件箱有如下邮件 删除收件箱中的邮件 选中DAG,然后点击一次性备份旁的下拉三角 选择"一次性备份至磁盘",这里由于测试功能,就不做计划任务了 点击"测试/编辑凭据" 点击"全部测试" 测试完成后,可以看到成功标示,表示当前服务账号权限OK,能够进行正常备份作业 点击"

Oracle RMAN备份深入解析--联机备份

Oracle RMAN备份深入解析--联机备份 RMAN> backup database plus archivelog;    1.首先,进程使用alter system archivelog current命令完成了日志切换操作.    2.进程将现存所有归档重做日志备份    3.开始执行实际的数据库备份操作,此时会发生一次日志切换(alter system archivelog current),同时RMAN备份剩余的归档重做日志(使用backup archivelog all命令).

完全备份数据和差异备份数据的shell脚本

#!/bin/bash  # # Description: 该脚本功能,以周为单位循环:周五实行完全备份,周六不备份,周日至周四实行差异备份: #              因工作需要,不实行压缩打包的方式,采用cp完全备份,rsync差异备份: #              若要使用该脚本,请直接修改下面的两个参数:BackupPath和DATAPath,其他地方请不要修改: #  DATE: 2017-04-24 22:43:00 # MODIFY DATE: 2017-04-28 10:0

RMAN增量备份-备份保留策略-设置备份集属性

RMAN增量备份:增量备份级别:0,1,2,3,4BACKUP DATABASE也是创建数据库的完整备份,但是这种备份不同于增量备份的0级备份.这种备份不包含增量备份的0级备份,并不支持在此基础上再创建增量备份.1.建立增量级0级的全库备份 C:\Users\Administrator>RMAN 恢复管理器: Release 11.2.0.1.0 - Production on 星期三 12月 17 21:44:29 2014 Copyright (c) 1982, 2009, Oracle a

SQL Server :完整备份,差异备份或事务日志备份,尾部日志备份

事故背景: 突然间数据库无缘无故损坏了,差异备份或事务日志备份在3点才会自动去做,那么如何将2点到2点40之间的数据恢复呢?这就需要通过备份尾部日志进行恢复了. 环境描述: 某公司装了一台SQL Server数据库,为了保证数据库能够在出现故障时及时的修复,管理员做了备份操作,比如说完整备份+差异备份或者完整备份+事务日志备份,而且备份的时间是每隔6个小时做一次完整备份,在每天的1点.6点.12点.18点,6个小时之内是每隔1个小时做一次差异备份事务日志备份,并且和计划任务结合在了一起. 假如现

浅谈oracle逻辑备份、数据泵备份及冷备份

逻辑备份(数据迁移):以逻辑结构为为单位进行的备份跨用户移动数据跨数据库移动数据库为测试保存原始的数据状态对数据库进行版本升级 逻辑导出的注意事项:exp程序在目录中发现同名文件时会直接覆盖,不提示!!exp无法备份无段的空表执行逻辑导出时一定要注意字符集!最好使用包含中文的小表做测试!!导入时的数据和导出时的数据一模一样,导出之后数据库中表的数据变化全都丢失!! 逻辑导出:所有版本都可用,服务器端和客户端都可用 mkdir -p /home/oracle/expbk SQL> create t