码迷,mamicode.com
首页 > 其他好文 > 详细

差异备份的存储过程

时间:2018-06-21 17:17:53      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:bak   statement   order   --   .data   out   磁盘   inner   存储过程   

有时候有这样的需求,需要在做change前备份所有数据库.我们可以使用挨个数据库做全备,但是如果数据库非常多,并且数据库很大,这就非常麻烦,也非常耗费时间了. 所以写了下面的存储过程,使用游标遍历所有数据库,检查数据库有没有全备,如果有的话,再检查磁盘上全备的文件是否可用,如果都没有问题,就对数据库做差异备份.如果检查有问题,就把问题打印出来.

存储过程可以接收参数作为备份路径.如果没有参数就使用默认路径D:\backups\ .

使用下面的存储过程判断文件是否存在.

EXEC xp_fileexist @strphysical_device_name, @result output

CREATE PROCEDURE sp_generateDifferentialBackups 
   @strBackupPath NVARCHAR (25) =D:\backups\--variable for location of DIFFERENTIAL backups 
AS 
SET NOCOUNT ON  
-- Get the name of all user databases   
DECLARE @strTimeStamp NVARCHAR(12)   --variable for timestamp value  
DECLARE @strSQL NVARCHAR(100)        -- used for generating dynamic SQL statements  
DECLARE @databaseName NVARCHAR(128)  -- used as variable to store database names  
DECLARE dbCursor CURSOR FOR       -- used for cursor allocation  
   SELECT NAME 
   FROM MASTER.SYS.DATABASES 
   WHERE [database_id] > 0 
   AND NAME NOT IN (MASTER,MODEL,MSDB,TEMPDB) --does not include the system databases  

OPEN dbCursor  
  
FETCH NEXT FROM dbCursor INTO @databaseName  
  
WHILE (@@FETCH_STATUS = 0)  
BEGIN  
   PRINT Checking for the latest FULL database backup for: [ + @databaseName +] 
      
   DECLARE @strphysical_device_name NVARCHAR(100) -- variable for physical_device_name  
   DECLARE @cursor NVARCHAR(400)  

   -- Reads the MSDB database to check for the latest FULL database backup        
   SELECT @cursor=(DECLARE TabCursor CURSOR FAST_FORWARD GLOBAL FOR  +  
   SELECT TOP 1 physical_device_name  
   FROM msdb.dbo.backupset a INNER JOIN msdb.dbo.backupmediafamily b     
   ON a.media_set_id = b.media_set_id     
   WHERE database_name=‘‘‘ + @databaseName + ‘‘‘  
   AND type=‘‘D‘‘  
   ORDER BY backup_finish_date desc)  
   EXEC sp_executesql @cursor  
   OPEN TabCursor  
  
   FETCH NEXT FROM TabCursor INTO @strphysical_device_name  
   --Check if the database does not have any FULL backups at all 
   IF @@FETCH_STATUS <> 0 
   BEGIN 
      PRINT *****WARNING: Database [ + @databaseName + ] does not have any FULL database backups at all. Generate the FULL database backup first. Aborting DIFFERENTIAL backup command.***** 
   END 
   ELSE    
   --If the database has FULL backups, 
   WHILE @@FETCH_STATUS = 0  
   BEGIN  
      DECLARE @result INT  
      EXEC xp_fileexist @strphysical_device_name, @result output   
      IF (@result = 1)  --@result will return 1 if the specified file exists, if it doesn‘t, it will return 0  
      BEGIN  
         SET @strTimeStamp=CONVERT(CHAR(8), GETDATE(), 112)  
         SET @strTimeStamp=@strTimeStamp + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),:,‘‘)  
         EXEC (BACKUP DATABASE  + @databaseName +  TO DISK=‘‘‘ + @strBackupPath + @databaseName + _DIFF_ + @strTimeStamp + .BAK‘‘ WITH INIT, DIFFERENTIAL, DESCRIPTION=‘‘DIFFERENTIAL Backup for  + @databasename +  database‘‘‘) -- change this value should you decide to change the backup type to something other than differential   
         PRINT ===========================================================================================  
         PRINT DIFFERENTIAL Backup generated for database: [ + @databaseName  + ] 
         PRINT Corresponding FULL database backup:  + @strphysical_device_name  
         PRINT DIFFERENTIAL database backup:  + @strBackupPath + @databaseName + _DIFF_ + @strTimeStamp + .BAK  
      END  
      ELSE  
         PRINT  *********WARNING: FULL database backup file is missing. Generate the FULL database backup first. Aborting DIFFERENTIAL backup command.*********  
         
      FETCH NEXT FROM TabCursor INTO @strphysical_device_name  
   END  
   CLOSE TabCursor  
   DEALLOCATE TabCursor  
       
   PRINT ===========================================================================================  
   PRINT                                                                                              
   PRINT                                                                                              
   PRINT                                                                                              
   
   FETCH NEXT FROM dbCursor INTO @databaseName  
END  
  
CLOSE dbCursor  
DEALLOCATE dbCursor  

PRINT FINISHED  
GO   

 

差异备份的存储过程

标签:bak   statement   order   --   .data   out   磁盘   inner   存储过程   

原文地址:https://www.cnblogs.com/kala/p/9209295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!