VLFs — Забытый враг +12


Привет, Хабр! Представляю вам перевод статьи «VLFs — The Forgotten Foe» автора Monica Rathbun.

Сколько из вас проверяет количество файлов виртуального журнала (VLF), которые есть в ваших журналах транзакций?

image

Сейчас, работая консультантом, я вижу что часто это игнорируется администраторами баз данных. Это непростая задача для поддержания и тем не менее, многие не знают, как это сделать. Хранение этих данных может повысить производительность не только при запуске, но и при вставке / обновлении / удалении, а также операции резервного копирования / восстановления. SQL Server лучше работает с меньшим количеством виртуальных файлов журнала нужным размером. Я настоятельно рекомендую вам добавить это на свои серверы.

Что такое VLF?


Каждый журнал транзакций состоит из небольших сегментов, называемых виртуальными файлами журнала (VLF). Каждый раз, когда событие рост происходит в новых сегментах, файлы виртуальных журналов создаются в конце файла журнала транзакций. Большое количество VLF может замедлить работу.

image

Какая причина роста VLF?


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

Пример


Если вы увеличите свой лог по умолчанию на 1 МБ, вы можете получить тысячи VLF, и увеличить лог на 1 ГБ. В MSDN отлично объяснено, как работают журналы транзакций, который я рекомендую прочитать.

Как узнать, сколько VLF-файлов имеют мои файлы журналов?

Очень легко понять, сколько VLF у вас есть в вашем файле журнала. Убедитесь, что вы находитесь в контексте базы данных, в которой вы хотите это узнать. В моем случае это TEMPDB и выполните команду DBCC LOGINFO.

USE tempdb   
DBCC LOGINFO

Запрос вернет множество всех LSN, созданных для этой базы данных, COUNT этих строк — это количество VLF, которое у вас есть.

image

Теперь есть много способов, с помощью которых вы можете получить представление об этом с помощью T-SQL, поэтому имейте это в виду. Напишите что-нибудь, что перекатывается через все ваши базы данных и дает вам количество записей для каждого. В Интернете есть много полезных примеров.

Количество VLF должно быть не более 100 в идеале, все вышеперечисленное должно быть рассмотрено.

* Новый DMV (Используем SQL Server Dynamic Management Views and Functions), который даст вам еще более простой способ получить значения VLF sys.dm_db_log_stats (database_id).

SELECT name AS 'Database Name', total_vlf_count AS 'VLF count'   
FROM sys.databases AS s   
CROSS APPLY sys.dm_db_log_stats(s.database_id)   
WHERE total_vlf_count > 100;   

Как это исправить?


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

  • Выполните Shrink, используя DBCC SHRINKFILE

    SHRINKFILE (N'Log_Logical_Name_Here', 0, TRUNCATEONLY);
  • Восстановите свой журнал с инкрементом, который имеет смысл для твоего окружения. Однако, если ваш файл превышает 8 ГБ, рекомендуется повысить размер блока до 8000 МБ. Значение вашего инкремента автоматически должен быть установлен на более низкое значение. Не существует установленного правила для того, какими должны быть эти значения, может потребоваться много проб и ошибок, чтобы выяснить, что лучше для вашего окружения.

    USE[master]
    GO
    ALTER DATABASE[tempdb] MODIFY FILE(NAME = N 'tempdev', SIZE = 8192000 KB)
    GO

Примечание. Увеличение журнала может привести к удару по производительности и блокировке транзакций, обязательно выполните это во время обслуживания.

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




К сожалению, не доступен сервер mySQL