• 差异备份的存储过程


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

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

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

    EXEC xp_fileexist @strphysical_device_name, @result output

    CREATE PROCEDURE sp_generateDifferentialBackups 
       @strBackupPath NVARCHAR (25) ='D:ackups'--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   
  • 相关阅读:
    第一次作业
    第四次作业
    第三次作业
    第二次作业
    第一次作业
    第四次作业
    第三次作业
    第二次作业
    第一次作业
    第三次作业
  • 原文地址:https://www.cnblogs.com/kala/p/9209295.html
Copyright © 2020-2023  润新知