Dynamically Restore SQL Server Database from Backup
We always get requests to restore databases from production to lab environment.This script dynamically restores the backup file and moves the data and log files to default locations.
/******************************************************************************************************
** Project: Operations
** Issue: Restore Database from Backup file
** ShortDesc: Restore Database From Backup File and Dynamically move data and log files to Default Location.This is intended for single data and log file Databases.
** Auth: EMETRIC\rvenkataraman
** Date: 2016-07-25 Created
** Description: Restore Database From Backup File and Dynamically move data and log files to Default Location.This is intended for single data and log file Databases.
**************************
** Change History
**************************
** CR Date Author Description
** ----- ----------– ----------- ------------------------------------------------------------
** 1 2016-07-25 Raju Venkataraman Restore Database From Backup File and Dynamically move data and log files to Default Location.This is intended for single data and log file Databases.
********************************************************************************************************/
SET NOCOUNT ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET NUMERIC_ROUNDABORT OFF
SET XACT_ABORT ON
-----------BEGIN SQL SCRIPT HEADER-------------------
DECLARE @DB_NAME VARCHAR(128)
SET @DB_NAME = ( SELECT DB_NAME(dbid)
FROM master..sysprocesses
WHERE spid = @@SPID
)
PRINT '-----------------------------------------------------------------------'
PRINT '-----START RAPID DEVELOPEMENT SQL SCRIPT--------'
PRINT '-----SCRIPT RAN ON DB: ' + @DB_NAME
PRINT '-----SCRIPT START TIME: '
+ CONVERT(VARCHAR, CONVERT(DATETIME, GETDATE()), 121)
PRINT '-----MachineName : ' + CAST(SERVERPROPERTY('MachineName') AS VARCHAR)
PRINT '-----SQL Instance : ' + CAST(@@SERVERNAME AS VARCHAR)
PRINT '-----DB User : ' + CURRENT_USER
PRINT '-----System User : ' + SYSTEM_USER
PRINT '-----Host : ' + HOST_NAME()
PRINT '-----Application : ' + APP_NAME()
PRINT '-----TranCount : ' + CAST (@@trancount AS VARCHAR)
PRINT '-----------------------------------------------------------------------'
----------------END SQL SCRIPT HEADER---------------------
-- Script Specific Variables Declarations
DECLARE @StartTime DATETIME2 , @EndTime DATETIME2
SELECT @StartTime = GETDATE()
-- Script Block Start
BEGIN TRY
DECLARE @pBackupFile NVARCHAR(550);
DECLARE @pDatabaseName sysname;
SELECT @pDatabaseName = 'AdventureWorks';
SELECT @pBackupFile = '\\FileShare\AdventureWorks.BAK';
DECLARE @pDSQL NVARCHAR(MAX);
DECLARE @pDataFileLocation NVARCHAR(550);
DECLARE @pLogFileLocation NVARCHAR(550);
DECLARE @pLogicalDataFileName NVARCHAR(550);
DECLARE @pLogicalLogFileName NVARCHAR(550);
DECLARE @pDataFileName NVARCHAR(550);
DECLARE @pLogFileName NVARCHAR(550);
SELECT @pDataFileName = @pDatabaseName + '.mdf' ,
@pLogFileName = @pDatabaseName + '.ldf';
SELECT @pDataFileLocation = CONVERT(VARCHAR(550), SERVERPROPERTY('instancedefaultdatapath')) ,
@pLogFileLocation = CONVERT(VARCHAR(550), SERVERPROPERTY('instancedefaultlogpath'));
IF SERVERPROPERTY('productversion') >= '13.0.1400.361' -- SQL Server 2016 and Above Has SnapshotUrl
BEGIN
DECLARE @FileLists TABLE
(
[LogicalName] NVARCHAR(128) ,
[PhysicalName] NVARCHAR(260) ,
[Type] NCHAR(1) ,
[FileGroupName] NVARCHAR(128) ,
[Size] BIGINT ,
[MaxSize] BIGINT ,
[FileId] BIGINT ,
[CreateLSN] DECIMAL(25, 0) ,
[DropLSN] DECIMAL(25, 0) ,
[UniqueId] UNIQUEIDENTIFIER ,
[ReadOnlyLSN] DECIMAL(25, 0) ,
[ReadWriteLSN] DECIMAL(25, 0) ,
[BackupSizeInBytes] BIGINT ,
[SourceBlockSize] INT ,
[FileGroupId] INT ,
[LogGroupGUID] UNIQUEIDENTIFIER ,
[DifferentialBaseLSN] DECIMAL(25, 0) ,
[DifferentialBaseGUID] UNIQUEIDENTIFIER ,
[IsReadOnly] BIT ,
[IsPresent] BIT ,
[TDEThumbprint] VARBINARY(20) ,
[SnapshotUrl] NVARCHAR(336)
);
END
ELSE
BEGIN
RAISERROR ('SnapshotUrl is Only Avialble for SQL Server 2016 and Above. Modify the Definition of Table Variable and Remove SnapShotURL.', -- Message text.
16, -- Severity.
1 -- State.
);
END
SELECT @pDSQL = ' RESTORE FILELISTONLY FROM DISK = ''' + @pBackupFile + '''';
SELECT @pDSQL;
INSERT @FileLists
EXEC(@pDSQL);
SELECT @pLogicalDataFileName = LogicalName
FROM @FileLists
WHERE Type = 'D';
SELECT @pLogicalLogFileName = LogicalName
FROM @FileLists
WHERE Type = 'L';
SELECT @pDataFileLocation ,
@pLogFileLocation ,
@pDatabaseName;
SELECT @pDSQL = ' RESTORE DATABASE ' + @pDatabaseName + '
FROM DISK = ''' + @pBackupFile + '''
WITH MOVE ''' + @pLogicalDataFileName + ''' TO ''' + @pDataFileLocation
+ @pDataFileName + ''', MOVE ''' + @pLogicalLogFileName + ''' TO '''
+ @pLogFileLocation + @pLogFileName + '''';
SELECT @pDSQL;
EXEC(@pDSQL);
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage
END CATCH
-- Script Block End
SELECT @EndTime = GETDATE()
-----------BEGIN SQL SCRIPT FOOTER--------------------------------------
PRINT '----------------------------------------------------------------'
PRINT '---FINISHED SQL SCRIPT--'
PRINT '---COMPLETED TIME:' + CONVERT(VARCHAR, CONVERT(DATETIME, GETDATE()), 121)
PRINT '---TranCount : ' + CAST (@@trancount AS VARCHAR)
Does not work with multiple filegroups and database files…