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. Эта проблема устранена в последующих выпусках.
Действие пользователя
Устранить проблему можно так:
С помощью этого запроса можно просмотреть количество и средний размер 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
Уменьшите журнал транзакций с помощью DBCC SHRINKDB/DBCC SHRINKFILE или с помощью SQL Server Management Studio.
Выполните однократное увеличение размера файла журнала транзакций до большого значения. Это однократное увеличение делается, чтобы избежать частых автоматических ростов. Дополнительные сведения см. в разделе "Управление размером файла журнала транзакций".
Увеличьте параметр FILEGROWTH до большего значения, чем настроено в данный момент. Это должно быть основано на активности базы данных и частоте роста файла журнала.
Кроме того, вы можете ознакомиться со следующими статьями по исправлению в зависимости от версии SQL Server, которую вы используете в настоящее время:
Совет
Чтобы определить оптимальное распределение виртуальных файлов журнала для текущего размера журнала транзакций всех баз данных в определенном экземпляре, а также требуемые приращения для достижения нужного размера, см. следующий скрипт.