Reduzindo o log de transações

Se você sabe que o arquivo de log de transações contém espaço não utilizado que não será necessário, poderá requisitar o espaço extra reduzindo seu tamanho. Esse processo é conhecido como redução do arquivo de log.

A redução pode ocorrer apenas enquanto o banco de dados estiver online e pelo menos um arquivo de log virtual estiver livre. Em alguns casos, talvez não seja possível reduzir antes o próximo truncamento de log.

ObservaçãoObservação

Geralmente, o truncamento ocorre automaticamente sob o modelo de recuperação simples quando é feito backup do banco de dados e com o modelo de recuperação completa quando é feito backup do log de transações. No entanto, o truncamento pode ser atrasado por diversos fatores. Para obter mais informações, consulte Fatores que podem atrasar o truncamento de log.

Para reduzir um arquivo de log (sem reduzir os arquivos do banco de dados)

Para monitorar eventos de redução de arquivo de log

To monitor log space

ObservaçãoObservação

A redução de arquivos de log e do banco de dados pode ser configurada para ocorrer automaticamente. Contudo, não é recomendável a redução automática, e a propriedade de banco de dados autoshrink é definida como FALSE por padrão. Se autoshrink for configurada como TRUE, a redução automática reduzirá o tamanho de um arquivo apenas quando mais de 25 por cento de seu espaço estiver inutilizado. O arquivo é reduzido de forma que 25% de seu tamanho seja de espaço não utilizado ou ele tenha o tamanho original, o que for maior. Para obter informações sobre como alterar a configuração da propriedade autoshrink, consulte Como exibir ou alterar as propriedades de um banco de dados (SQL Server Management Studio) – use a propriedade Reduzir Automaticamente da página Opções – ou Opções ALTER DATABASE SET (Transact-SQL) – use a opção AUTO_SHRINK.

Como funciona a redução do arquivo de log?

Reduzir o log de transações diminui seu tamanho físico removendo um ou mais arquivos de log virtuais inativos. A unidade da redução de tamanho é sempre o arquivo de log virtual. Por exemplo, se você tiver um arquivo de log de 600 megabytes (MB) que foi dividido em seis logs virtuais de 100 MB, o tamanho do arquivo de log só poderá ser reduzido em incrementos de 100 MB. O tamanho do arquivo pode ser reduzido a tamanhos como 500 MB ou 400 MB, mas o arquivo não pode ser reduzido a tamanhos como 433 MB ou 525 MB. Um arquivo de log virtual que mantenha algum registro de log ativo, quer dizer, um arquivo de log virtual ativo, faz parte do log lógico e não poderá ser removido. Para obter mais informações, consulte Arquitetura física de log de transações.

ObservaçãoObservação

O Mecanismo de Banco de Dados escolhe o tamanho do arquivo de log virtual dinamicamente quando os arquivos de log são criados ou estendidos. Para obter mais informações, consulte Arquitetura física de log de transações.

Para um arquivo de log, o tamanho atual é igual ao tamanho total das páginas usadas pelos arquivos de log virtuais. Porém, observe que páginas não são usadas pelos arquivos de log. Os arquivos de log virtuais que mantêm qualquer parte do log lógico não podem ser liberados. Se todos os arquivos de log virtuais em um arquivo de log mantiverem partes do log lógico, o arquivo não poderá ser reduzido. A redução só é possível depois de o truncamento de log marcar um ou mais dos arquivos de log virtuais como inativos.

Uma operação de redução do arquivo só pode remover arquivos de log virtuais inativos. Se nenhum tamanho de destino for especificado, uma operação de redução de arquivo removerá apenas arquivos de log virtuais inativos posteriores ao arquivo de log virtual ativado por último no arquivo. Se um tamanho do destino for especificado, uma determinada operação de redução do arquivo só removerá arquivos de log virtuais inativos suficientes para se aproximar do tamanho especificado, sem excedê-lo. Depois de reduzido, o arquivo de log é geralmente um pouco maior que o tamanho especificado, e nunca será menor. Os arquivos de log virtuais tornam difícil prever quanto o arquivo de log realmente será reduzido.

