Skip to content

Commit 1078b9e

Browse files
committed
Fixed Diff Restore, Added more Features
Updated the sp names for issue #851 Added @debug variable. Debug level 0 is the default state of the script, which will execute the commands. Debug level 1 will print just the commands so you can run at your leisure and Debug level 2 will print other stuff (level 2 is handy for adding in new variables and troubleshooting). This addresses issue #850 Fixed the Differential restore. I discovered during testing that I had failed to check the LSNs against the differential. Fixed that portion of the code and tested. This is in regards to issue #814
1 parent 82ff501 commit 1078b9e

File tree

1 file changed

+53
-20
lines changed

1 file changed

+53
-20
lines changed

sp_DatabaseRestore.sql

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,52 @@
11
/*
2-
EXEC dbo.DatabaseRestore
2+
EXEC dbo.sp_DatabaseRestore
33
@Database = 'LogShipMe',
44
@BackupPathFull = 'D:\Backup\SQL2016PROD1A\LogShipMe\FULL\',
55
@BackupPathLog = 'D:\Backup\SQL2016PROD1A\LogShipMe\LOG\',
66
@ContinueLogs = 0,
77
@RunRecovery = 0;
88
9-
EXEC dbo.DatabaseRestore
9+
EXEC dbo.sp_DatabaseRestore
1010
@Database = 'LogShipMe',
1111
@BackupPathFull = 'D:\Backup\SQL2016PROD1A\LogShipMe\FULL\',
1212
@BackupPathLog = 'D:\Backup\SQL2016PROD1A\LogShipMe\LOG\',
1313
@ContinueLogs = 1,
1414
@RunRecovery = 0;
1515
16-
EXEC dbo.DatabaseRestore
16+
EXEC dbo.sp_DatabaseRestore
1717
@Database = 'LogShipMe',
1818
@BackupPathFull = 'D:\Backup\SQL2016PROD1A\LogShipMe\FULL\',
1919
@BackupPathLog = 'D:\Backup\SQL2016PROD1A\LogShipMe\LOG\',
2020
@ContinueLogs = 1,
2121
@RunRecovery = 1;
2222
23-
EXEC dbo.DatabaseRestore
23+
EXEC dbo.sp_DatabaseRestore
2424
@Database = 'LogShipMe',
2525
@BackupPathFull = 'D:\Backup\SQL2016PROD1A\LogShipMe\FULL\',
2626
@BackupPathLog = 'D:\Backup\SQL2016PROD1A\LogShipMe\LOG\',
2727
@ContinueLogs = 0,
2828
@RunRecovery = 1;
2929
30-
EXEC dbo.DatabaseRestore
30+
EXEC dbo.sp_DatabaseRestore
3131
@Database = 'LogShipMe',
3232
@BackupPathFull = 'D:\Backup\SQL2016PROD1A\LogShipMe\FULL\',
3333
@BackupPathDiff = 'D:\Backup\SQL2016PROD1A\LogShipMe\DIFF\',
3434
@BackupPathLog = 'D:\Backup\SQL2016PROD1A\LogShipMe\LOG\',
3535
@RestoreDiff = 1,
3636
@ContinueLogs = 0,
3737
@RunRecovery = 1;
38+
39+
EXEC dbo.sp_DatabaseRestore
40+
@Database = 'LogShipMe',
41+
@BackupPathFull = '\\StorageServer\LogShipMe\FULL\',
42+
@BackupPathDiff = '\\StorageServer\LogShipMe\DIFF\',
43+
@BackupPathLog = '\\StorageServer\LogShipMe\LOG\',
44+
@RestoreDiff = 1,
45+
@ContinueLogs = 0,
46+
@RunRecovery = 1,
47+
@TestRestore = 1,
48+
@RunCheckDB = 1,
49+
@Debug = 0;
3850
*/
3951

4052
IF OBJECT_ID('dbo.sp_DatabaseRestore') IS NULL
@@ -48,7 +60,7 @@ ALTER PROCEDURE [dbo].[sp_DatabaseRestore]
4860
AS
4961
SET NOCOUNT ON;
5062

51-
DECLARE @cmd NVARCHAR(4000), @sql NVARCHAR(MAX), @LastFullBackup NVARCHAR(500), @LastDiffBackup NVARCHAR(500), @BackupFile NVARCHAR(500), @BackupDateTime AS CHAR(15), @FullLastLSN NUMERIC(25, 0);
63+
DECLARE @cmd NVARCHAR(4000), @sql NVARCHAR(MAX), @LastFullBackup NVARCHAR(500), @LastDiffBackup NVARCHAR(500), @BackupFile NVARCHAR(500), @BackupDateTime AS CHAR(15), @FullLastLSN NUMERIC(25, 0), @DiffLastLSN NUMERIC(25, 0);
5264
DECLARE @FileList TABLE (BackupFile NVARCHAR(255));
5365

5466
IF @RestoreDatabaseName IS NULL
@@ -122,7 +134,9 @@ SET @FileListParamSQL += ')' + CHAR(13) + CHAR(10);
122134
SET @FileListParamSQL += 'EXEC (''RESTORE FILELISTONLY FROM DISK=''''{Path}'''''')';
123135

124136
SET @sql = REPLACE(@FileListParamSQL, '{Path}', @BackupPathFull + @LastFullBackup);
125-
PRINT @sql;
137+
IF @Debug = 2
138+
PRINT @sql;
139+
126140
EXEC (@sql);
127141

128142
-- Build SQL for RESTORE HEADERONLY - this will be used a bit further below
@@ -192,11 +206,14 @@ BEGIN
192206

193207
--get the backup completed data so we can apply tlogs from that point forwards
194208
SET @sql = REPLACE(@HeadersSQL, '{Path}', @BackupPathFull + @LastFullBackup);
195-
PRINT @sql;
209+
IF @Debug = 2
210+
PRINT @sql;
211+
196212
EXECUTE (@sql);
197213
--DECLARE @BackupDateTime AS CHAR(15), @FullLastLSN NUMERIC(25, 0); Commented out for testing
198214
SELECT @BackupDateTime = RIGHT(@LastFullBackup, 19)
199215
SELECT @FullLastLSN = CAST(LastLSN AS NUMERIC(25, 0)) FROM #Headers WHERE BackupType = 1;
216+
IF @Debug = 2
200217
PRINT @BackupDateTime
201218
END;
202219
ELSE
@@ -232,12 +249,14 @@ BEGIN
232249
EXECUTE @sql = [dbo].[CommandExecute] @Command = @sql, @CommandType = 'RESTORE DATABASE', @Mode = 1, @DatabaseName = @Database, @LogToTable = 'Y', @Execute = 'Y';
233250

234251
--get the backup completed data so we can apply tlogs from that point forwards
235-
SET @sql = REPLACE(@HeadersSQL, '{Path}', @BackupPathFull + @LastFullBackup);
236-
PRINT @sql;
252+
SET @sql = REPLACE(@HeadersSQL, '{Path}', @BackupPathDiff + @LastDiffBackup);
253+
IF @Debug = 2
254+
PRINT @sql;
255+
237256
EXECUTE (@sql);
238257
--DECLARE @BackupDateTime AS CHAR(15), @FullLastLSN NUMERIC(25, 0);
239258
SELECT @BackupDateTime = RIGHT(@LastDiffBackup, 19)
240-
SELECT @FullLastLSN = CAST(LastLSN AS NUMERIC(25, 0)) FROM #Headers WHERE BackupType = 1;
259+
SELECT @DiffLastLSN = CAST(LastLSN AS NUMERIC(25, 0)) FROM #Headers WHERE BackupType = 5;
241260
END;
242261

243262
--Clear out table variables for translogs
@@ -263,19 +282,24 @@ BEGIN
263282
IF @i = 1
264283
BEGIN
265284
SET @sql = REPLACE(@HeadersSQL, '{Path}', @BackupPathLog + @BackupFile);
266-
PRINT @sql;
267-
EXECUTE (@sql);
285+
IF @Debug = 2
286+
PRINT @sql;
287+
EXECUTE (@sql);
268288

269289
SELECT @LogFirstLSN = CAST(FirstLSN AS NUMERIC(25, 0)), @LogLastLSN = CAST(LastLSN AS NUMERIC(25, 0)) FROM #Headers WHERE BackupType = 2;
270-
IF (@ContinueLogs = 0 AND @LogFirstLSN <= @FullLastLSN AND @FullLastLSN <= @LogLastLSN) OR (@ContinueLogs = 1 AND @LogFirstLSN <= @DatabaseLastLSN AND @DatabaseLastLSN < @LogLastLSN)
290+
291+
IF (@ContinueLogs = 0 AND @LogFirstLSN <= @FullLastLSN AND @FullLastLSN <= @LogLastLSN AND @RestoreDiff = 0) OR (@ContinueLogs = 1 AND @LogFirstLSN <= @DatabaseLastLSN AND @DatabaseLastLSN < @LogLastLSN AND @RestoreDiff = 0)
292+
SET @i = 2;
293+
IF (@ContinueLogs = 0 AND @LogFirstLSN <= @DiffLastLSN AND @DiffLastLSN <= @LogLastLSN AND @RestoreDiff = 1) OR (@ContinueLogs = 1 AND @LogFirstLSN <= @DatabaseLastLSN AND @DatabaseLastLSN < @LogLastLSN AND @RestoreDiff = 1)
271294
SET @i = 2;
272295
DELETE FROM #Headers WHERE BackupType = 2;
273296
END;
274297
IF @i = 2
275298
BEGIN
276299
SET @sql = 'RESTORE LOG '+@RestoreDatabaseName+' FROM DISK = '''+@BackupPathLog + @BackupFile+''' WITH NORECOVERY'+CHAR(13);
277300
PRINT @sql
278-
EXECUTE @sql = [dbo].[CommandExecute] @Command = @sql, @CommandType = 'RESTORE LOG', @Mode = 1, @DatabaseName = @Database, @LogToTable = 'Y', @Execute = 'Y';
301+
IF @Debug = 0
302+
EXECUTE @sql = [dbo].[CommandExecute] @Command = @sql, @CommandType = 'RESTORE LOG', @Mode = 1, @DatabaseName = @Database, @LogToTable = 'Y', @Execute = 'Y';
279303
END;
280304
FETCH NEXT FROM BackupFiles INTO @BackupFile;
281305
END;
@@ -284,16 +308,25 @@ DEALLOCATE BackupFiles;
284308
-- put database in a useable state
285309
IF @RunRecovery = 1
286310
BEGIN
287-
SET @sql = 'RESTORE DATABASE '+@RestoreDatabaseName+' WITH RECOVERY';
288-
EXECUTE sp_executesql @sql;
311+
SET @sql = 'RESTORE DATABASE '+@RestoreDatabaseName+' WITH RECOVERY'+CHAR(13);
312+
PRINT @sql
313+
IF @Debug = 0
314+
EXECUTE sp_executesql @sql;
289315
END;
290316

291317
--Run checkdb against this database
292318
IF @RunCheckDB = 1
293-
EXECUTE [dbo].[DatabaseIntegrityCheck] @Databases = @RestoreDatabaseName, @LogToTable = 'Y';
319+
BEGIN
320+
SET @sql = 'EXECUTE [dbo].[DatabaseIntegrityCheck] @Databases = ' + @RestoreDatabaseName + ', @LogToTable = ''Y'''+CHAR(13);
321+
PRINT @sql
322+
IF @Debug = 0
323+
EXECUTE sys.sp_executesql @sql
324+
END;
294325
--If test restore then blow the database away (be careful)
295326
IF @TestRestore = 1
296327
BEGIN
297-
SET @sql = 'DROP DATABASE '+@RestoreDatabaseName;
298-
EXECUTE sp_executesql @sql;
328+
SET @sql = 'DROP DATABASE '+@RestoreDatabaseName+CHAR(13);
329+
PRINT @sql
330+
IF @Debug = 0
331+
EXECUTE sp_executesql @sql;
299332
END;

0 commit comments

Comments
 (0)