Skip to content

Commit 6932dfc

Browse files
committed
Rename
1 parent b89291a commit 6932dfc

File tree

1 file changed

+196
-0
lines changed

1 file changed

+196
-0
lines changed
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
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

Comments
 (0)