Привет, Хабр! Представляю вам перевод статьи «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

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

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

Комментарии (8)


  1. AlanDenton
    21.02.2018 17:25
    +2

    Замедлить работу в каких сценариях? Почему? Много вещей не покрывает данная статья


  1. minamoto
    21.02.2018 18:52
    +2

    Качество перевода хромает на обе ноги. Перевод не помечен как перевод. Тэги все мимо, кроме последнего.
    Но тема в целом полезная, VLF нужно иметь в виду при управлении логом.


    1. Kordov Автор
      24.02.2018 16:16

      Sorry, пишу первый раз, поэтому не нашел пометку перевод.


  1. mayorovp
    21.02.2018 19:47
    +1

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

    Вот за это я и ненавижу машинные переводы. На английском читать — и то понятнее.


  1. osipov_dv
    22.02.2018 09:11

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

    хм… не понятно, как ни крути. Вероятно здесь рекомендация изменить дефолтное значение прироста с 1 мб на 1 гб…
    вспоминаются гуртовщики мыши и «любимый» promt


  1. gotch
    22.02.2018 09:54

    Кстати, когда VLF становится нездоровое количество, SQL пишет об этом в журнал при запуске базы.


  1. jobgemws
    23.02.2018 22:25

    Если это перевод, то в целом интересно, но переведено не лучшим образом.
    Если же это собственная статья с элементами перевода другой статьи, то многое не раскрыто.
    Сама статья очень поверхностная, но главный элемент здесь присутствует-это четкая постановка проблемы и пути ее решения (т е основной скелет есть, но также нужно мясо побольше).


    1. Kordov Автор
      24.02.2018 16:14
      +1

      Будет мясо!