Uma visão geral da recuperação tradicional
Assim como em todos os sistemas de banco de dados relacionais, o SQL Server garante a durabilidade dos dados ao implementar a recuperação de falhas. Durabilidade na sigla ACID que se refere às características das transações em bancos de dados relacionais significa que podemos ter certeza de que se o banco de dados falhar repentinamente, nossos dados estão seguros.
O SQL Server implementa esse recurso usando o log de transações. As alterações feitas por todas as operações de manipulação de dados no SQL Server são capturadas no log de transações antes de serem aplicadas aos arquivos de dados (por meio do processo de ponto de verificação) caso seja necessário reverter ou avançar.
O processo de recuperação de falhas em três fases no SQL Server é o seguinte:
Análise – SQL Server lê o log de transações do ponto de verificação mais recente até o final do log de transações
Refazer – O SQL Server reproduz o log da transação não confirmada mais antiga até o final do log
Desfazer – O SQL Server lê o log do final do log até a transação não confirmada mais antiga e reverte todas as transações que estavam ativas durante a falha
DBAs experientes teriam, em algum momento ou outro de suas carreiras, a experiência desanimadora de esperar impotente pela conclusão da recuperação de falhas em um banco de dados muito grande. A transação ROLLBACK usa um mecanismo semelhante ao processo de recuperação de falhas. A Microsoft aprimorou significativamente o processo de recuperação no SQL Server 2019.
Recuperação de banco de dados acelerada
A Recuperação Acelerada de Banco de Dados é um novo recurso baseado em controle de versão que aumenta significativamente a taxa de recuperação no caso de um ROLLBACK ou recuperação de uma falha.
No SQL Server 2019, três novos mecanismos dentro do mecanismo do SQL Server modificam a maneira como a recuperação é tratada e reduzem efetivamente o tempo necessário para executar um rollback/rollforward.
Armazenamento de versões persistentes (PVS) – Captura versões de linha dentro do banco de dados em questão. O Armazenamento de Versão Persistente pode ser definido em um grupo de arquivos separado por motivos de desempenho ou tamanho
Reversão lógica – Usa as versões de linha armazenadas no PVS para executar a reversão quando uma reversão é chamada para uma transação específica ou quando a fase de desfazer da recuperação de falha é chamada.
sLog – Isso possivelmente significa secundário registrar . É um fluxo de log na memória usado para capturar operações que não podem ser versionadas. Quando o ADR está habilitado no banco de dados, o sLog é sempre reconstruído durante a fase de análise de recuperação de falhas. Durante o refazer Nesta fase, o sLog é usado em vez do log de transações real, tornando o processo mais rápido, pois fica na memória e contém menos transações. O processo de recuperação tradicional lida com transações do último ponto de verificação. O sLog também é usado durante o desfazer fase.
Limpador – Remove versões de linha desnecessárias do PVS. A Microsoft também fornece um procedimento armazenado para forçar manualmente uma limpeza de versões de linha desnecessárias.
-- LISTING 1: INVOKE THE BACKGROUND CLEANER USE TSQLV4_ADR GO EXECUTE sys.sp_persistent_version_cleanup; USE master GO EXECUTE master.sys.sp_persistent_version_cleanup 'TSQLV4_ADR';
A Recuperação Acelerada do Banco de Dados está DESATIVADA por padrão
O fato de o ADR estar desativado no SQL Server 2019 por padrão pode parecer surpreendente para alguns DBAs, já que parece ser um ótimo recurso. O ADR usa o controle de versão no banco de dados do usuário no qual está habilitado. Isso pode afetar significativamente o tamanho do banco de dados. Além disso, pode ser necessário planejar o crescimento do banco de dados, bem como a possível localização do PVS, para garantir um bom desempenho se o ADR estiver ativado. Portanto, faz sentido habilitar deliberadamente essa funcionalidade.
O experimento:fase preparatória
Montamos um experimento para explorar o novo recurso e ver o impacto do ADR no tamanho do log de transações, bem como na velocidade do ROLLBACK. Em nosso experimento, criamos dois bancos de dados idênticos usando um único conjunto de backup e, em seguida, habilitamos o ADR apenas em um desses bancos de dados. A Listagem 2 mostra as etapas preparatórias para a tarefa.
[expandir título =”Código”]
-- LISTING 2: PREPARE THE DATABASES AND CONFIGURE ADR -- 2a. Backup a sample database and restore as two identical databases BACKUP DATABASE TSQLV4 TO DISK='TSQLV4.BAK' WITH COMPRESSION; -- Restore Database TSQLV4_NOADR (ADR will not be enabled) RESTORE DATABASE TSQLV4_NOADR FROM DISK='TSQLV4.BAK' WITH MOVE 'TSQLV4' TO 'C:\MSSQL\DATA\TSQLV4_NOADR.MDF', MOVE 'TSQLV4_log' TO 'E:\MSSQL\LOG\TSQLV4_NOADR_LOG.LDF'; -- Restore Database TSQLV4_ADR (ADR will be enabled) RESTORE DATABASE TSQLV4_ADR FROM DISK='TSQLV4.BAK' WITH MOVE 'TSQLV4' TO 'C:\MSSQL\DATA\TSQLV4_ADR.MDF', MOVE 'TSQLV4_log' TO 'E:\MSSQL\LOG\TSQLV4_ADR_LOG.LDF'; -- 2b. Enable ADR in TSQLV4_ADR USE [master] GO -- First create a separate filegroup and add a file to the filegroup ALTER DATABASE [TSQLV4_ADR] ADD FILEGROUP [ADR_FG]; ALTER DATABASE [TSQLV4_ADR] ADD FILE ( NAME = N'TSQLV4_ADR01', FILENAME = N'C:\MSSQL\Data\TSQLV4_ADR01.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ) TO FILEGROUP [ADR_FG] GO -- Enable ADR ALTER DATABASE TSQLV4_ADR SET ACCELERATED_DATABASE_RECOVERY = ON (PERSISTENT_VERSION_STORE_FILEGROUP = ADR_FG); GO -- 2c. Check if all ADR is enabled as planned SELECT name , compatibility_level , snapshot_isolation_state_desc , recovery_model_desc , target_recovery_time_in_seconds , is_accelerated_database_recovery_on FROM SYS.DATABASES WHERE name LIKE 'TSQLV4_%'; -- 2d. Check sizes of all files in the databases SELECT DB_NAME(database_id) AS database_name , name AS file_name , physical_name , (size * 8)/1024 AS [size (MB)] , type_desc FROM SYS.master_files WHERE DB_NAME(database_id) LIKE 'TSQLV4_%'; -- 2e. Check size of log used CREATE TABLE ##LogSpaceUsage (database_name VARCHAR(50) , database_id INT, total_log_size_in_bytes BIGINT , used_log_space_in_bytes BIGINT , used_log_space_in_percent BIGINT , log_space_in_bytes_since_last_backup BIGINT) INSERT INTO ##LogSpaceUsage EXEC sp_MSforeachdb @command1=' IF ''?'' LIKE ("TSQLV4_%") SELECT DB_NAME(database_id), * FROM ?.SYS.dm_db_log_space_usage;' SELECT * FROM ##LogSpaceUsage; DROP TABLE ##LogSpaceUsage;
[/expandir]
A Fig. 1 mostra a saída da instrução SQL na Listagem 2, seção 2c. Também capturamos o tamanho dos arquivos de banco de dados e o uso do arquivo de log de transações. (ver Fig. 3).
Fig. 1 Confirme se o ADR está configurado
Fig. 2 Revise os tamanhos dos arquivos de dados do banco de dados
Fig. 3 Verifique o tamanho do log usado para ambos os bancos de dados
O experimento:fase de execução
Depois de capturarmos os detalhes necessários para prosseguir, executamos o código SQL das Listagens 3 e 4 em etapas. As duas listagens são equivalentes, mas estamos executando-as em dois bancos de dados idênticos separadamente. Primeiro, fazemos um INSERT (Listagem 3, 3a), depois executamos um DELETE (Listagem 3, 3b) que posteriormente reverteremos. Observe que tanto no INSERT quanto no DELETE, encapsulamos as operações em transações. Além disso, observe que o INSERT é executado 50 vezes. Em cada estágio de execução, ou seja, entre 3a, 3b e 3c, capturamos o uso do log de transações com a ajuda do código da Listagem 2.2e. Isso é o mesmo para as seções 4a, 4b e 4c.
-- LISTING 3: EXECUTE DML IN TSQLV4_NOADR DATABASE -- 3a. Execute INSERT Statement in TSQLV4_NOADR Database USE TSQLV4_NOADR GO BEGIN TRAN SET STATISTICS IO ON; SET STATISTICS TIME ON; SELECT * INTO [Sales].[OrderDetails_noadr] FROM [Sales].[OrderDetails]; GO INSERT INTO [Sales].[OrderDetails_noadr] SELECT * FROM [Sales].[OrderDetails]; GO 50 COMMIT; -- 3b. Execute DELETE in TSQLV4_NOADR Database USE TSQLV4_NOADR GO BEGIN TRAN SET STATISTICS IO ON; SET STATISTICS TIME ON; DELETE FROM [Sales].[OrderDetails_noadr] GO -- 3c. Perform Rollback and Capture Time ROLLBACK;
Fig. 4 e 5 nos mostram que a operação SELECT INTO levou 6 milissegundos a mais no banco de dados TSQLV4_ADR onde habilitamos o Accelerated Database Recovery. Também vemos na Fig. 6 que temos maior uso de log de transações no banco de dados TSQLV4_ADR. Fiquei particularmente surpreso com isso, então repeti o experimento várias vezes para garantir que estava obtendo esse resultado de forma consistente.
Fig. 4 Inserir tempo de execução para TSQLV4_NOADR
Fig. 5 Inserir tempo de execução para TSQLV4_ADR
Fig. 6 Uso do log de transações após inserções
-- LISTING 4: EXECUTE DML IN TSQLV4_ADR DATABASE -- 4a. Execute INSERT Statement in TSQLV4_ADR Database USE TSQLV4_ADR GO BEGIN TRAN SET STATISTICS IO ON; SET STATISTICS TIME ON; SELECT * INTO [Sales].[OrderDetails_adr] FROM [Sales].[OrderDetails]; GO INSERT INTO [Sales].[OrderDetails_adr] SELECT * FROM [Sales].[OrderDetails]; GO 50 COMMIT; -- 4b. Execute DELETE in TSQLV4_ADR Database USE TSQLV4_ADR GO BEGIN TRAN SET STATISTICS IO ON; SET STATISTICS TIME ON; DELETE FROM [Sales].[OrderDetails_adr] GO -- 4c. Perform Rollback and Capture Time ROLLBACK;
Fig. 7 e 8 nos mostram que a operação DELETE levou muito mais tempo para ser concluída no banco de dados TSQLV4_ADR, onde havíamos ativado a Recuperação de banco de dados acelerada, embora o mesmo número de linhas tenha sido excluído em ambos os bancos de dados. Desta vez, porém, temos maior uso de log de transações no banco de dados TSQLV4_NOADR.
Fig. 7 Excluir tempo de execução para TSQLV4_NOADR
Fig. 8 Excluir tempo de execução para TSQLV4_ADR
Fig. 9 Uso do log de transações após exclusões
A essa altura, estava ficando óbvio que as operações DML demoram mais em bancos de dados com ADR ativado. Isso explica parcialmente por que o recurso está desativado em primeiro lugar. Pensando profundamente nisso, faz sentido, pois o SQL Server deve armazenar as versões de linha no PVS enquanto uma operação de inserção, atualização ou exclusão está em execução. Seja qual for a quantidade de tempo que o DML leva, descobrimos que a emissão de um ROLLBACK com o ADR ativado leva menos de 1 milissegundo (veja as Figs. 10 – 13). Em alguns casos, a reversão rápida pode compensar a sobrecarga do próprio DML, mas não em todos os casos!
Fig. 10 Tempo de execução para ROLLBACK (após DELETE) em TSQLV4_NOADR
Fig. 11 Tempo de execução para ROLLBACK (após DELETE) em TSQLV4_ADR
Fig. 12 Tempo de execução para ROLLBACK (após INSERT) em TSQLV4_NOADR
Fig. 13 Tempo de execução para ROLLBACK (após DELETE) em TSQLV4_ADR
Conclusão
A Recuperação Acelerada de Banco de Dados é um dos grandes recursos lançados no SQL Server 2019. No entanto, como em todas as coisas extremamente boas da vida, alguém precisa pagar por isso. O ADR pode ter um impacto negativo no desempenho em determinados cenários, por isso é importante avaliar seu cenário cuidadosamente antes de implementar o ADR em seu banco de dados de produção. A Microsoft recomenda especificamente a Recuperação de Banco de Dados Acelerada para bancos de dados que dão suporte a cargas de trabalho com transações de longa duração, crescimento excessivo do log de transações ou interrupções frequentes relacionadas a uma recuperação de longa duração.
Referências
Recuperação acelerada de banco de dados
Como funciona a recuperação acelerada de banco de dados?
Recuperação acelerada de banco de dados