自己写的MSSQL通用备份代码和监控备份语句(全套)

 目的:1.通用易于移植的备份方案。

2.易于监控备份情况。

3.方便选择不同组合备份方案。

下面先贴上说明:具体能实现的方案说明参见说明文档。

  
  
  
  
  1. 备份方案参数说明 
  2.  
  3.  @Bakdbname Nvarchar(100)         --备份数据库名 
  4. ,@BAKFILE NVARCHAR(100)       --备份集文件路径 
  5. ,@ismirror int        =0            --建立镜像备份集,默认为0不建立,1为建立 
  6. ,@BAKMIRFILE NVARCHAR(100) =NULL    --镜像备份集文件路径,默认是null 
  7.                                --一般设置网络路径例如'\\192.168.6.100\sqlbak\' 
  8. ,@devtype varchar(20) ='DISK'       --备份设备默认'disk' 
  9. ,@D_EXP_DATE INT      =28       --备份集过期时间单位 (天) 默认 28天  
  10. ,@I_EXP_DATE INT      =7       --差异和完整备份过期时间单位(天) 默认  7天 
  11. ,@iit INT             =2        --备份集数目用于交替备份到同备份集 默认2 
  12. ,@DbakBtime int       =3--完整或者差异备份开始时间点 默认 3点 
  13. ,@DbakEtime int       =7--完整或者差异备份结束时间点 默认 7点 
  14.  
  15.  
  16. D备份为完整备份 
  17. I备份为差异备份 
  18. L备份为日志备份 
  19. --  参数说明 
  20.  
  21. --1.备份以最近的该库的D备份作为集合的起点,每个I和D备份为一个备份分块起点并设置每个分块备份的过期时间为 创建时间+@I_EXP_DATE。 
  22.  
  23. --2.当备份分块个数为 @D_EXP_DATE INT/@I_EXP_DATE 个个数的时候且最后的备份分块已经过期,则开始自动切到下一个完整备份集进行备份作业。如果已经是最大的备份集,则从头第一个备份集开始做备份作业 
  24.  
  25. --3.参数设置上需要注意 
  26.      a.@D_EXP_DATE >=@I_EXP_DATE 
  27.      b.@D_EXP_DATE  >0 @I_EXP_DATE>=0 
  28.      c.@iit >=1  代表需要最少保留的历史备份集合为@iit-1个最多设置999个! 
  29.      d.@ismirror ,@BAKMIRFILE 
  30.      @ismirror 确定是否使用镜像备份集为主备份集做一个镜像,如果为1则做, 
  31.      当@ismirror为1的时候@bakmirfile镜像备份集的存放路径(可以是网络路径)参数    一定不能为NULL切需要保证可用! 
  32.      
  33.   程序利用备份参数设置来实现不同的备份方案! 
  34. 设置的@D_EXP_DATE 为一个D备份开始的整体的备份集有效期间隔 
  35.       @I_EXP_DATE为单个D和单个I备份的备份块有效期间隔 
  36. 例如 @I_EXP_DATE=7则代表 从D开始算,每7天需要做一个I备份知道 D备份个数+I备份个数达到@D_EXP_DATE /@I_EXP_DATE(除法使用向上取整)个,且最后的备份区块也过期,则会自动轮换到下一个备份集做D备份。 
  37. 在没有过期的这段时间间隔里,如果执行作业将会进行L备份! 
  38.    
  39. 4.举例来说: 
  40.    
  41.   @D_EXP_DATE ,@I_EXP_DATE,@iit 三个参数将涉及到备份策略下面举例说明。 
  42.    
  43.   支持三种备份方案 
  44.   1.方案为 D+I+L 
  45.   每28天做一次D备份 
  46.   每7天做一次I备份 
  47.   其它时间每小时做一次L备份 
  48.   至少保持一个历史的备份集(既保持最最少28最多56天的历史备份记录) 
  49.    
  50.    
  51.   参数设置如下: 
  52.   @D_EXP_DATE=28  
  53.   @I_EXP_DATE=7 
  54.   @iit=2 
  55.   让任务每小时执行一次来用L备份填充D备份和I备份做完之后的中间未过期时间点的文件!当D备份+I备份个数>=28/7=4 切最后的I备份也已经过期的情况下,则会进行下一个备份集的备份操作,而保留之前这个完全饱和的备份集! 
  56.  
  57. 用户可以定义@DbakBtime ,@DbakEtime 起止时间点来确定做D和I备份的时间范围。例如值允许系统 不是很忙得晚上2点到3点之间做等 
  58.    
  59.    
  60.    
  61.   2.方案为 D+L 
  62.   每7天做一次D备份 
  63.   每小时做L备份 
  64.   参数设置如下: 
  65.   @D_EXP_DATE=7 
  66.   @I_EXP_DATE=7 
  67.   让任务每小时执行一次来用L备份填充D备份和I备份做完之后的中间未过期时间点的文件!当D备份+I备份个数>=7/7=1 且最后的I备份或者D备份也已经过期的情况下,则会进行下一个备份集的备份操作,而保留之前这个完全饱和的备份集! 
  68.   这样就达到了 D+L的备份策略 
  69.    
  70.    
  71.   3.方案为 D 
  72.   每天做一个D 
  73.    
  74.   @D_EXP_DATE=1 
  75.   @I_EXP_DATE=1 
  76.    
  77.     让任务天执行一次(让直行的频率值和定义的@I_EXP_DATE一致,能让程序不会做L备份!因为每次直行备份块都已经过期。)当D备份+I备份个数>=1/11=1 且最后的I备份或者D备份也已经过期的情况下,则会进行下一个备份集的备份操作,而保留之前这个完全饱和的备份集! 
  78.   这样就达到了只做 D的备份策略 
  79.    
  80.    
  81.   如果要更细分的 例如 D备份的时间间隔不是以天为单位 对大型数据库意义不大也不是很现实!所有 备份作业时间间隔都是以天作为单位 
  82.  
  83.    
  84.   4.方案为 D+I 
  85.    
  86.    
  87.   每天10天一个D备份 
  88.   每1天一个I备份 
  89.    
  90.   参数如下 
  91.   @D_EXP_DATE=10 
  92.   @I_EXP_DATE=1 
  93.    
  94.   让任务天执行一次(让直行的频率值和定义的@I_EXP_DATE一致,能让程序不会做L备份!因为每次直行备份块都已经过期。)当D备份+I备份个数>=10/11=1 且最后的I备份或者D备份也已经过期的情况下,则会进行下一个备份集的备份操作,而保留之前这个完全饱和的备份集! 
  95.  这样就实现了D+I备份的备份策略! 
  96.    
  97.    
  98.  
  99. 注释 D备份为完整备份 
  100.      I备份为差异备份 
  101.      L备份为日志备份 
  102.  
  103.  
  104. 该备份任务作业优点如下: 
  105.     快速部署提供便利,只需要在master中建立对应存储过程即可 
  106.     灵活方便,随意设置备份集个数,以及每个备份集的备份文件有效期天数,通过不同参数的设置即可实现各种不同需求的备份方案组合 
  107.     自动覆盖过去备份集,省去对过期备份集的额外处理 
  108.     提供镜像备份集,将备份同时放到两个地方,以防备份出现丢失等意外 
  109.     提供简单快捷的备份任务监控语句,通过语句即可轻松监控每次备份任务的运行情况 
  110. 例如 
  111. 该脚本注意事项: 
  112.     如果设置了多个定时任务,一定要将每个定时任务执行的时间错开,目前的机制是要使用到备份设备,每次备份会自动生成,所以防止互相干扰。如果放到一个定时任务中则可以一起运行。 
  113.     如果要监控备份执行情况,请运行“备份监控语句”查看每个备份的执行情况! 

