MSSQLSERVER_9017
Aplica-se a: SQL Server
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. |
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.
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.
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.
Para resolver esse problema, siga estas etapas:
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.
Reduza o log de transações usando DBCC SHRINKDB/DBCC SHRINKFILE ou usando SQL Server Management Studio.
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.
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.
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:
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.