Quantcast
Channel: Thoughts, codes, occasional rants, many others. » SQL Server
Viewing all articles
Browse latest Browse all 11

Automating Restore Verify operations

$
0
0

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

Viewing all articles
Browse latest Browse all 11

Trending Articles