错误代码含义:

0:执行正常! 11:首次完整备份时间段不合法! 12:备份作业执行异常! 13:镜像备份集参数配置未合格!

 

贴上使用方式的存储过程代码:

 

   
   
   
   
  1. USE [msdb] 
  2. GO 
  3.  
  4. /****** Object:  StoredProcedure [dbo].[USP_Bak_Sche]    Script Date: 2012/12/26 11:24:33 ******/ 
  5. /*作者:泥 巴                ******/ 
  6. /*日期:20130322         ******/ 
  7. SET ANSI_NULLS ON 
  8. GO 
  9.  
  10. SET QUOTED_IDENTIFIER ON 
  11. GO 
  12.  
  13. CREATE PROC [dbo].[USP_Bak_Sche] 
  14.  @Bakdbname Nvarchar(100) --备份数据库名 
  15. ,@BAKFILE NVARCHAR(100)       --备份集文件路径 
  16. ,@ismirror int        =0       --是否建立镜像备份集,默认为0不建立 
  17. ,@BAKMIRFILE NVARCHAR(100) =NULL    --镜像备份集文件路径,默认是null 
  18. ,@devtype varchar(20) ='DISK'       --默认'disk' 
  19. ,@D_EXP_DATE INT      =28       --备份集过期时间单位 (天) 默认 28天  
  20. ,@I_EXP_DATE INT      =7       --差异和完整备份过期时间单位(天) 默认  7天 
  21. ,@iit INT             =2        --备份集数目用于交替备份到同备份集 默认2 
  22. ,@DbakBtime int       =3--完整或者差异备份开始时间点 默认 3点 
  23. ,@DbakEtime int       =7--完整或者差异备份结束时间点 默认 7点 
  24.  
  25.  
  26.  AS 
  27.  BEGIN 
  28.  
  29. if @ismirror=1 begin 
  30. if @BAKMIRFILE is null begin 
  31. print N'用户选择开启镜像备份集,但是镜像备份路径参数@bakmirfile不能为NULL!' 
  32. print N'注意:中途更改这个参数@ismirror会自动在每次做新的备份集的时候才会生效。' 
  33. return 13; 
  34. end 
  35. end 
  36.  
  37. --参数校正 
  38.  
  39. IF @D_EXP_DATE<=0 
  40. BEGIN 
  41.  
  42. SET @D_EXP_DATE=(CASE WHEN @D_EXP_DATE<=0 THEN 1 ELSE @D_EXP_DATE END
  43. PRINT N'备份集参数过期设置@d_exp_date 不能小于1,系统自动修正为1!' 
  44.  
  45. END 
  46.  
  47. IF @D_EXP_DATE<@I_EXP_DATE 
  48.  
  49. BEGIN 
  50.  
  51. SET @D_EXP_DATE=@I_EXP_DATE 
  52. PRINT N'备份块过期值应该小于或等于备份集过期值,参数已经修正为相等!' 
  53.  
  54. END 
  55.  
  56. --set @allbgname='' 
  57. declare @it int                 --循环种子 
  58. ,@baklogicname varchar(20)      --备份集逻辑名 
  59. ,@bakfilename varchar(100)      --备份集路径文件名 
  60. ,@MIRbaklogicname varchar(20)   --镜像备份集逻辑名 
  61. ,@MIRbakfilename varchar(100)   --镜像备份集路径文件名 
  62. ,@bacname Nvarchar(100)         --备份名称 
  63. ,@bacmeidaname Nvarchar(100)    --备份媒体名称 
  64. ,@sql   Nvarchar(2000) 
  65. set @bacname=@Bakdbname+'_BAK' 
  66. set @bacmeidaname=@Bakdbname+'_MEDIA' 
  67. --建立所需要的备份集合 
  68. set @it=1 
  69. while @it<=@iit 
  70. begin 
  71. set @baklogicname='My_bak'convert(varchar(10),@it) 
  72. set @bakfilename=@BAKFILE+@bakdbname+'_BAK'convert(varchar(10),@it)+'.BAK' 
  73. IF NOT EXISTS(SELECT * FROM sys.backup_devices WHERE name=@baklogicname) 
  74. BEGIN 
  75. exec sp_addumpdevice @devtype,@baklogicname,@bakfilename 
  76. end 
  77. IF @ISMIRROR=1 
  78. BEGIN 
  79. set @MIRbaklogicname='MIRROR_'+@baklogicname 
  80. set @MIRbakfilename=@BAKMIRFILE+'MIRROR_'+@bakdbname+'_BAK'convert(varchar(10),@it)+'.BAK' 
  81. IF NOT EXISTS(SELECT 1 FROM sys.backup_devices WHERE name=@MIRbaklogicname) 
  82. BEGIN 
  83. exec sp_addumpdevice @devtype,@MIRbaklogicname,@MIRbakfilename 
  84.  
  85. END 
  86. END 
  87.  
  88. set @it=@it+1 
  89.  
  90. end 
  91.  
  92. --建立当前活动备份集的临时表 
  93.  
  94.  
  95.  
  96. ;WITH CTE_BAKFILE 
  97. AS 
  98. select A.database_name,A.backup_set_id,position, type,first_lsn,last_lsn,checkpoint_lsn,database_backup_lsn,isnull(datediff(d,backup_start_date,expiration_date),0) exp_day from msdb.dbo.backupset a 
  99. join (select database_name,MAX(backup_set_id) backup_set_id from msdb.dbo.backupset 
  100. where database_name=@Bakdbname and type='D' 
  101. group by database_name) b 
  102. on a.backup_set_id=b.backup_set_id and a.database_name=b.database_name 
  103. --找出同组的备份组集合所有 
  104. union all 
  105. select A.database_name,A.backup_set_id,a.position, a.type,a.first_lsn,a.last_lsn,a.checkpoint_lsn,a.database_backup_lsn,isnull(datediff(d,backup_start_date,expiration_date),0) exp_day from msdb.dbo.backupset a 
  106. join ( 
  107. select A.database_name,A.backup_set_id,position, A.type,first_lsn,last_lsn,checkpoint_lsn,database_backup_lsn,isnull(datediff(d,backup_start_date,expiration_date),0) exp_day from msdb.dbo.backupset a 
  108. join (select database_name,MAX(backup_set_id) backup_set_id from msdb.dbo.backupset 
  109. where database_name=@Bakdbname and type='D'  
  110. group by database_name) b 
  111. on a.backup_set_id=b.backup_set_id and a.database_name=b.database_name 
  112. ) b 
  113. on a.database_backup_lsn=b.checkpoint_lsn AND A.database_name=B.database_name 
  114. where a.type <>'D' 
  115.  
  116. select  bf.*,cf.exp_day into #tempbak 
  117. from cte_bakfile cf 
  118. join 
  119. (select  
  120. bcs.backup_set_id, 
  121. bcs.position, 
  122. [BACK_TYPE]=bcs.type, 
  123. [bacname]=bcs.name
  124. bcs.database_name, 
  125. [medianame]=bms.name
  126. [BACdevicename]=bmf.logical_device_name, 
  127. [dev_type]=bmf.device_type, 
  128. [PHYS_DEVICE_NAME]=bmf.physical_device_name, 
  129. bcs.expiration_date, 
  130. --bcs.backup_set_uuid, 
  131. bcs.database_backup_lsn, 
  132. bcs.first_lsn, 
  133. bcs.last_lsn, 
  134. bcs.checkpoint_lsn, 
  135. --bcs.database_creation_date, 
  136. bcs.backup_start_date, 
  137. bcs.backup_finish_date, 
  138. [size/M]=bcs.compressed_backup_size/1024/1024 
  139. from msdb.dbo.backupmediaset bms 
  140. join msdb.dbo.backupmediafamily bmf 
  141. join msdb.dbo.backupset bcs 
  142. on bmf.media_set_id=bcs.media_set_id  
  143. on bms.media_set_id=bmf.media_set_id) bf 
  144. on cf.backup_set_id=bf.backup_set_id 
  145. where BF.database_name=@Bakdbname and BACdevicename in ( 
  146. select name from sys.backup_devices 
  147. where name like '%My_bak%' 
  148. order by bf. backup_set_id 
  149.  
  150. --初始备份集参数 
  151. set @it=1 
  152. --判断需要备份的数据库是否有D备份在所有备份集中 
  153. -- 
  154. IF  exists( 
  155. select * from #tempbak where BACK_TYPE='D' 
  156. --有D备份存在的情况 
  157. begin 
  158. --用历史备份集参数来重新赋值,以保证一个没有完全饱和的备份集参数都是一致的 
  159.  
  160. select @it=SUBSTRING(BACdevicename,7,3) from #tempbak  where back_type='D' and BACdevicename like 'My_bak%' 
  161. select @baklogicname=BACDEVICENAME FROM #TEMPBAK WHERE BACK_TYPE='D' and BACdevicename = 'My_bak'+convert(varchar(10),@it) 
  162. select @MIRbaklogicname='MIRROR_'+@baklogicname 
  163. select @bacmeidaname=MEDIANAME FROM #TEMPBAK WHERE BACK_TYPE='D' and BACdevicename = 'My_bak'+convert(varchar(10),@it) 
  164. SELEct @bacname=bacname FROM #TEMPBAK WHERE BACK_TYPE='D' and BACdevicename = 'My_bak'+convert(varchar(10),@it) 
  165. --set @baklogicname='My_bak'+ convert(varchar(10),@it) 
  166. SELECT @bakfilename=[PHYS_DEVICE_NAME]  from #tempbak  where back_type='D' and BACdevicename = 'My_bak'+convert(varchar(10),@it) 
  167. select @MIRbaklogicname= [BACdevicename] from #tempbak where back_type='D' and BACdevicename = 'MIRROR_My_bak'+convert(varchar(10),@it) 
  168. select @MIRbakfilename= [PHYS_DEVICE_NAME]  from #tempbak  where back_type='D' and BACdevicename = 'MIRROR_My_bak'+convert(varchar(10),@it) 
  169.  
  170. --判断历史D备中如果没有MIRROR备份集那么把标签自动设置为0 
  171.  
  172. --如果 
  173.  
  174.  
  175. IF datepart(hh,GETDATE()) >=@DbakBtime and datepart(hh,GETDATE())<=@DbakEtime 
  176. --在3点到7点之间 
  177. begin 
  178. --判断最后的差异或者D备是否已经过期 
  179.     IF  (select CONVERT(VARCHAR(8),MAX(expiration_date),112) exp_day FROM #TEMPBAK)<=CONVERT(VARCHAR(8),GETDATE(),112) 
  180.     --备份块已经过期 
  181.     begin 
  182.         --检查D+I备的个数是否已经饱和 
  183.         IF (select COUNT(1) from #tempbak  where back_type in ('D','I'and BACdevicename like 'My_bak%')>= ceiling(convert(numeric(19,2),@D_EXP_DATE)/convert(numeric(19,2),case  when @I_EXP_DATE<=0 then @D_EXP_DATE else @I_EXP_DATE end)) 
  184.         --备份分块已经饱和 
  185.         begin 
  186.             IF @it<@iit 
  187.                 --备份集还没有达到最大 
  188.                 begin 
  189.                 --设置备份集参数为下一个 
  190.                 select @it=SUBSTRING(BACdevicename,7,3) from #tempbak  where back_type='D' and BACdevicename like 'My_bak%' 
  191.                 set @it=@it+1 
  192.                 GOTO Dbak; 
  193.                 end 
  194.              
  195.             else 
  196.             --备份集已经达到最大 
  197.                 begin 
  198.                 --设置备份集参数为初始第一个 
  199.                 set @it=1 
  200.                 GOTO Dbak; 
  201.                 end 
  202.              
  203.         end 
  204.         --备份集没有饱和 
  205.         else 
  206.         begin 
  207.             goto Ibak;   
  208.         end 
  209.     end 
  210.      
  211.     ELSE 
  212.     --备份分块没有过期 
  213.     begin 
  214.     goto LBAK; 
  215.     end 
  216.  
  217. end 
  218. --当前时间不在完整和差异备份时间段之间 
  219.     else begin 
  220.     --做L备份 
  221.     goto Lbak; 
  222.     end 
  223. end 
  224. --在没有D备份存在的情况 
  225. else begin 
  226.      
  227.     set @it=1 
  228. --当前时间在完整和差异备份时间段之间 
  229. IF datepart(hh,GETDATE()) >=@DbakBtime and datepart(hh,GETDATE())<=@DbakEtime 
  230. begin 
  231.  GOTO Dbak; 
  232. end 
  233. --当前时间不在完整和差异备份时间段之间 
  234. else begin 
  235.  
  236.     print N'当前的备份集下还没有过任何D备份,且不在做D备份时间段,请选择正确时间段运行以便首次建立D备份!请确认设置的时间段合法!' 
  237.     return 11; 
  238.      
  239.     end 
  240.  
  241. end 
  242.  
  243.  
  244.  
  245. --第创建使用fomat创建媒体集和备份集以及镜像备份集 
  246.  
  247. Dbak: 
  248. begin 
  249.                 set @baklogicname='My_bak'convert(varchar(10),@it) 
  250.                 SET @MIRbaklogicname='MIRROR_'+@baklogicname 
  251.                 set @bacname=@Bakdbname+'_BAK' 
  252.                 set @bacmeidaname=@Bakdbname+'_MEDIA' 
  253.                 set @bakfilename=@BAKFILE+@bakdbname+'_BAK'convert(varchar(10),@it)+'.BAK' 
  254.                 set @MIRbakfilename=@BAKMIRFILE+'MIRROR_'+@bakdbname+'_BAK'convert(varchar(10),@it)+'.BAK' 
  255.             --重建基础备份设备 
  256.             IF EXISTS(SELECT 1 FROM sys.backup_devices WHERE name = @baklogicname) 
  257.                 begin 
  258.                 exec sp_dropdevice @baklogicname 
  259.                 exec sp_addumpdevice @devtype,@baklogicname,@bakfilename 
  260.                 end else exec sp_addumpdevice @devtype,@baklogicname,@bakfilename 
  261.             --重建镜像备份设备 
  262.             IF @ismirror=1  
  263.             BEGIN 
  264.                 IF EXISTS(SELECT 1 FROM sys.backup_devices WHERE name = @MIRbaklogicname) 
  265.                 begin 
  266.                 exec sp_dropdevice @mirbaklogicname 
  267.                 exec sp_addumpdevice @devtype,@MIRbaklogicname,@MIRbakfilename 
  268.                 end else exec sp_addumpdevice @devtype,@MIRbaklogicname,@MIRbakfilename 
  269.             END 
  270.              
  271. IF @ismirror=1  
  272. begin 
  273. set @sql =' 
  274. BACKUP DATABASE ['+@Bakdbname+'TO '+@baklogicname+' 
  275. MIRROR TO '+@MIRbaklogicname+' 
  276. WITH  RETAINDAYS = '+convert(varchar(10),@I_EXP_DATE)+', FORMAT,  
  277. INIT,  MEDIANAME =  '''+@bacmeidaname+'''NAME = '''+@bacname+'''
  278. SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10 
  279. drop table #tempbak 
  280. print @sql 
  281. EXEC (@SQL); 
  282. IF @@ERROR<>0 GOTO ERR; 
  283. print N'完整备份成功带镜像!' 
  284. return 0; 
  285. end 
  286.     else begin 
  287. set @sql =' 
  288. BACKUP DATABASE ['+@Bakdbname+'TO '+@baklogicname+' 
  289. WITH  RETAINDAYS = '+convert(varchar(10),@I_EXP_DATE)+', FORMAT,  
  290. INIT,  MEDIANAME =  '''+@bacmeidaname+'''NAME = '''+@bacname+'''
  291. SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10 
  292. drop table #tempbak 
  293. print @sql 
  294. EXEC (@SQL); 
  295. IF @@ERROR<>0 GOTO ERR; 
  296. print N'完整备份成功无镜像!' 
  297. return 0; 
  298.     end 
  299.      
  300. end 
  301. --创建差异备份 
  302. Ibak: 
  303. begin 
  304.         --重建基础备份设备 
  305.             IF EXISTS(SELECT 1 FROM sys.backup_devices WHERE name = @baklogicname) 
  306.                 begin 
  307.                 exec sp_dropdevice @baklogicname 
  308.                 exec sp_addumpdevice @devtype,@baklogicname,@bakfilename 
  309.                 end else exec sp_addumpdevice @devtype,@baklogicname,@bakfilename 
  310.             --重建镜像备份设备 
  311.             IF @ismirror=1  
  312.             BEGIN 
  313.                 IF EXISTS(SELECT 1 FROM sys.backup_devices WHERE name = @MIRbaklogicname) 
  314.                 begin 
  315.                 exec sp_dropdevice @mirbaklogicname 
  316.                 exec sp_addumpdevice @devtype,@MIRbaklogicname,@MIRbakfilename 
  317.                 end else exec sp_addumpdevice @devtype,@MIRbaklogicname,@MIRbakfilename 
  318.             END 
  319. select @I_EXP_DATE=exp_day FROM #TEMPBAK WHERE BACK_TYPE='D' and BACdevicename = 'My_bak'+convert(varchar(10),@it) 
  320. --判断历史D备份中的是否也包含了MIRROR备份,如果没有则修正@ismirror为0 
  321.     IF EXISTS(SELECT 1 from #TEMPBAK WHERE BACK_TYPE='D' and BACdevicename = 'MIRROR_My_bak'+convert(varchar(10),@it)) 
  322.         begin 
  323.         SET @ismirror=1; 
  324.         select @MIRbaklogicname=BACDEVICENAME FROM #TEMPBAK WHERE BACK_TYPE='D' and BACdevicename = 'MIRROR_My_bak'+convert(varchar(10),@it) 
  325.         end 
  326.     else set @ismirror=0 
  327.  
  328. IF @ismirror=1 BEGIN 
  329. set @sql=' 
  330. BACKUP DATABASE ['+@Bakdbname+'TO '+@baklogicname+'  
  331. MIRROR TO '+@MIRbaklogicname+' 
  332. WITH  DIFFERENTIAL ,RETAINDAYS = '+convert(varchar(10),@I_EXP_DATE)+' , NOFORMAT, 
  333. NOINIT,  MEDIANAME = '''+@bacmeidaname+''',  NAME = '''+@bacname+''',  
  334. NOSKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10 
  335.  
  336. drop table #tempbak 
  337. print @sql 
  338. EXEC (@SQL); 
  339. IF @@ERROR<>0 GOTO ERR; 
  340. print N'差异备份成功带镜像!' 
  341. return 0; 
  342. END 
  343. ELSE BEGIN 
  344. set @sql=' 
  345. BACKUP DATABASE ['+@Bakdbname+'TO '+@baklogicname+'  
  346. WITH  DIFFERENTIAL ,RETAINDAYS = '+convert(varchar(10),@I_EXP_DATE)+' , NOFORMAT, 
  347. NOINIT,  MEDIANAME = '''+@bacmeidaname+''',  NAME = '''+@bacname+''',  
  348. NOSKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10 
  349. drop table #tempbak 
  350. print @sql 
  351. EXEC (@SQL); 
  352. IF @@ERROR<>0 GOTO ERR; 
  353. print N'差异备份成功无镜像!' 
  354. return 0; 
  355. END 
  356. end 
  357. --创建日志备份 
  358.  
  359. Lbak: 
  360. begin 
  361.  
  362.         --重建基础备份设备 
  363.             IF EXISTS(SELECT 1 FROM sys.backup_devices WHERE name = @baklogicname) 
  364.                 begin 
  365.                 exec sp_dropdevice @baklogicname 
  366.                 exec sp_addumpdevice @devtype,@baklogicname,@bakfilename 
  367.                 end else exec sp_addumpdevice @devtype,@baklogicname,@bakfilename 
  368.             --重建镜像备份设备 
  369.             IF @ismirror=1  
  370.             BEGIN 
  371.                 IF EXISTS(SELECT 1 FROM sys.backup_devices WHERE name = @MIRbaklogicname) 
  372.                 begin 
  373.                 exec sp_dropdevice @mirbaklogicname 
  374.                 exec sp_addumpdevice @devtype,@MIRbaklogicname,@MIRbakfilename 
  375.                 end else exec sp_addumpdevice @devtype,@MIRbaklogicname,@MIRbakfilename 
  376.             END 
  377.              
  378. select @I_EXP_DATE=exp_day FROM #TEMPBAK WHERE BACK_TYPE='D' and BACdevicename = 'My_bak'+convert(varchar(10),@it) 
  379. --判断历史D备份中的是否也包含了MIRROR备份,如果没有则修正@ismirror为0 
  380.  
  381.     IF EXISTS(SELECT 1 from #TEMPBAK WHERE BACK_TYPE='D' and BACdevicename = 'MIRROR_My_bak'+convert(varchar(10),@it)) 
  382.         begin 
  383.         SET @ismirror=1; 
  384.         select @MIRbaklogicname=BACDEVICENAME FROM #TEMPBAK WHERE BACK_TYPE='D' and BACdevicename = 'MIRROR_My_bak'+convert(varchar(10),@it) 
  385.         end 
  386.     else set @ismirror=0 
  387.  
  388.  
  389. IF @ismirror=1 
  390. --参数需要镜像备份集 
  391. BEGIN 
  392. select @I_EXP_DATE=exp_day FROM #TEMPBAK WHERE BACK_TYPE='D' and BACdevicename = 'My_bak'+convert(varchar(10),@it) 
  393. set @sql=' 
  394. BACKUP LOG ['+@Bakdbname+'TO  '+@baklogicname+' 
  395. MIRROR TO '+@MIRbaklogicname+' 
  396. WITH NOFORMAT,  
  397. NOINIT,  MEDIANAME = '''+@bacmeidaname+''',  NAME = '''+@bacname+''',  
  398. NOSKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10' 
  399.  
  400. drop table #tempbak 
  401. print @sql 
  402. EXEC (@SQL); 
  403. IF @@ERROR<>0 GOTO ERR; 
  404. print N'日志备份成功带镜像!' 
  405. return 0; 
  406. END 
  407.  
  408. --参数设置不需要镜像备份集 
  409. ELSE BEGIN 
  410.  
  411. set @sql=' 
  412. BACKUP LOG ['+@Bakdbname+'TO  '+@baklogicname+' 
  413. WITH NOFORMAT,  
  414. NOINIT,  MEDIANAME = '''+@bacmeidaname+''',  NAME = '''+@bacname+''',  
  415. NOSKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10' 
  416.  
  417. drop table #tempbak 
  418. print @sql 
  419. EXEC (@SQL); 
  420. IF @@ERROR<>0 GOTO ERR; 
  421. print N'日志备份成功无镜像!' 
  422. return 0; 
  423.  
  424. END 
  425. end 
  426.  
  427. ----备份日志尾部 
  428. --BACKUP LOG [ReportServer] TO SH_TC_BAK WITH  NO_TRUNCATE ,  
  429. --NOFORMAT, NOINIT,MEDIANAME=N'SH_TC_BAKMEDIA', NAME = N'SH_TC_TRUNLOG',  
  430. --NOSKIP, NOREWIND, NOUNLOAD,  NORECOVERY ,  STATS = 10 
  431.  
  432. ERR: 
  433. BEGIN 
  434.  
  435. PRINT N'备份作业异常!请检查' 
  436. return 12; 
  437. END 
  438.  
  439.  
  440. END 
  441.  
  442.  
  443. GO 

调用方式:直接调用存储过程并按说明给出参数即可。


监控实现代码:

    
    
    
    
  1. ;WITH CTE_BAKFILE 
  2. AS 
  3. select A.database_name,A.backup_set_id,position, type,first_lsn,last_lsn,checkpoint_lsn,database_backup_lsn,isnull(datediff(d,backup_start_date,expiration_date),0) exp_day from msdb.dbo.backupset a 
  4. join (select database_name,MAX(backup_set_id) backup_set_id from msdb.dbo.backupset 
  5. where  type='D' 
  6. group by database_name) b 
  7. on a.backup_set_id=b.backup_set_id and a.database_name=b.database_name 
  8. --找出同组的备份组集合所有 
  9. union all 
  10. select A.database_name,A.backup_set_id,a.position, a.type,a.first_lsn,a.last_lsn,a.checkpoint_lsn,a.database_backup_lsn,isnull(datediff(d,backup_start_date,expiration_date),0) exp_day from msdb.dbo.backupset a 
  11. join ( 
  12. select A.database_name,A.backup_set_id,position, A.type,first_lsn,last_lsn,checkpoint_lsn,database_backup_lsn,isnull(datediff(d,backup_start_date,expiration_date),0) exp_day from msdb.dbo.backupset a 
  13. join (select database_name,MAX(backup_set_id) backup_set_id from msdb.dbo.backupset 
  14. where type='D'  
  15. group by database_name) b 
  16. on a.backup_set_id=b.backup_set_id and a.database_name=b.database_name 
  17. ) b 
  18. on a.database_backup_lsn=b.checkpoint_lsn AND A.database_name=B.database_name 
  19. where a.type <>'D' 
  20.  
  21. select  bf.*,cf.exp_day into #temptb 
  22. from cte_bakfile cf 
  23. join 
  24. (select  
  25. bcs.backup_set_id, 
  26. bcs.position, 
  27. [BACK_TYPE]=bcs.type, 
  28. [bacname]=bcs.name
  29. bcs.database_name, 
  30. [medianame]=bms.name
  31. [BACdevicename]=bmf.logical_device_name, 
  32. [dev_type]=bmf.device_type, 
  33. [PHYS_DEVICE_NAME]=bmf.physical_device_name, 
  34. bcs.expiration_date, 
  35. --bcs.backup_set_uuid, 
  36. bcs.database_backup_lsn, 
  37. bcs.first_lsn, 
  38. bcs.last_lsn, 
  39. bcs.checkpoint_lsn, 
  40. --bcs.database_creation_date, 
  41. bcs.backup_start_date, 
  42. bcs.backup_finish_date, 
  43. [size/M]=bcs.compressed_backup_size/1024/1024 
  44. from msdb.dbo.backupmediaset bms 
  45. join msdb.dbo.backupmediafamily bmf 
  46. join msdb.dbo.backupset bcs 
  47. on bmf.media_set_id=bcs.media_set_id  
  48. on bms.media_set_id=bmf.media_set_id) bf 
  49. on cf.backup_set_id=bf.backup_set_id 
  50. where BACdevicename in ( 
  51. select name from sys.backup_devices 
  52. where name like '%My_bak%' 
  53. order by bf. backup_set_id 
  54.  
  55.  
  56. SELECT DATABASE_NAME,[BACdevicename],back_type,count(1) times,MAX(backup_finish_date) last_time,SUM([size/M]) 'size/M' FROM #TEMPTB 
  57. group by DATABASE_NAME,back_type,[BACdevicename] 
  58. order by DATABASE_NAME,back_type,[BACdevicename] 
  59.  
  60. drop table #temptb 

写出来分享给大家,希望大家提出好的建议和意见,也希望对大家有所帮助。

 

你可能感兴趣的:(自动备份方案,mssql备份,通用数据库备份)