Recovery Models – Parte 5 – Full e Bulk Logged: Restore

Olá amigos.

Seguem abaixo dois novos testes relacionados a série de publicações sobre recovery models que tenho publicado recentemente. Desta vez, a abordagem não está relacionada ao consumo de espaço em disco, mas na capacidade de restaurar um banco de dados com o modo de recuperação bulk logged usando o conceito point in time.

Vimos nas últimas publicações que os dois recovery models se comportam diferentemente quando comandos minimamente logados são executados, mas funcionam da mesma forma quando outras operações (como o comando ALTER INDEX REORGANIZE) são executadas.

Essas diferenças podem ser benefícas em alguns cenários, não apenas no consumo de espaço em disco (como vimos nas publicações anteriores) mas também em relação à performance das operações minimamente logadas (como veremos na próxima e última publicação desta série).

Além dos possíveis benefícios obtidos na utilização do recovery model bulk logged, é importante entender que também existem limitações e a principal delas está relacionada ao processo de restore de bancos de dados configurados com esse modelo de recuperação.

Basicamente, bancos de dados com recovery model bulk logged não podem ser restaurados usando o conceito point in time caso algum comando minimamente logado tenha sido executado no intervalo de tempo contemplado naquele arquivo de log sendo restaurado. Os testes abaixo apresentam este cenário.

Teste 5 – Restore Point in Time + Bulk Logged

Neste cenário usaremos os backups feitos nas publicações anteriores para restaurar o banco de dados DB_Bulk até um momento onde haja comandos minimamente logados, quando tentaremos restaurar o database usando a clausula STOPAT, que indica ao SQL Server para copiar os dados do backup apenas até aquele instante e ignorar o resto do backup.

RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk.bak'
WITH MOVE 'DB_Bulk' TO 'C:\Temp\Files\DB_Bulk_Restore.mdf',
MOVE 'DB_Bulk_log' TO 'C:\Temp\Files\DB_Bulk_Restore_log.lodf',
NORECOVERY
GO
RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_1.trn'
WITH NORECOVERY
--1,9 GB em 32 segundos
GO
RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_2.trn'
WITH NORECOVERY
GO
RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_3.trn'
WITH NORECOVERY
--700 MB em 11 segundos
GO
RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_4.trn'
WITH NORECOVERY
GO

Depois de restaurarmos o backup full e iniciarmos o restore dos backups de log usando a opção WITH NORECOVERY para dizermos ao SQL Server que temos a intenção de prosseguir restaurando backups, podemos tentar restaurar um novo backup de log usando a opção STOPAT, mencionada anteriormente.

Detalhe que neste ponto, estamos restaurando o arquivo 5 da nossa cadeia de backups de log. Esse arquivo foi gerado logo após a execução do comando REBUILD discutido na publicação anterior e, portanto, possui informações relacionadas à execução deste comando. Justamente por isso, ao executar o RESTORE, obtemos a mensagem de erro logo abaixo, após o comando de restauração do banco de dados.

----------------------------------------------------------------------
--ERRO
----------------------------------------------------------------------
RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_5.trn'
WITH
        STANDBY = N'C:\Temp\Files\DB_Bulk_STANDBY.trn'
       ,STOPAT = 'Jul 20, 2016 15:02:30 PM'
----------------------------------------------------------------------
--ERRO
----------------------------------------------------------------------

Erro-Restore

Mas, se tentarmos restaurar o mesmo arquivo de backup da maneira convencional, ou seja, sem especificar nenhum ponto no tempo para limitar o restore, o processo é realizado com sucesso.

----------------------------------------------------------------------
--SEM POINT IN TIME = SUCESSO
----------------------------------------------------------------------
GO
RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_5.trn'
WITH NORECOVERY
----------------------------------------------------------------------
--SEM POINT IN TIME = SUCESSO
----------------------------------------------------------------------

Depois de restaurado o arquivo, podemos continuar o processo de restore normalmente, arquivo por arquivo até concluirmos o processo e indicarmos a clausula WITH RECOVERY para que o SQL Server finalize a restauração e libere acesso ao banco de dados.

RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_6.trn'
WITH NORECOVERY
GO
RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_7.trn'
WITH NORECOVERY
GO
RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_8.trn'
WITH NORECOVERY
GO
RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_9.trn'
WITH NORECOVERY
GO
RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_10.trn'
WITH NORECOVERY
GO

Neste ponto, restauramos todos os backups de log do banco de dados, mas não especificamos a clausula WITH RECOVERY, portanto, o SQL Server ainda está à espera de um novo restore.

Para prosseguirmos, faremos outro backup de log do nosso banco de dados DB_Bulk e então tantaremos novamente o restore deste arquivo, que não contempla nenhuma operação minimamente logada, usando as clausulas correspondentes para recuperar o banco de dados até um ponto específico no tempo.