Quando qualquer arquivo for reduzido, o espaço liberado deverá estar no final do arquivo. Quando um arquivo de log de transações é reduzido, um número suficiente de arquivos de log virtuais no final do arquivo de log é liberado para reduzir o log ao tamanho solicitado pelo usuário. O target_size especificado pelo usuário é arredondado para o próximo limite de arquivo de log virtual mais elevado. Por exemplo, se um usuário especificar um target_size de 325 MB para nosso arquivo exemplo de 600 MB que contém seis arquivos de log virtuais de 100 MB, os últimos dois arquivos de log virtuais serão removidos e o tamanho do arquivo novo será 400 MB.

Uma operação DBCC SHRINKDATABASE ou DBCC SHRINKFILE tenta imediatamente reduzir o arquivo de log físico ao tamanho pedido:

  • Se nenhuma parte do log lógico nos arquivos de log virtuais se estender além da marca target_size, os arquivos de log virtuais que vêm depois da marca target_size serão liberados e a instrução DBCC será concluída com êxito e sem mensagens.

Se parte do log lógico nos logs virtuais se estender além da marca target_size, o Mecanismo de banco de dados do SQL Server liberará tanto espaço quanto possível e emitirá uma mensagem informativa. A mensagem informa quais ações você deve realizar para remover o log lógico dos logs virtuais no final do arquivo. Depois de executar essa ação, você poderá reemitir a instrução DBCC para liberar o espaço restante.

Por exemplo, suponha que um arquivo de log de 600 MB que contém seis arquivos de log virtuais tenha um log lógico que começa no log virtual 3 e termina no log virtual 4 quando você executa uma instrução DBCC SHRINKFILE com um target_size de 275 MB, que é três-quartos do caminho no log virtual 3:

Arquivo de log com seis arquivos de log virtuais antes da redução

Os arquivos de log virtuais 5 e 6 são liberados imediatamente porque não contêm parte do log lógico. Porém, para cumprir o target_size especificado, o arquivo de log virtual 4 também deveria ser liberado, mas não pode sê-lo porque contém a parte final do log lógico. Depois de liberar os arquivos de log virtuais 5 e 6, o Mecanismo de Banco de Dados preenche a parte restante do arquivo de log virtual 4 com registros fictícios. Isso força o final do arquivo de log para o final do arquivo de log virtual 1. Na maioria dos sistemas, todas as transações que começam no arquivo de log virtual 4 serão confirmadas em segundos. Isso significa que toda a porção ativa do log será movida para o arquivo de log virtual 1. O arquivo de log agora é semelhante a este:

O arquivo de log foi reduzido para quatro arquivos virtuais

A instrução DBCC SHRINKFILE também emite uma mensagem informativa que afirma que não foi possível liberar todo o espaço solicitado, e que você pode executar uma instrução BACKUP LOG para liberar o espaço restante. Depois de mover a porção ativa do log para o arquivo de log virtual 1, uma instrução BACKUP LOG trunca todo o log lógico que está no arquivo de log virtual 4:

Resultados do arquivo de log depois do truncamento do log

Como o arquivo de log virtual 4 já não contém nenhuma parte do log lógico, você pode executar a mesma instrução DBCC SHRINKFILE com um target_size de 275 MB. O arquivo de log virtual 4 é então liberado e o tamanho do arquivo de log físico é reduzido ao tamanho solicitado.

ObservaçãoObservação

Certos fatores, como uma transação demorada, podem manter arquivos de log virtuais ativos por um longo tempo. Isso pode restringir a redução de log ou até mesmo impedir que o log seja reduzido. Para obter mais informações, consulte Fatores que podem atrasar o truncamento de log.