Fala Pessoal,
No post anterior, compartilhei um script para fazer o restore com vários arquivos de Backup de Log que foram gerados através de um Plano de Manutenção do SQL Server. Se você ainda não viu, confere lá, pois irei pular algumas partes que já expliquei anteriormente.
Agora vou compartilhar um outro script para fazer o restore com vários arquivos de Backup de Log, mas dessa vez iremos buscar as informações dos arquivos na database “msdb”.
Entendendo o script:
- Parâmetros iniciais:
Assim como no script anterior, a ideia do Teste de Restore é você apenas alterar os parâmetros informando o nome da base e os arquivos de backup que serão utilizados.
IMPORTANTE: Ao executar, o resultado será um outro script que você deverá copiar em outra query para fazer o RESTORE.
A opção do STANDBY eu irei abordar no próximo post. Ignore essa por enquanto OK.
Comparando com o script anterior, dessa vez não precisamos informar nada sobre os arquivos de Backup de Log, pois o script irá buscar as informações diretamente da database “msdb”.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
--------------------------------------------------------------------------------------------------------------------------------- -- Parametros para realizar o Backup -------------------------------------------------------------------------------------------------------------------------------- DECLARE @DatabaseDestino VARCHAR(8000), @Ds_Caminho_StandyBy VARCHAR(8000), @Ds_Pasta_Log VARCHAR(8000), @Nm_Arquivo_Log VARCHAR(8000), @Ds_Caminho_Backup_Full VARCHAR(8000), @Ds_Caminho_Backup_Diff VARCHAR(8000), @Ds_Extensao_Backup_Log VARCHAR(8000), @ComandoBackupFULL varchar(8000), @ComandoBackupDiferencial varchar(8000), @ComandoBackupLog varchar(8000), @DatabaseOrigem varchar(8000), @Ultimo_Backup_FULL datetime, @Ultimo_Backup_Diferencial datetime select @DatabaseOrigem = 'NomeDatabase', @DatabaseDestino = 'TesteRestore_NomeDatabase', @Ds_Caminho_Backup_Full = 'C:\SQLServer\Backup\NomeDatabase_Dados.bak', -- Caminho \ Nome do Backup Full. @Ds_Caminho_Backup_Diff = NULL, --'C:\SQLServer\Backup\NomeDatabase_Diferencial.bak', -- Caminho \ Nome do Backup Diferencial. Caso contrário, deve informar NULL. @Ds_Caminho_StandyBy = NULL --'C:\SQLServer\Backup\NomeDatabase_StandBy', -- Informar o nome do Arquivo para o Standy By. Caso contrário, deve informar NULL. |
- Observações:
- Versão SQL Server:
Dependendo da versão do SQL Server que você utilizar, pode ser necessário comentar algumas linhas desse script. Caso contrário, você pode receber o erro abaixo:
Msg 213, Level 16, State 7, Line 1
Column name or number of supplied values does not match table definition.
Msg 3013, Level 16, State 1, Line 1
RESTORE HEADERONLY is terminating abnormally.
Verificar as linhas abaixo:
Linha 80:
1 2 3 4 |
Containment tinyint, -- Include this column if using SQL 2012 KeyAlgorithm nvarchar(32), -- Include this column if using SQL 2014 EncryptorThumbprint varbinary(20), -- Include this column if using SQL 2014 EncryptorType nvarchar(32) -- Include this column if using SQL 2014 |
Linha 138:
1 2 |
TDEThumbprint varbinary(32), -- Remove this column if using SQL 2005 SnapshotURL nvarchar(360) -- Include this column if using SQL 2016 |
Database “msdb”:
Esse script foi preparado especificamente para restaurar Backups de Log buscando as informações dos arquivos diretamente da database “msdb”. O script irá buscar as informações da seguinte forma:
1 2 3 4 5 6 7 8 |
SELECT database_name, backup_start_date, name FROM msdb.dbo.backupset B INNER JOIN msdb.dbo.backupmediafamily BF ON B.media_set_id = BF.media_set_id WHERE type = 'L' AND database_name = @DatabaseOrigem AND name IS NOT NULL AND backup_start_date >= ISNULL(@Ultimo_Backup_Diferencial, @Ultimo_Backup_FULL) ORDER BY backup_start_date |
IMPORTANTE:
Aqui precisamos ressaltar que a coluna “name” deve ter o caminho completo do arquivo de backup de log (nome pasta + nome arquivo). Segue abaixo um exemplo:
Para gravar essa informação no MSDB, você precisa preencher o parâmetro “NAME” quando executar o BACKUP. Portanto, bastaria você verificar a sua rotina de backup atual e alterar esse parâmetro para poder utilizar o script de restore desse post.
1 2 3 |
BACKUP LOG NOME_DATABASE TO DISK = @Nm_Caminho WITH INIT, CHECKSUM, COMPRESSION, NAME = @Nm_Caminho |
Resultado do script:
O resultado desse script é o mesmo do post anterior, ele irá gerar o script para que você possa executar o RESTORE. Segue abaixo um exemplo:
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 |
-- FULL -- 2019-03-16 12:21:43 RESTORE DATABASE TesteRestore_BASE_PRODUCAO FROM DISK = 'C:\SQLServer\Backup\BASE_PRODUCAO_Full.bak' WITH NORECOVERY , STATS = 1, MOVE 'BASE_PRODUCAO_2' TO 'C:\SQLServer\Data\BASE_PRODUCAO_2_TesteRestore_BASE_PRODUCAO.ndf', MOVE 'BASE_PRODUCAO_log' TO 'C:\SQLServer\Log\BASE_PRODUCAO_log_TesteRestore_BASE_PRODUCAO.ldf', MOVE 'BASE_PRODUCAO' TO 'C:\SQLServer\Data\BASE_PRODUCAO_TesteRestore_BASE_PRODUCAO.mdf' -- DIFERENCIAL -- 2019-03-16 12:27:42 RESTORE DATABASE TesteRestore_BASE_PRODUCAO FROM DISK = 'C:\SQLServer\Backup\BASE_PRODUCAO_Diferencial.bak' WITH NORECOVERY, STATS = 1 -- LOG RESTORE LOG TesteRestore_BASE_PRODUCAO from disk = 'C:\SQLServer\Backup\Log\BASE_PRODUCAO\BASE_PRODUCAO_20190316_122937_Log.bak' WITH FILE = 1, NORECOVERY -- 2019-03-16 12:29:37 RESTORE LOG TesteRestore_BASE_PRODUCAO from disk = 'C:\SQLServer\Backup\Log\BASE_PRODUCAO\BASE_PRODUCAO_20190316_123009_Log.bak' WITH FILE = 1, NORECOVERY -- 2019-03-16 12:30:09 RESTORE LOG TesteRestore_BASE_PRODUCAO from disk = 'C:\SQLServer\Backup\Log\BASE_PRODUCAO\BASE_PRODUCAO_20190316_123153_Log.bak' WITH FILE = 1, NORECOVERY -- 2019-03-16 12:31:53 RESTORE LOG TesteRestore_BASE_PRODUCAO from disk = 'C:\SQLServer\Backup\Log\BASE_PRODUCAO\BASE_PRODUCAO_20190316_123238_Log.bak' WITH FILE = 1, NORECOVERY -- 2019-03-16 12:32:38 RESTORE LOG TesteRestore_BASE_PRODUCAO from disk = 'C:\SQLServer\Backup\Log\BASE_PRODUCAO\BASE_PRODUCAO_20190316_123337_Log.bak' WITH FILE = 1, NORECOVERY -- 2019-03-16 12:33:37 -- Comando para deixar a base ONLINE RESTORE DATABASE TesteRestore_BASE_PRODUCAO WITH RECOVERY -- Comando para alterar o recovery model da base restaurada ALTER DATABASE TesteRestore_BASE_PRODUCAO SET RECOVERY SIMPLE -- Comando para validar se a base está OK DBCC CHECKDB('TesteRestore_BASE_PRODUCAO') -- Comando para excluir a base de teste -- DROP DATABASE TesteRestore_BASE_PRODUCAO |
No post anterior eu explico com mais detalhes cada passo do RESTORE. Aqui irei resumir um pouco.
Primeiro iremos restaurar o BACKUP FULL. Nesse momento, a base será criada no SQL Server e ficará com o status “RESTORING” para que possamos continuar restaurando os outros backups. Lembrando que a base não estará disponível para acesso enquanto estiver com o status “RESTORING”. Se você informar o parâmetro do BACKUP DIFERENCIAL, execute também o segundo comando do restore.
Nesse teste de restore utilizei os arquivos de backup de log abaixo:
Após executar todos os comandos de RESTORE, podemos deixar a base ONLINE. A partir de agora a base já estará disponível para ser acessada.
Pronto! Conseguimos validar com sucesso os nossos Backups! Espero que tenha conseguido explicar como ele funciona e se tiver alguma dúvida deixe um comentário para que eu possa tentar te ajudar.
Se você ficou com alguma dúvida na explicação sobre o restore, dê uma olhada também no post anterior onde explico com mais detalhes.
E você, já está validando os Backups do seu ambiente? Está esperando o que?
No próximo post irei mostrar alguns exemplos de como utilizar as opções STOPAT e STANDBY com mais detalhes. Aguarde!!!
Por fim, vou fazer um pequeno comparativo com os dois scripts de restore que disponibilizei. Com isso, fica a seu critério escolher a melhor opção para o seu caso.
MSDB:
- Vantagens:
- Não precisa utilizar a procedure “xp_cmdshell” para listar os arquivos de Backup de Log. Com isso, temos mais segurança.
- Você pode utilizar qualquer padrão de nomenclatura para o arquivo, desde que preencha o parâmetro NAME (nome pasta + nome arquivo) quando executar o BACKUP.
- Desvantagens:
- Fica dependente da database “msdb”. Agora imagina se acontecer algum desastre e essa database for perdida. Com isso, não será possível utilizar esse script para restaurar os Backups.
Plano de Manutenção:
- Vantagens:
- Não depende da database “msdb” para fazer o restore. Com isso, se acontecer algum desastre, bastaria disponibilizar os arquivos de backup necessários em alguma pasta e executar o script de Restore.
- Desvantagens:
- Utiliza a procedure “xp_cmdshell” que possui alguns riscos para a segurança. Por esse motivo que habilitamos e desabilitamos a mesma quando a opção não está habilitada na instância.
- Os arquivos de Backup de Log devem seguir um padrão de nomenclatura que é gerado pelo Plano de Manutenção do SQL Server, ou deve ser utilizado uma rotina de Backup que gere os arquivos dessa forma também. Por exemplo: NOME_DATABASE_backup_2019_02_19_080418_0336431.trn
- Mais detalhes no link abaixo:
- https://luizlima.net/script-restore-restaurando-varios-arquivos-de-backup-de-log-plano-de-manutencao/
Download “Script Restore – Restaurando vários arquivos de Backup de Log – Utilizando o MSDB”:
Segue o link para baixar o script utilizado nesse Post:
Espero que tenha gostado e que isso também possa ser útil no seu dia a dia. Até o próximo post!
Me siga no LinkedIn e YouTube para ficar por dentro das novidades.
Abraço,
Luiz Vitor França Lima
Consultor SQL Server
Script muito útil, parabéns Luiz, obrigado por compartilhar, já tá salvo no meu Github aqui, realmente o trabalho de restaurar log é bem trabalho, fica bem mais prático com esse ai. hehehe.
Fala Tássio,
Que bom que gostou! Esse script é uma mão na roda e muito útil mesmo kkkk.
Ele agiliza e facilita bastante quando precisamos restaurar muitos arquivos de Backup de Log.
Aproveite =)
Abraço.
Luiz Vitor
Pingback: Script Restore – Restaurando vários arquivos de Backup de Log – Opções STOPAT e STANDBY – Luiz Lima