----------------------------------------------------------------------
--BACKUP LOG (SEM OPERAÇÕES MINIMAMENTE LOGADAS)
----------------------------------------------------------------------
BACKUP LOG DB_Bulk
TO DISK = 'C:\Temp\Files\DB_Bulk_11.trn'
GO
----------------------------------------------------------------------
--BACKUP LOG (SEM OPERAÇÕES MINIMAMENTE LOGADAS)
----------------------------------------------------------------------
----------------------------------------------------------------------
--SUCESSO: RESTORE LOG (SEM OPERAÇÕES MINIMAMENTE LOGADAS)
----------------------------------------------------------------------
RESTORE DATABASE DB_Bulk_Restore
FROM DISK = 'C:\Temp\Files\DB_Bulk_11.trn'
WITH
        STANDBY = N'C:\Temp\Files\DB_Bulk_STANDBY.trn'
       ,STOPAT = '2016-07-20 16:15:00.000'
----------------------------------------------------------------------
--SUCESSO: RESTORE LOG (SEM OPERAÇÕES MINIMAMENTE LOGADAS)
----------------------------------------------------------------------

Repare que a operação foi concluída com sucesso, ou seja, mesmo com o modo de recuperação bulk logged ainda sim é possível restaurar o banco de dados usando a clausula STOPAT e informar um ponto no tempo para limitar o processo de restore. O processo funciona perfeitamente desde que não tenha ocorrido nenhuma operação minimamente logada no intervalo de tempo contemplado pelo arquivo de backup restaurado.

Teste 6 – Restore do banco de dados + Full

Vimos nos testes anteriores que, para operações minimamente logadas, o SQL Server registra uma quantidade significativamente inferior de informações no transaction log para bancos de dados com recovery model bulk logged em relação ao recovery model full e, portanto, gera arquivos de backup menores também. Levando essa diferença em consideração, eu gostaria de compartilhar outra perspectiva relacionada aos testes apresentados acima: o tempo de restore.

Repare que no primeiro e terceiro restore feitos no banco de dados DB_Bulk eu adicionei uma linha de comentário contendo o tempo necessário para a conclusão dos comandos. Para efeito de comparação, faremos o mesmo procedimento de restore no banco de dados DB_Full, cujo recovery model esteve ajustado como full durante todos os testes anteriores. Repare que nos comandos abaixo também adicionei o tempo necessário para conclusão do comando.

RESTORE DATABASE DB_Full_Restore
FROM DISK = 'C:\Temp\Files\DB_Full.bak'
WITH MOVE 'DB_Full' TO 'C:\Temp\Files\DB_Full_Restore.mdf',
MOVE 'DB_Full_log' TO 'C:\Temp\Files\DB_Full_Restore_log.lodf',
NORECOVERY
GO
RESTORE DATABASE DB_Full_Restore
FROM DISK = 'C:\Temp\Files\DB_Full_1.trn'
WITH NORECOVERY
GO
--2 GB em 1 minuto e 17 segundos
RESTORE DATABASE DB_Full_Restore
FROM DISK = 'C:\Temp\Files\DB_Full_2.trn'
WITH NORECOVERY
GO
RESTORE DATABASE DB_Full_Restore
FROM DISK = 'C:\Temp\Files\DB_Full_3.trn'
WITH NORECOVERY
--741 MB em 24 segundos
GO

Seguem abaixo os dados obtidos na execução dos comandos:

  • Restore do log 1
    • Full: 2,0 GB em 1m17s
    • Bulk Logged: 1,9 GB em 0m32s
  • Restore do log 3
    • Full: 741 MB em 0m24s
    • Bulk Logged: 700 MB em 0m11s

Conclusão

Vimos na primeira parte desta publicação que é possível restaurar bancos de dados com recovery model bulk logged usando a opção STOPAT (correspondente ao restore point in time) somente quando nenhum comando minimamente logado tenha sido executado no período contemplado por aquele arquivo de backup à ser restaurado. Entretanto, caso neste período nenhuma operação deste tipo tenha sido feita, esta opção pode ser utilizada normalmente.

Na segunda parte da publicação, vimos que restaurar backups de log cujo conteúdo seja operações minimamente logadas é significantemente mais rápido no recovery model bulk logged. Essa diferença ocorre porque com bulk logged o SQL Server copia todo o conteúdo das páginas modificadas para o arquivo de backup e, portanto, para restaurá-los o SQL Server precisa apenas copiar novamente estas páginas diretamente do backup de log de volta ao arquivo de dados. Não há necessidade de reconstruir o índice novamente.

Na próxima e última publicação desta série, faremos uma nova comparação entre os recovery models full e bulk logged, desta vez, utilizando o comando ALTER INDEX com os parâmetros offline e online para visualizar como utilizar a opção bulk logged pode ser mais rápida no processamento destes comandos, além de, novamente, salvar algum espaço no transaction log.

Felipe de Assis

https://br.linkedin.com/in/fdassis

 

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s