MSSQLSERVER_9017

Aplica-se a: SQL Server

Detalhes

Atributo Valor
Nome do produto SQL Server
ID do evento 9017
Origem do Evento MSSQLSERVER
Componente SQLEngine
Nome simbólico LOG_MANY_VLFS
Texto da mensagem O banco de dados %ls tem mais de %d arquivos de log virtuais, o que é excessivo. Muitos arquivos de log virtuais podem causar longos tempos de inicialização e backup. Considere reduzir o log e usar um incremento de crescimento diferente para reduzir o número de arquivos de log virtuais.

Explicação

Durante a inicialização de um banco de dados, o SQL Server detecta que um banco de dados tem um grande número de VLFs (arquivos de log virtuais) e registra essa mensagem de erro. As situações em que você pode encontrar o erro são:

  • Quando você inicia uma instância do SQL Server
  • Restaurar um banco de dados
  • Anexar um banco de dados

A mensagem informativa 9017 semelhante a este exemplo é registrada no log de erros do SQL Server:

Database dbName has more than n virtual log files which is excessive. Too many virtual log files can cause long startup and backup times. Consider shrinking the log and using a different growth increment to reduce the number of virtual log files. Too many virtual log files can adversely affect the recovery time of the database.

Além disso, se você usar as tecnologias Replicação, Espelhamento de Banco de Dados ou AlwaysOn em seu ambiente, poderá notar problemas de desempenho com essas tecnologias.

O efeito de muitos VLFs na replicação

Muitos arquivos de log podem afetar a replicação porque o processo do leitor de log deve verificar cada arquivo de log virtual em busca de transações marcadas para replicação. Você pode ver esse comportamento rastreando o desempenho do procedimento armazenado sp_replcmds. O processo do leitor de log usa o procedimento armazenado sp_replcmds para verificar os arquivos de log virtuais e ler as transações marcadas para replicação.

Causa

Esse problema ocorre quando você especifica valores pequenos para o parâmetro FILEGROWTH para seus arquivos de log de transações.

O Mecanismo de Banco de Dados do SQL Server divide internamente cada arquivo de log físico em vários VLFs (arquivos de log virtuais). O SQL Server 2008 R2 Service Pack 2 introduziu uma nova mensagem (9017) que é registrada quando um banco de dados é iniciado (devido à inicialização de uma instância do SQL Server ou devido à anexação ou restauração do banco de dados) e tem mais de 1.000 VLFs no SQL Server 2008 R2 ou tem mais de 10.000 VLFS no SQL Server 2012 e versões posteriores.

Nota

No SQL Server 2012, embora essa mensagem seja registrada quando o banco de dados tem 10.000 VLFs, a mensagem real relatada no log de erros informa incorretamente "1000 VLF". O aviso ocorre após 10.000 VLFs. No entanto, a mensagem relata 1.000 VLFs. Esse problema foi corrigido em versões posteriores.

Ação do usuário

Para resolver esse problema, siga estas etapas:

  1. Você pode exibir a contagem de VLF e o tamanho médio em seu SQL Server usando essa consulta. O resultado ajudará você a identificar em quais bancos de dados se concentrar:

    SELECT db.name, count(dbl.database_id) as Total_VLF_count, convert(decimal (10,2), avg(dbl.vlf_size_mb)) as Avg_VLF_Size_MB
    FROM sys.databases db
     CROSS APPLY sys.dm_db_log_info(db.database_id) dbl
    GROUP BY db.name
    ORDER BY Total_VLF_count DESC
    

    Para obter mais informações, consulte sys.dm_db_log_info.

  2. Reduza o log de transações usando DBCC SHRINKDB/DBCC SHRINKFILE ou usando SQL Server Management Studio.

  3. Execute um aumento único do tamanho do arquivo de log de transações para um valor grande. Esse aumento único é feito para evitar crescimentos automáticos frequentes. Para obter mais informações, consulte Gerenciar o tamanho do arquivo de log de transações.

  4. Aumente o parâmetro FILEGROWTH para um valor maior do que o configurado no momento. Isso deve ser baseado na atividade do banco de dados e na frequência com que o arquivo de log está crescendo.

  5. Além disso, você pode examinar os seguintes artigos de correção, dependendo da versão do SQL Server que você está executando no momento:

    CORREÇÃO: Leva muito tempo para restaurar um banco de dados no SQL Server 2008 R2, SQL Server 2008 ou SQL Server 2012

    CORREÇÃO: Desempenho lento ao recuperar um banco de dados se houver muitos VLFs dentro do log de transações no SQL Server 2005, SQL Server 2008 ou SQL Server 2008 R2

    CORREÇÃO: A recuperação leva mais tempo do que o esperado para um banco de dados em um ambiente SQL Server 2008 ou SQL Server 2008 R2

Gorjeta

Para determinar a distribuição ideal de VLF para o tamanho atual do log de transações de todos os bancos de dados em uma instância determinada e os incrementos de crescimento necessários para alcançar o tamanho necessário, consulte este script.