MSSQLSERVER_9017

Применимо к:SQL Server

Сведения

Атрибут значение
Название продукта SQL Server
Идентификатор события 9017
Источник событий MSSQLSERVER
Компонент SQLEngine
Символическое имя LOG_MANY_VLFS
Текст сообщения База данных %ls имеет более %d виртуальных файлов журналов, что чрезмерно. Слишком много виртуальных файлов журнала может привести к длительному времени запуска и резервного копирования. Рассмотрите возможность сжатия журнала и увеличения числа виртуальных файлов журналов с помощью другого увеличения.

Пояснение

Во время запуска базы данных SQL Server обнаруживает, что база данных содержит большое количество виртуальных файлов журналов (VLFs) и регистрирует это сообщение об ошибке. Ситуации, в которых может возникнуть ошибка:

  • При запуске экземпляра SQL Server
  • Восстановление базы данных
  • Присоединение базы данных

Информационное сообщение 9017, аналогичное этому примеру, регистрируется в журнале ошибок 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.

Кроме того, при использовании технологий репликации, зеркального отображения баз данных или AlwaysOn в вашей среде могут возникнуть проблемы с производительностью этих технологий.

Влияние многих VLFs на репликацию

Слишком много файлов журнала может повлиять на репликацию, так как процесс чтения журналов должен проверять каждый файл виртуального журнала для транзакций, помеченных для репликации. Это поведение можно увидеть, трассировка производительности хранимой процедуры sp_replcmds. Процесс чтения журналов использует хранимую процедуру sp_replcmds для сканирования файлов виртуальных журналов и чтения транзакций, помеченных для репликации.

Причина

Эта проблема возникает при указании небольших значений параметра FILEGROWTH для файлов журнала транзакций.

Ядро СУБД SQL Server внутренне делит каждый физический файл журнала на несколько виртуальных файлов журналов (VLFs). SQL Server 2008 R2 с пакетом обновления 2 (SP2) представило новое сообщение (9017), которое регистрируется при запуске базы данных (из-за начала экземпляра SQL Server или из-за присоединения или восстановления базы данных database) и имеет более 1000 VLFs в SQL Server 2008 R2 или имеет более 10 000 VLFS в SQL Server 2012 и более поздних версиях.

Заметка

В SQL Server 2012, хотя это сообщение регистрируется, если база данных имеет 10 000 VLFs, фактическое сообщение, сообщаемое в журнале ошибок, неправильно указывает "1000 VLF". Предупреждение происходит после 10 000 VLFs. Однако сообщение сообщает о 1000 VLFs. Эта проблема устранена в последующих выпусках.

Действие пользователя

Устранить проблему можно так:

  1. С помощью этого запроса можно просмотреть количество и средний размер VLF в SQL Server. Результат поможет определить, на какие базы данных следует сосредоточиться:

    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
    

    Дополнительные сведения см. в sys.dm_db_log_info.

  2. Уменьшите журнал транзакций с помощью DBCC SHRINKDB/DBCC SHRINKFILE или с помощью SQL Server Management Studio.

  3. Выполните однократное увеличение размера файла журнала транзакций до большого значения. Это однократное увеличение делается, чтобы избежать частых автоматических ростов. Дополнительные сведения см. в разделе "Управление размером файла журнала транзакций".

  4. Увеличьте параметр FILEGROWTH до большего значения, чем настроено в данный момент. Это должно быть основано на активности базы данных и частоте роста файла журнала.

  5. Кроме того, вы можете ознакомиться со следующими статьями по исправлению в зависимости от версии SQL Server, которую вы используете в настоящее время:

    ИСПРАВЛЕНИЕ. Восстановление базы данных в SQL Server 2008 R2, SQL Server 2008 или SQL Server 2012 занимает много времени.

    ИСПРАВЛЕНИЕ. Низкая производительность при восстановлении базы данных, если в журнале транзакций имеется множество VLF в SQL Server 2005, SQL Server 2008 или SQL Server 2008 R2

    ИСПРАВЛЕНИЕ. Восстановление занимает больше времени, чем ожидалось для базы данных в среде SQL Server 2008 или SQL Server 2008 R2

Совет

Чтобы определить оптимальное распределение виртуальных файлов журнала для текущего размера журнала транзакций всех баз данных в определенном экземпляре, а также требуемые приращения для достижения нужного размера, см. следующий скрипт.