forked from bulentgucuk/DBA-Scripts
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathDynamically Restore Multi File DB backup.sql
More file actions
90 lines (79 loc) · 2.35 KB
/
Dynamically Restore Multi File DB backup.sql
File metadata and controls
90 lines (79 loc) · 2.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
USE MASTER
-- PUT DB OFFLINE AND ONLINE TO DROP ALL THE CONNECTIONS
IF EXISTS( SELECT NAME
FROM SYS.DATABASES
WHERE NAME = 'SOCPlatform_BETA'
)
BEGIN
ALTER DATABASE SOCPlatform_BETA SET OFFLINE WITH ROLLBACK IMMEDIATE
END
IF EXISTS( SELECT NAME
FROM SYS.DATABASES
WHERE NAME = 'SOCPlatform_BETA'
)
BEGIN
ALTER DATABASE SOCPlatform_BETA SET ONLINE
END
DECLARE @STR VARCHAR (255)
IF EXISTS (
SELECT NAME
FROM Tempdb.sys.tables
WHERE NAME = 'RestoreDb'
)
BEGIN
DROP TABLE TempDb.dbo.RestoreDb
END
CREATE TABLE TempDb.dbo.RestoreDb (
RowId TINYINT IDENTITY(1,1),
LogicalName VARCHAR (128),
PhysicalName VARCHAR (512),
Type CHAR(1),
FileGroupName VARCHAR (128),
Size numeric(20,0) ,
MaxSize numeric(20,0) ,
FileId BIGINT,
CreatLSN numeric(25,0),
DropLSN numeric(25,0),
UniqeId VARCHAR (255),
ReadOnlyLSN NUMERIC(25,0),
ReadWriteLSN NUMERIC(25,0),
BackupSizeInBytes INT,
SourceBlockSize INT,
FileGroupId INT,
LogGroupGUID VARCHAR(128),
DifferentialBaseLSN NUMERIC(25,0) ,
DifferentialBaseGUID UNIQUEIDENTIFIER,
IsReadOnly BIT,
IsPresent BIT,
TDEThumbprint VARBINARY(32)
)
SELECT @STR = 'RESTORE FILELISTONLY FROM DISK = ''D:\Temp\SOCPLATFORM_BETA_db_full_201202290345.bak'''
INSERT INTO TempDb.dbo.RestoreDb
EXEC (@STR)
SELECT RowId,
LogicalName,
PhysicalName,
Type,
FileGroupName,
PATINDEX('%\%',REVERSE(PhysicalName)),
REVERSE(SUBSTRING(REVERSE(PhysicalName),1,PATINDEX('%\%',REVERSE(PhysicalName))-1))
FROM TempDb.dbo.RestoreDb
-- DECLARE VARIABLES DYNAMICALLY
DECLARE @DataFileLoopDeclare TINYINT --NUMBER OF VARIABLES THAT NEED TO BE CREATED FOR DATAFILES
DECLARE @Restore VARCHAR (4000) -- DYNAMIC RESTORE STATEMENT
SELECT @Restore = 'RESTORE DATABASE SOCPlatform_BETA FROM DISK = ''D:\Temp\SOCPLATFORM_BETA_db_full_201202290345.bak'''+' WITH'
SELECT @DataFileLoopDeclare = MAX(RowId)
FROM TempDb.dbo.RestoreDb
WHILE @DataFileLoopDeclare > 0
BEGIN
SELECT @Restore = @Restore + ' MOVE ' + '''' + LogicalName + '''' + ' TO ' + '''D:\Temp\Databases\' +
REVERSE(SUBSTRING(REVERSE(PhysicalName),1,PATINDEX('%\%',REVERSE(PhysicalName))-1)) + ''''
+ ','
FROM TempDb.dbo.RestoreDb
WHERE RowId = @DataFileLoopDeclare
SELECT @DataFileLoopDeclare = @DataFileLoopDeclare - 1
END
SELECT @Restore = @Restore + ' STATS = 1, REPLACE, RECOVERY'
SELECT @Restore
EXEC (@Restore)
DROP TABLE TempDb.dbo.RestoreDb