Анализ Virtual Log Files (VLF) и устранение фрагментации журнала в MSSQL
- Крайне медленный старт базы данных и длительная фаза восстановления (Recovery Phase) при перезапуске экземпляра.
- Задержки при фиксации транзакций и выполнении операций
INSERT/UPDATEв 1С. - Замедление создания бэкапов журнала транзакций и процессов репликации/AlwaysOn.
- Количество VLF в файле
.ldfпревышает 1000–5000 единиц.
1. Анализ текущего количества VLF в базах данных
-- Для SQL Server 2016 SP2 и новее
SELECT
db.name AS DatabaseName,
ls.total_vlf_count AS TotalVLFCount,
ls.active_vlf_count AS ActiveVLFCount,
ls.total_log_size_mb AS LogSizeMB
FROM sys.databases db
CROSS APPLY sys.dm_db_log_stats(db.database_id) ls
WHERE ls.total_vlf_count > 500
ORDER BY ls.total_vlf_count DESC;2. Процедура дефрагментации и устранения избыточных VLF
Для устранения фрагментации необходимо очистить неактивную часть журнала, сжать его и вырастить заново фиксированными блоками:
USE [TradeEnterprise];
GO
-- 1. Снятие бэкапа журнала транзакций (для усечения неактивных VLF)
BACKUP LOG [TradeEnterprise] TO DISK = N'D:\Backups\Trade_Log_Truncate.trn';
-- 2. Сжатие файла журнала до минимального размера (например, 100 МБ)
DBCC SHRINKFILE (N'TradeEnterprise_Log', 100);
GO
-- 3. Пошаговое увеличение файла журнала правильными порциями по 8 ГБ
-- (Каждая итерация создает фиксированное число VLF)
ALTER DATABASE [TradeEnterprise]
MODIFY FILE (NAME = N'TradeEnterprise_Log', SIZE = 8192MB);
ALTER DATABASE [TradeEnterprise]
MODIFY FILE (NAME = N'TradeEnterprise_Log', SIZE = 16384MB);
ALTER DATABASE [TradeEnterprise]
MODIFY FILE (NAME = N'TradeEnterprise_Log', SIZE = 32768MB);
GO3. Установка правильного шага Autogrowth
Никогда не используйте процентный прирост (например, 10%). Задайте фиксированный шаг:
ALTER DATABASE [TradeEnterprise]
MODIFY FILE (NAME = N'TradeEnterprise_Log', FILEGROWTH = 1024MB); Частые вопросы (FAQ)
Почему большое количество VLF замедляет работу SQL Server?
Каждый VLF обрабатывается последовательно при сканировании лога, старте базы, создании бэкапов и работе Always On. Тысячи мелких VLF вызывают сильные накладные расходы на управление метаданными.
Какое количество VLF считается нормальным для продакшн-базы?
Оптимальное количество VLF для баз любого размера находится в диапазоне от 50 до 300. Количество более 1000 требует обязательной дефрагментации.
Как алгоритм SQL Server генерирует VLF в зависимости от шага прироста?
Прирост < 64 МБ создает 4 VLF; от 64 МБ до 1 ГБ — 8 VLF; прирост более 1 ГБ создает 16 новых VLF за каждое автоувеличение.
Почему DBCC SHRINKFILE не может уменьшить размер лога?
Сжатие невозможно, если последний VLF в конце файла является активным. Сделайте бэкап журнала транзакций и повторите команду shrink.