Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

MSSQL_HIGH_VLF_COUNT 1С:Предприятие и СУБД

Анализ Virtual Log Files (VLF) и устранение фрагментации журнала в MSSQL

Обновлено: 26.08.2026 · Официальная документация ↗
  • Крайне медленный старт базы данных и длительная фаза восстановления (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);
GO

3. Установка правильного шага Autogrowth

Никогда не используйте процентный прирост (например, 10%). Задайте фиксированный шаг:

ALTER DATABASE [TradeEnterprise] 
MODIFY FILE (NAME = N'TradeEnterprise_Log', FILEGROWTH = 1024MB);
💡 Практика специалистов: При создании новой базы 1С сразу выставляйте размер лога, соответствующий суточному объему изменений (например, 32 ГБ), с шагом автоувеличения 1024 МБ. Это исключит фрагментацию VLF с первого дня эксплуатации.

Частые вопросы (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.

Полезные материалы
Рекомендуем