I am a fan of automation. The more I can automate, the more I have time to do productive [sic] things. I wanted to automate a RESTORE VERIFYONLY process and document this in a table. Without further explanation, script is as follows. As always, please feel free to use/modify this and let me know if you come across some points I might have missed.
Table Creation Script:
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 | USE [DBATasks] GO /****** Object: Table [dbo].[Admin_BackupVerify] Script Date: 7/19/2012 8:58:33 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Admin_BackupVerify]( [BackupRestoreID] [int] IDENTITY(1,1) NOT NULL, [ServerName] [varchar](50) NOT NULL, [DatabaseName] [varchar](50) NOT NULL, [LastCopied] [varchar](50) NOT NULL, [DateCreated] [datetime] NOT NULL, [LastRestorable] [varchar](50) NOT NULL, [DateRestored] [datetime] NOT NULL, [Verified] [bit] NOT NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[Admin_BackupVerify] ADD CONSTRAINT [DF_Admin_BackupRestores_ServerName] DEFAULT ('') FOR [ServerName] GO ALTER TABLE [dbo].[Admin_BackupVerify] ADD CONSTRAINT [DF_Admin_BackupRestores_DatabaseName] DEFAULT ('') FOR [DatabaseName] GO ALTER TABLE [dbo].[Admin_BackupVerify] ADD CONSTRAINT [DF_Admin_BackupRestores_LastCopied] DEFAULT ('') FOR [LastCopied] GO ALTER TABLE [dbo].[Admin_BackupVerify] ADD CONSTRAINT [DF_Admin_BackupRestores_DateCreated] DEFAULT (getdate()) FOR [DateCreated] GO ALTER TABLE [dbo].[Admin_BackupVerify] ADD CONSTRAINT [DF_Admin_BackupRestores_Restored] DEFAULT ('') FOR [LastRestorable] GO ALTER TABLE [dbo].[Admin_BackupVerify] ADD CONSTRAINT [DF_Admin_BackupRestores_DateRestored] DEFAULT ('1900-01-01') FOR [DateRestored] GO ALTER TABLE [dbo].[Admin_BackupVerify] ADD CONSTRAINT [DF_Admin_BackupVerify_Verified] DEFAULT ((0)) FOR [Verified] GO |
Actual Stored Proc
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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | USE [DBATasks] GO /****** Object: StoredProcedure [dbo].[Admin_RestoreVerifyOnly] Script Date: 7/19/2012 8:20:20 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROC [dbo].[Admin_RestoreVerifyOnly] ( @Path VARCHAR(200) , @ServerName VARCHAR(50) ) AS SET NOCOUNT ON; /*************************************************************************** Author: Subhash Pant Date Created: 07/17/2012 Date Modified: Purpose: This process automatically finds the files in the backup directory, and then runs the RESTORE VERIFYONLY ***************************************************************************/ DECLARE @DATE DATETIME , @fileName NVARCHAR(75) , @dir NVARCHAR(255) , @loadPath NVARCHAR(500) , @cmd1 NVARCHAR(330) , @maxDate DATETIME , @id INT , @dateRestored DATETIME , @restorePath NVARCHAR(500), @lastRestored VARCHAR(50) , @errMsg VARCHAR(500) , @errSeverity INT , @errState INT /********************************************************* Please configure these values **********************************************************/ SET @loadPath = @Path SET @restorePath = @Path --SET @loadPath = '"K:\Backup\DB1"' --SET @restorePath = 'K:\Backup\DB1' /********************************************************* No modification needed beyond this point **********************************************************/ SET @dir = 'dir ' + @loadPath SET @dateRestored = '1900-01-01' IF OBJECT_ID('tempdb.dbo.#tmpDir') IS NULL CREATE TABLE #tmpDir ( id INT IDENTITY , ret NVARCHAR(1000) ) ELSE TRUNCATE TABLE #tmpDir INSERT #tmpDir EXEC master.dbo.xp_cmdshell @dir /********************************************************* Remove unwanted values **********************************************************/ DELETE #tmpDir WHERE NOT ret LIKE '%.bak%' OR ret IS NULL IF EXISTS ( SELECT * FROM #tmpDir AS tmp LEFT OUTER JOIN DBATasks.dbo.Admin_BackupVerify AS lr ON LTRIM(RTRIM(RIGHT(tmp.ret, CHARINDEX(' ', REVERSE(tmp.ret))))) = LastCopied WHERE tmp.ret LIKE '%.bak%' AND LastCopied IS NULL ) BEGIN INSERT DBATasks.dbo.Admin_BackupVerify(ServerName, DatabaseName, LastCopied, DateCreated) SELECT @ServerName, Left(LTRIM(RTRIM(RIGHT(tmp.ret, CHARINDEX(' ', REVERSE(tmp.ret))))), PatIndex('%[0-9]%', LTRIM(RTRIM(RIGHT(tmp.ret, CHARINDEX(' ', REVERSE(tmp.ret))))) + '1') - 1), LTRIM(RTRIM(RIGHT(tmp.ret, CHARINDEX(' ', REVERSE(tmp.ret))))) AS LastCopied, CASE WHEN tmp.ret LIKE '% PM %' THEN LEFT(tmp.ret, CHARINDEX(' PM ', tmp.ret) + 3) WHEN tmp.ret LIKE '% AM %' THEN LEFT(tmp.ret, CHARINDEX(' AM ', tmp.ret) + 3) END AS date_created FROM #tmpDir AS tmp LEFT OUTER JOIN DBATasks.dbo.Admin_BackupVerify AS lr ON LTRIM(RTRIM(RIGHT(tmp.ret, CHARINDEX(' ', REVERSE(tmp.ret))))) = LastCopied WHERE tmp.ret LIKE '%.bak%' AND LastCopied IS NULL END WHILE EXISTS (SELECT * FROM DBATasks.dbo.Admin_BackupVerify WHERE [DateRestored] = '1900-01-01') BEGIN SELECT TOP 1 @id = [BackupRestoreID] , @lastRestored = [LastCopied] , @cmd1 = 'RESTORE VERIFYONLY ' + 'from disk = ''' + @restorePath + '\' + [LastCopied] + '''' FROM DBATasks.dbo.Admin_BackupVerify WHERE [DateRestored] = '1900-01-01' ORDER BY [DateCreated] BEGIN TRY --print @cmd1 EXEC sp_executesql @cmd1 END TRY BEGIN CATCH SELECT @errMsg = ERROR_MESSAGE() , @errSeverity = ERROR_SEVERITY() , @errState = ERROR_STATE() RAISERROR(@errMsg, @errSeverity, @errState) GOTO cleanup END CATCH UPDATE [dbo].[Admin_BackupVerify] SET [LastRestorable] = @lastRestored, [DateRestored] = GETDATE(), [Verified] = 1 WHERE [BackupRestoreID] = @id END cleanup: SET NOCOUNT OFF; GO |