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

针对该情况做了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 NULLBEGINinsert into @dblist(db)select  T.namefrom(SELECTname = PARSENAME(LTRIM(RTRIM(T.c.value('.[1]', 'sysname'))),1)FROM(SELECTdatabase_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>'))REQCROSS APPLY REQ.database_name_list.nodes('/c/text()') T(c) ) Tinner join sys.databases don T.name=d.name  and d.state=0WHERE T.name > N''ENDELSEBEGINinsert into @dblist(db)select namefrom sys.databases with(nolock)WHERE state in ( 0 )  --OFFLINE--==============you can filter the system database or notand name not in( 'master', 'tempdb', 'model', 'msdb','distribution' );ENDdeclare @currnpath NVARCHAR(520),@subpath  nvarchar(200)select @subpath=LTRIM( RTRIM(convert(  char(8) ,getdate() ,112)+'_'+@backupType)),@currnpath=  @bakpath+'\'+@subpath+'\'  --RTRIM( @bakpath+'\'+@subpath+'\')DECLARE @temp table(subdirectory varchar(500),depth int)INSERT @tempexec xp_dirtree @bakpath--select * from @tempIF NOT EXISTS(SELECT *FROM @temp where LTRIM( RTRIM(subdirectory))=@subpath)--创建目录EXEC master.sys.xp_create_subdir @currnpathDECLARE @tunid  int,@db sysname,@sql nvarchar(max)while exists(select * from @dblist)BEGINselect @tunid=0,@db=null,@sql=nullselect 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 @sqlEXEC(@sql)DELETE TOP(1)  @dblistWHERE ID=@tunidENDEND

View Code

删除文件目录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
BEGINSET NOCOUNT ONif object_id('tempdb.dbo.#temp','U') IS NOT NULLDROP TABLE #tempCREATE 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 @bakpathupdate #tempset subdirectory=rtrim(ltrim(subdirectory))update #tempset backupType=right(subdirectory,len(subdirectory)-9),backupdate=cast(left(subdirectory,8) as date)delete  #tempwhere backupType<>@backupTypedeclare @sql nvarchar(max)select @sql=N'update  a set isdel=0from #temp ainner join (select top (@top) id  from #temp where backupdate<=getdate()  and backupType=@backupType1 order by backupdate desc)bon b.id=a.id'exec sp_executesql @sql,N'@top int,@backupType1 varchar(10)', @top=@n,@backupType1=@backupType--select * from #tempdeclare @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)beginselect @turnid=null,@subdirectory=nullselect top(1) @turnid=id ,@subdirectory=subdirectory  from #temp where isdel is null--print @bakpath +'\'+ @subdirectoryinsert into @errortb(errorinfo)EXEC('xp_cmdshell ''rd /s/q  ' + @bakpath +'\'+ @subdirectory + '''')delete #temp where id=@turnid    end--select * from @errortb order by idEND

View Code

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

View Code

转载于:https://www.cnblogs.com/llgg/p/5780892.html

backup(full,diff,log)备份并清理过时备份相关推荐

  1. (2.15)备份与还原--使用作业备份、清理过期备份、清理历史记录、事务日志是否备份过...

    一.建立作业备份数据库 打开SQL SERVER MANAGEMENT STUDIO,启动SQL SERVER代理服务(注意在"控制面板-管理工具-服务"中设置SQL SERVER ...

  2. 【Sharepoint】 备份与清理Audit log

    Sharepoint Audit Log 是什么?  就是一个记录用户访问操作Sharepoint的日志的功能.  是给管理员了解当前网站的访问状况, 哪些帐号经常访问哪些站点. 设置方式是进入到Si ...

  3. Oracle 12c数据库定时备份和清理脚本

    RMAN除了可以像sqlplus一样通过SSH执行命令之外,还可以与crontab配合执行预先写好的脚本,实现Oracle数据库的定时自动备份和清理备份数据和归档日志. 本文基于Oracle 12c ...

  4. Centos7搭建Java环境,并设置项目自启动脚本、定时数据库备份/日志清理脚本

    开发环境下载,提供nginx-1.12.2.jdk-8u162.Jenkins下载 建个文件夹,作为开发环境存放路径 cd /usr mkdir developmentEnvironment cd / ...

  5. oracle清理历史备份,oracle数据库备份删除操作

    1.删除多余的归档日志 在ORACLE10G中,默认的归档路径为$ORACLE_BASE/flash_recovery_area.对于这个路径,ORACLE有一个限制,就是默认只能有2G的空间给归档日 ...

  6. Veeam Backup Replication试用(三):配置备份(Backup Job)与恢复(Restore)

    近期veeam 9.5出来了,尝试安装使用,找到老管网络日志相关的文档,分享一下. 转自老管网络日志http://guanjianfeng.com/archives/1159347 ========= ...

  7. 激活黑群晖Synology Active Backup for Business,黑群晖系统备份软件激活,亲测有效

    版本:DSM 6.1.7-15284   DS3617xs   一般都是通用的,除了7.0没有测试,亲测有效 刷这个系统很简单,全套程序下载地址如下: 链接:https://pan.baidu.com ...

  8. windows server : windows server backup 服务(自动定时备份,一次备份,恢复),安装搭建恢复(图形化)

    实验环境: Windows server 2016 ---- 搭建安装环境 图形化使用backup(自动,一次) 恢复 1.搭建安装环境 虚拟机需要需要多加一个硬盘进行备份,硬盘大小的选择,我推荐和要 ...

  9. Veeam Backup Replication 11 - 虚拟、物理和云备份软件

    借助全新 v11 消除数据丢失和勒索软件威胁 发挥数据保护平台的更大价值 Veeam® Backup & Replication® 是一款可靠的四合一解决方案,将备份.复制副本.存储快照和 C ...

最新文章

  1. mxnet加载resnet,进行预测
  2. 学会骗人,是重要的生存技能!
  3. [git]git忽略文件
  4. VS Code 中有哪些好用的 Azure 插件?
  5. 943. Find the Shortest Superstring
  6. 你尝试登录的服务器语言不通,七骑士国内服务器正式上线后,各种登录问题解决方案汇总...
  7. Docker学习总结(32)——Dockerfile指令详解
  8. flutter listview 滚动到底部_Flutter系列之Flex布局详解
  9. jq方法中 $(window).load() 与 $(document).ready() 的区别
  10. swift - enumerated()
  11. jvm gc垃圾回收情况
  12. 2020级CHD新生训练题题解
  13. 如何创建您自己的I爱纽约T恤
  14. OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13
  15. 有关window的history和location的使用
  16. 关于“四舍六入五成双/四舍六入五留双/四舍六入五单双”等口诀的实例研究
  17. 《电子工艺训练》课程笔记(四)————印制电路板设计
  18. opencv 单个圆形孔和针检测
  19. html5 canvas模拟的爆炸效果
  20. Qt实现QChart实时绘制动态曲线,代码可复制移植。

热门文章

  1. JS小数位保留两位小数
  2. 别让用户发呆——设计中的防呆策略
  3. 如何合理的学习Netty?(学习目录)
  4. 【转】C#解析HTML
  5. Hadoop 中文编码相关问题 -- mapreduce程序处理GBK编码数据并输出GBK编码数据
  6. ASP 连接Access2013的accdb文件
  7. 通过Scroller.js制作上拉加载和下拉刷新
  8. angular学习笔记(四)- input元素的ng-model属性
  9. 一种定位内存泄露的方法(Linux)
  10. APK签名导出向导 - Use the Export Wizard