Skip to content

Commit 4e106f3

Browse files
committed
Scripts de restore
1 parent 3039429 commit 4e106f3

File tree

8 files changed

+768
-0
lines changed

8 files changed

+768
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*#info
2+
3+
# Autor
4+
Rodrigo Ribeiro Gomes
5+
6+
# Detalhes
7+
Script simple para obter o ultimo restore de cada banco registrado na tabela de restores
8+
9+
10+
*/
11+
12+
USE MSDB
13+
GO
14+
15+
SELECT
16+
RH.DESTINATION_DATABASE_NAME as Banco
17+
,rh.restore_type as Tipo
18+
,MAX(rh.restore_date) as Data
19+
FROM
20+
msdb..restorehistory rh
21+
WHERE
22+
rh.restore_type = 'D'
23+
GROUP BY
24+
RH.DESTINATION_DATABASE_NAME
25+
,rh.restore_type
26+
HAVING
27+
MAX(rh.restore_date) < DATEADD(d,-1,getDate())
28+
ORDER BY
29+
Banco
30+
,Tipo
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*#info
2+
3+
# Autor
4+
Rodrigo Ribeiro Gomes
5+
6+
# Detalhes
7+
Informações de data de restore
8+
9+
10+
*/
11+
SELECT
12+
*
13+
FROM
14+
(
15+
SELECT DISTINCT
16+
RH.destination_database_name as name
17+
FROM
18+
msdb..restorehistory RH
19+
) D
20+
OUTER APPLY
21+
(
22+
SELECT TOP 1
23+
BS.backup_finish_date as DataDosDados
24+
,RH.restore_date as DataExecucaoRestore
25+
FROM
26+
msdb..restorehistory RH
27+
INNER JOIN
28+
msdb..backupset BS
29+
ON BS.backup_set_id = RH.backup_set_id
30+
WHERE
31+
RH.destination_database_name = D.name
32+
ORDER BY
33+
RH.restore_date DESC
34+
) RH
35+
--WHERE
36+
-- D.NAME in ('master') --> nome dos bancos
37+
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
3+
# Autor
4+
Rodrigo Ribeiro Gomes
5+
6+
# Detalhes
7+
Script para recuperar informações dos logins a partir de um banco master restautado.
8+
PAra usar, você deve obter o backup do banco do master e restautar com o nome OldMaster (se mudar, ajuste no script).
9+
Exemplo:
10+
restore database OldMaster from disk = 'CaminhoBackup'
11+
with
12+
move 'master' to 'CaminhoRestore\OldMaster.mdf'
13+
,move 'mastlog' to 'CaminhoRestore\OldMaster.ldf'
14+
15+
16+
Conecte como DAC e rode esse script.
17+
Esse scriopt é bem útil em cenários de recuperação, onde você, por algum motivo, precisou remontar o servidor e não pode restauar a master.
18+
Com esse script, você tem mais chance de recuperar os logins SQL junsto com as senhas e configurações.
19+
Já me ajudou bem a minimizar o impacto e manter as apps fincionando com a mesma senha, mesmo quando ngm sabia.
20+
*/
21+
22+
23+
USE OldMaster
24+
go
25+
26+
SELECT
27+
*
28+
,'CREATE LOGIN '+QUOTENAME(name)
29+
+CASE
30+
WHEN type in ('G','U') THEN ' FROM WINDOWS '
31+
WHEN type = 'S' THEN
32+
+' WITH PASSWORD = '+CONVERT(varchar(max),pwdhash,1)+' HASHED, SID = '+convert(VARCHAR(MAX),p.sid,1)+' '
33+
+',CHECK_POLICY = '+CheckPolicy
34+
+',CHECK_EXPIRATION = '+CheckExpiration
35+
+isnull(',CREDENTIAL = '+CredentialName,'')
36+
END
37+
+',DEFAULT_DATABASE = '+quotename(dbname)
38+
+',DEFAULT_LANGUAGE = '+lang
39+
40+
+CASE WHEN IsDisabled = 1 THEN ';ALTER LOGIN '+quotename(name)+' DISABLE' ELSE '' END
41+
FROM
42+
(
43+
select
44+
p.name
45+
,dbname
46+
,pwdhash
47+
,sid
48+
,lang
49+
,CheckPolicy = CASE WHEN convert(bit, p.status & 0x10000) = 1 THEN 'ON' ELSE 'OFF' END
50+
,CheckExpiration = CASE WHEN convert(bit, p.status & 0x20000) = 1 THEN 'ON' ELSE 'OFF' END
51+
,IsDisabled = convert(bit, p.status & 0x80)
52+
,CredentialName = co.name
53+
,p.type
54+
from
55+
sys.sysxlgns p
56+
LEFT JOIN
57+
sys.syssingleobjrefs r ON r.depid = p.id AND r.class = 63 AND r.depsubid = 0
58+
LEFT JOIN
59+
sys.sysclsobjs co on co.id = r.indepid and co.class = 57and co.type=''
60+
WHERE
61+
p.type IN ('U','G','S')
62+
AND NOT EXISTS (
63+
SELECT * FROM sys.server_principals SP WHERE SP.name = p.name
64+
)
65+
) P
66+
67+
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
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*#info
2+
3+
# Autor
4+
Rodrigo Ribeiro Gomes
5+
6+
# Detalhes
7+
Traz informações da frequência de restore de um banco
8+
9+
10+
*/
11+
12+
SELECT
13+
d.NAME
14+
,RF.AvgRestorePeerWeek
15+
FROM
16+
sys.databases D
17+
LEFT JOIN
18+
(
19+
SELECT
20+
RG1.DatabaseName
21+
,RestoreCount
22+
,AvgRestorePeerWeek = ISNULL(RestoreCount/NULLIF(ElapsedTime,0),0)
23+
,LastRestore
24+
,FirstRestore
25+
FROM
26+
(
27+
SELECT
28+
RR.DatabaseName
29+
--,RR.StartWeek
30+
,RestoreCount = COUNT(*)
31+
,LastRestore = MAX(RR.RestoreDate)
32+
,FirstRestore = MIN(RR.RestoreDate)
33+
,ElapsedTime = DATEDIFF(WK,MIN(RR.RestoreDate),CURRENT_TIMESTAMP)
34+
FROM
35+
(
36+
SELECT
37+
DatabaseName = RH.destination_database_name
38+
,RestoreDate = RH.restore_date
39+
,StartWeek = DATEADd(WK,DATEDIFF(WK,0,RH.restore_date),0)-1
40+
FROM
41+
msdb..restorehistory RH
42+
WHERE
43+
RH.restore_type = 'D'
44+
AND
45+
RH.restore_date >= '20160101'
46+
) RR
47+
GROUP BY
48+
RR.DatabaseName
49+
--,RR.StartWeek
50+
) RG1
51+
) RF
52+
ON RF.DatabaseName = D.name
53+
WHERE
54+
D.database_id > 4
55+
AND
56+
ISNULL(RF.AvgRestorePeerWeek,0) = 0

0 commit comments

Comments
 (0)