1+ /* #info
2+
3+ # Autor
4+ Rodrigo Ribeiro Gomes
5+
6+ # Detalhes
7+ Script para fazer o restore de todos os bancos.
8+ Foi um dos primeiro que criei, então, deve ter muita coisa pra melhorar!
9+ MAs deixei aqui, pela ideia!
10+
11+
12+ */
13+
14+
15+ DECLARE
16+ @Bancos TABLE ( ordem int primary key identity , NomeBD sysname , NomeBackup varchar (200 ) )
17+ DECLARE -- > Tabela que receberá os resultado do EXEC no FILELISTONLY
18+ @ResultadoFileListOnly TABLE
19+ (
20+ Ordem int PRIMARY KEY IDENTITY
21+ ,LogicalName nvarchar (128 )
22+ ,PhysicalName nvarchar (260 )
23+ ,Type char (1 )
24+ ,FileGroupName nvarchar (128 )
25+ ,Size numeric (20 ,0 )
26+ ,MaxSize numeric (20 ,0 )
27+ ,FileID bigint
28+ ,CreateLSN numeric (25 ,0 )
29+ ,DropLSN numeric (25 ,0 )
30+ ,UniqueID uniqueidentifier
31+ ,ReadOnlyLSN numeric (25 ,0 )
32+ ,ReadWriteLSN numeric (25 ,0 )
33+ ,BackupSizeInBytes bigint
34+ ,SourceBlockSize int
35+ ,FileGroupID int
36+ ,LogGroupGUID uniqueidentifier
37+ ,DifferentialBaseLSN numeric (25 ,0 )
38+ ,DifferentialBaseGUID uniqueidentifier
39+ ,IsReadyOnly bit
40+ ,IsPresent bit
41+ ,TDEThumbprint varbinary (32 ) -- > Não tem pra versão 2005
42+ ) -- > Baseado em http://msdn.microsoft.com/en-us/library/ms173778.aspx
43+
44+ INSERT INTO
45+ @Bancos
46+ (
47+ NomeBD
48+ ,NomeBackup
49+ )
50+ SELECT DISTINCT -- > Obtem a lista de BACKUPS mais recente de cada banco
51+ database_name
52+ ,right (physical_device_name,CHARINDEX (' \' ,REVERSE (physical_device_name))- 1 ) as NomeBackup
53+ FROM
54+ msdb .dbo .backupset bs
55+ INNER JOIN msdb .dbo .backupmediafamily bmf on bmf .media_set_id = bs .media_set_id
56+ WHERE
57+ bs .type = ' D'
58+ AND bs .backup_finish_date in -- > Faz o filtro somente pelo último backup de cada banco
59+ (
60+ SELECT
61+ max ( bsex .backup_finish_date )
62+ FROM
63+ msdb .dbo .backupset bsex
64+ WHERE
65+ bsex .database_name = bs .database_name
66+ and bsex .type = bs .type
67+ )
68+ and database_name not in (' master' ,' tempdb' ,' model' ,' msdb' )
69+ and database_name not like ' ReportServer%'
70+ and database_name not like ' Tunnig%'
71+
72+
73+ DECLARE
74+ @proxBD bigint
75+ ,@maxBD bigint
76+ ,@nomeBD sysname
77+ ,@NomeBackup varchar (200 )
78+ ,@cmdCriar nvarchar (200 )
79+ ,@DirBackups varchar (100 )
80+ ,@CaminhoRestore varchar (200 )
81+ ,@DestinoBackup varchar (max )
82+ ,@CaminhoBdAtual varchar (max )
83+ ,@SQLRestore varchar (max )
84+ ,@ProxArquivoBD int
85+ ,@MaxArquivoBD int
86+ ,@NomeArLogico varchar (500 )
87+ ,@NomeArBanco varchar (500 )
88+ ,@MsgStatus varchar (500 )
89+
90+ -- > Inicializando as variáveis
91+ SELECT
92+ -- > Contador que determinará o banco atual a ser restaurado
93+ @proxBD = 1
94+ -- > O máximo que @proxBD pode assumir
95+ ,@maxBD = MAX ( ordem )
96+ -- > Contador para cada arquivo do banco de dados.
97+ ,@ProxArquivoBD = 1
98+ -- > O diretório onde ficam os Arquivos de Backups
99+ ,@DirBackups = ' C:\Backups'
100+ -- > O diretório onde ficarão os arquivos de cada banco
101+ ,@DestinoBackup = ' C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\'
102+ FROM
103+ @Bancos
104+
105+ WHILE @proxBD <= @maxBD -- Enquanto nao passar do ultimo banco
106+ BEGIN
107+ SELECT
108+ @nomeBD = nomeBD
109+ ,@NomeBackup = NomeBackup
110+ FROM
111+ @Bancos
112+ WHERE
113+ ordem = @proxBD
114+
115+ -- Se o banco não existe, então cria-o
116+ IF DB_ID (@nomeBD) IS NULL BEGIN
117+ SELECT
118+ @cmdCriar = N ' Use master; CREATE DATABASE '+ @nomeBD
119+ EXEC sp_executesql @cmdCriar
120+ print ' Criado '+ @nomeBD
121+ END
122+
123+ -- Montando o caminho do Restore
124+ SELECT
125+ @CaminhoRestore = @DirBackups+ @NomeBackup
126+
127+ -- > Obtendo a lista de arquivos do banco
128+ INSERT INTO
129+ @ResultadoFileListOnly
130+ EXEC sp_executesql N ' RESTORE FILELISTONLY FROM DISK = @Caminho' ,N ' @Caminho varchar(300)' ,@CaminhoRestore
131+
132+ -- > Obtendo a maior ordem dos arquivos do banco
133+ SELECT
134+ @MaxArquivoBD = MAX ( Ordem )
135+ FROM
136+ @ResultadoFileListOnly
137+
138+ -- > Conterá o comando de RESTORE de cada banco
139+ SELECT @SQLRestore = ' '
140+
141+ -- Montando a query com as opções de MOVE
142+ WHILE @ProxArquivoBD <= @MaxArquivoBD
143+ BEGIN
144+ SELECT
145+ @NomeArLogico = LogicalName
146+ ,@NomeArBanco = master .dbo .fnNomeArquivo ( PhysicalName )
147+ FROM
148+ @ResultadoFileListOnly
149+ WHERE
150+ Ordem = @ProxArquivoBD
151+
152+ SELECT @SQLRestore = @SQLRestore + ' MOVE '+ quotename (@NomeArLogico,' '' ' )+ ' TO '+ quotename (@DestinoBackup+ @NomeArBanco,' '' ' )
153+
154+ SET @ProxArquivoBD = @ProxArquivoBD + 1
155+
156+ -- > Checando se o loop irá repetir. Se sim, coloca a vígula.
157+ IF @ProxArquivoBD <= @MaxArquivoBD
158+ SELECT @SQLRestore = @SQLRestore + ' ,'
159+ END
160+
161+ -- > Montando o comando do RESTORE
162+ SELECT @SQLRestore = '
163+ USE master;
164+
165+ ALTER DATABASE
166+ ' + @nomeBD+ '
167+ SET
168+ SINGLE_USER
169+ WITH
170+ ROLLBACK IMMEDIATE;
171+
172+ RESTORE DATABASE
173+ ' + @nomeBD+ '
174+ FROM
175+ DISK = '' ' + @CaminhoRestore+ ' ''
176+ WITH
177+ REPLACE
178+ ,STATS = 10
179+ ,' + @SQLRestore+ '
180+
181+ ALTER DATABASE
182+ ' + @nomeBD+ '
183+ SET
184+ MULTI_USER;
185+ ' ;
186+
187+ SELECT @MsgStatus = ' Iniciando RESTORE do Banco '+ @nomeBD+ ' do arquivo: '+ @CaminhoRestore+ ' ... '
188+ RAISERROR (@MsgStatus, 0 , 1 ) WITH NOWAIT
189+ -- PRINT 'Iniciando RESTORE do Banco '+@nomeBD+' do arquivo: '+@CaminhoRestore+'... ';
190+
191+ EXEC (@SQLRestore);
192+
193+ DELETE FROM @ResultadoFileListOnly;
194+
195+ SELECT @proxBD = @proxBD + 1 ;
196+ END
0 commit comments