1. 程式人生 > >差異備份的存儲過程

差異備份的存儲過程

weight generated mas div set getdate tempdb reads and

有時候有這樣的需求,需要在做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

差異備份的存儲過程