Restaurar múltiplos bancos de dados no SQL Server

Neste artigo iremos abordar como restaurar de forma automática todos os arquivos .BAK de um diretório utilizando um script T-SQL. É comum em casos de desastre precisarmos anexar e restaurar diversos bancos de dados, e infelizmente a Microsoft não entrega por padrão uma solução que permita realizar essa operação em lote.

Parte 1 – Habilitar a xp_cmdshell.

A função xp_cmdshell habilita o SQL Server a executar comandos do sistema operacional a partir do banco de dados. Neste artigo em questão, a utilizaremos para poder listar os arquivos .BAK dentro de um diretório, e criar um loop que percorra todos eles e restaure cada um desses backups, automatizando o processo.

Para habilitar esta função, primeiro é necessário habilitar a exibição de opções avançadas (Show Advanced Options). E por questões de segurança, após realizar os procedimentos desejados, vamos desabilitar a xp_cmdshell e as advanced options, para manter da forma padrão que vem no SQL Server, evitando riscos desnecessários de segurança.

exec sp_configure “show advanced options”, 1
go
reconfigure
go
EXEC sp_configure ‘xp_cmdshell’, 1
go
reconfigure
go

Parte 2 – Editar e executar o script de restauração

O código abaixo realiza todo o procedimento de forma automática. Apenas devemos nos atentar para substituir os caminhos de origem e destino que estão em negrito.

Trocar C:\BACKUPS\ pelo caminho onde estão salvos todos os seus arquivos .BAK

E trocar C:\DESTINO pelo caminho onde você deseja salvar seus arquivos MDF, e seus LDF, caso deseje utilizar caminhos separados.

DECLARE @FilesCmdshell TABLE (
outputCmd NVARCHAR (255)
)
DECLARE @FilesCmdshellCursor CURSOR
DECLARE @FilesCmdshellOutputCmd AS NVARCHAR(255)

INSERT INTO @FilesCmdshell (outputCmd) EXEC master.sys.xp_cmdshell 'dir /B C:\BACKUPS\*.bak'
SET @FilesCmdshellCursor = CURSOR FOR SELECT outputCmd FROM @FilesCmdshell

OPEN @FilesCmdshellCursor
FETCH NEXT FROM @FilesCmdshellCursor INTO @FilesCmdshellOutputCmd
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @dbName NVARCHAR(255) = SUBSTRING(@FilesCmdshellOutputCmd, 0, CHARINDEX('.', @FilesCmdshellOutputCmd))
DECLARE @cmd NVARCHAR(MAX) = 'RESTORE DATABASE [' + @dbName + '] FROM DISK = N''C:\BACKUPS\' + @FilesCmdshellOutputCmd + ''' WITH FILE = 1, MOVE ''' + @dbName + ''' TO ''C:\DESTINO\' + @dbName + '.mdf'', MOVE ''' + @dbName + '_log'' TO ''C:\DESTINO\' + @dbName + '.ldf'', NOUNLOAD, STATS = 10'
EXEC(@cmd)

FETCH NEXT FROM @FilesCmdshellCursor INTO @FilesCmdshellOutputCmd
END

Parte 3 – Reabilitar a xp_cmdshell

Conforme realizamos nossos procedimentos e restauramos nosso backup, não existe mais necessidade de manter a cmdshell ativada e as opções avançadas habilitadas. Desta forma vamos utilizar um código muito similar ao da parte 1, porém com a ordem invertida. Primeiro desativamos a xp_cmdshell, e depois, as opções avançadas.

EXEC sp_configure ‘xp_cmdshell’, 1
go
reconfigure
go
exec sp_configure “show advanced options”, 1
go
reconfigure
go

Post A Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *