This post provides you with a script that will generate a restore script for a database using the latest full backup file that exists in a directory. (No need to state the filename explicitly)
You need to provide the following at the start of the script:
- The target database i.e. the database you will restore to
- The directory where the backup file is saved
If you are using the excellent Ola Hallengren maintenance solution (see link) the directory path will look something like below. If you’re not using Ola’s solution, you should be.
This restore script is designed to work with Ola’s solution as it segregates the backup directory structure such that each database has an allocated folder and each full backup file is named with the date and time of the file creation.
The restore script determines which backup file is the latest backup file based on the max name. So for the script to work it is assumed you have an appropriate backup strategy (i.e. using Ola’s solution) were backup types are segregated into different folders, backup names have a date reference and the backup location is dedicated to backups and nothing else, i.e. no trash files in the location.
Some use cases for this solution might be:
- Restoring a nightly backup to another instance for reporting purposes
- Restoring backups to a development environment
- Restoring backups to another server to test the backups
You can use the logic in a stored procedure or as the T-SQL in a job step and schedule accordingly.
/* You need to reference the following: * The target database i.e. the database you will restore to. * The directory where the backup file is saved. If you are using the Ola Hallengren backup scripts the directory path will look something like below. \\ServerWhereBackupsAreSaved\DriveName\InstanceName\TargetDatabase\Full\ Find & Replace the follow text for the target database and directory: TARGET_DATABASE DIR_PATH */ /* Declare Variables */ DECLARE @DatabaseToRestore AS VARCHAR(MAX); DECLARE @DirToSearch AS VARCHAR(MAX); DECLARE @ShellCommand AS VARCHAR(MAX); DECLARE @BackupFile AS VARCHAR(MAX); DECLARE @Sql AS VARCHAR(MAX); /* Set User Variables */ SET @DatabaseToRestore = 'TARGET_DATABASE'; SET @DirToSearch = 'DIR_PATH'; SET @ShellCommand = 'dir ' + @DirToSearch; /* Create Temp Table To Hold xp_cmdshell Output */ IF OBJECT_ID('tempdb..#DirList') IS NOT NULL DROP TABLE #DirList; CREATE TABLE #DirList ( Id INT identity(1, 1) ,line NVARCHAR(1000) ); /* Enable Advanced Options To Enable xp_cmdshell Temporarily */ EXEC master.dbo.sp_configure 'show advanced options' ,1; RECONFIGURE WITH OVERRIDE; EXEC master.dbo.sp_configure 'xp_cmdshell' ,1; RECONFIGURE WITH OVERRIDE; /* Run The Shell Command To Capture And Write Dir Info To Temp Table */ SET @Sql = ' INSERT INTO #DirList (line) EXEC xp_cmdshell ' + '''' + @ShellCommand + '''' + ';'; EXEC (@Sql); EXEC master.dbo.sp_configure 'xp_cmdshell' ,0; /* Disable Advanced Options And xp_cmdshell Again */ RECONFIGURE WITH OVERRIDE; EXEC master.dbo.sp_configure 'show advanced options' ,0; RECONFIGURE WITH OVERRIDE; /* Get The Last Backup File Name And Save To A Variable */ WITH CTE AS ( SELECT SUBSTRING(line, 37, 100) [FileName] FROM #DirList WHERE Id > ( SELECT MIN(Id) FROM #DirList WHERE line LIKE '%<DIR>%..%' ) AND Id < ( SELECT MAX(Id) - 2 FROM #DirList ) ) SELECT @BackupFile = [FileName] FROM CTE WHERE [FileName] = ( SELECT MAX(FileName) FROM CTE ); /* Create The Restore Script */ SET @BackupFile = @DirToSearch + @BackupFile SET @Sql = ' ALTER DATABASE ' + QUOTENAME(@DatabaseToRestore) + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE; RESTORE DATABASE ' + QUOTENAME(@DatabaseToRestore) + ' FROM DISK = ' + '''' + @BackupFile + '''' + ' WITH NORECOVERY ,REPLACE; RESTORE DATABASE ' + QUOTENAME(@DatabaseToRestore) + ' WITH RECOVERY; ' /* To Directly Execute The Script Uncomment The EXEC Statement And Delete The Select Statement */ /* EXEC (@Sql) */ SELECT @Sql