Blog Post

Restore Script from Backup Directory – Modified

,

As a DBA your job is to protect the data, whether that be from corruption, attack, developers or any other host of unknown afflictions. While I was not involved in the day to day backup or recovery while acting as an Accidental DBA (handled by an MSP), nor do I handle those duties in my current role as an actual DBA (handled by Storage Team) I am very aware of the needs of a solid strategy for backup AND recovery.

As I was tuning my next presentation which will introduce the uninformed to Ola Hallengren’s portfolio of free utilities I realized that teaching new or aspiring DBAs about the importance of a backup plan is reckless unless you also tell them about the importance of the more important, a recovery plan. I recalled having read a write-up by Greg Robidoux at MSSQLTips.com for a script to automatically generate a recovery script, based off a folder full of backups.

Once I looked at the requirements Greg lays out in his script I saw that it would not work as-is with Ola’s solution, so I modified it to do just that.

Now, as a warning, there is nothing earth shattering here, just a simple rework of a great solution for your toolbox. If you use Ola’s tools, maybe you can add this as an item in your tool box, as always, all feedback is greatly appreciated.

 

USE Master;
GO 
SET NOCOUNT ON
/**
Variable declaration
**/DECLARE @dbName sysname
, @backupPath NVARCHAR(500)
, @cmd NVARCHAR(500)
, @lastFullBackup NVARCHAR(500)
, @lastDiffBackup NVARCHAR(500)
, @backupFile NVARCHAR(500)
DECLARE@fileList TABLE (backupFile NVARCHAR(255))
DECLARE @directoryList TABLE (backupFile NVARCHAR(255))
/**
Initialize variables
**/SET @dbName = 'AdventureWorks2012'
SET @backupPath = 'C:\Backup'
/* Match that of Olas output */SET @backupPath = @backupPath + '\' + @@SERVERNAME + '\' + @dbName + '\'
/**
Get List of Files
**/SET @cmd = 'DIR /s /b /O D ' + @backupPath
INSERT INTO @fileList(backupFile) EXEC master.sys.xp_cmdshell @cmd
/**
Find latest full backup
**/SELECT @lastFullBackup = MAX(backupFile) 
FROM @fileList 
WHERE backupFile LIKE '%' + @@SERVERNAME + '_' + @dbName + '_FULL_%.bak'
SET @cmd = 'RESTORE DATABASE [' + @dbName + '] FROM DISK = ''' 
       + @backupPath + @lastFullBackup + ''' WITH NORECOVERY, REPLACE'
PRINT @cmd
/**
Find latest diff backup
**/SELECT @lastDiffBackup = MAX(backupFile) 
FROM @fileList 
WHERE 
backupFile  LIKE '%' + @@SERVERNAME + '_' + @dbName + '_DIFF_%.bak'
AND backupFile>@lastFullBackup
/**
check to make sure there is a diff backup
**/IF @lastDiffBackup IS NOT NULL
BEGIN
   SET @cmd = 'RESTORE DATABASE [' + @dbName + '] FROM DISK = ''' 
   + @backupPath + @lastDiffBackup + ''' WITH NORECOVERY'
   PRINT @cmd
   SET @lastFullBackup = @lastDiffBackup
END
/**
check for log backups
**/DECLARE backupFiles CURSOR FOR 
   SELECT backupFile 
   FROM @fileList
   WHERE 
backupFile LIKE  '%' + @@SERVERNAME + '_' + @dbName + '_LOG_%.trn'
AND backupFile> @lastFullBackup
OPEN backupFiles 
/**
Loop through all the files for the database 
**/FETCH NEXT FROM backupFiles INTO @backupFile 
WHILE @@FETCH_STATUS = 0 
BEGIN 
   SET @cmd = 'RESTORE LOG [' + @dbName + '] FROM DISK = ''' 
   + @backupPath + @backupFile + ''' WITH NORECOVERY'
   PRINT @cmd
   FETCH NEXT FROM backupFiles INTO @backupFile 
END
CLOSE backupFiles 
DEALLOCATE backupFiles 
/**
put database in a useable state
**/SET @cmd = 'RESTORE DATABASE [' + @dbName + '] WITH RECOVERY'
PRINT @cmd

 

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating