Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

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

Устранение разрастания LDF и фрагментации VLF: правильный DBCC SHRINKFILE

Обновлено: 26.08.2026  ·  Официальная база знаний

Разрастание файла журнала и фрагментация VLF вызывают серьезные проблемы производительности:

  • Файл .ldf занял 100% емкости тома, парализуя работу СУБД;
  • Медленный старт базы данных (Recovery Phase) при перезагрузке сервера из-за наличия десятков тысяч мелких VLF;
  • Задержки при вставке и модификации данных в 1С (Log Write Waits / WRITELOG wait types).

1. Проверка количества и размера виртуальных лог-файлов (VLF)

Выполните анализ фрагментации структуры журнала:

-- Для SQL Server 2016 SP2 и новее:
SELECT 
    file_id,
    COUNT(vlf_sequence_number) AS Total_VLF_Count,
    SUM(vlf_size_mb) AS Total_Size_MB
FROM sys.dm_db_log_info(DB_ID('ERP_1C'))
GROUP BY file_id;

Если Total_VLF_Count превышает 500-1000 — журнал транзакций сильно фрагментирован и требует пересоздания.

2. Корректная процедура сжатия файла журнала (Shrink)

Шаг 1: Убедитесь, что активная часть лога сброшена бэкапом:

USE [ERP_1C];
GO
BACKUP LOG [ERP_1C] TO DISK = N'E:\Backup\Log\flush.trn' WITH COMPRESSION;
GO

Шаг 2: Определение логического имени файла LDF:

SELECT name, physical_name FROM sys.database_files WHERE type_desc = 'LOG';

Шаг 3: Выполнение сжатия до минимального целевого размера (например, 1024 МБ):

USE [ERP_1C];
GO
DBCC SHRINKFILE (N'ERP_1C_Log', 1024);
GO

3. Предотвращение фрагментации VLF (Правильный Autogrowth)

После сжатия задайте достаточный фиксированный размер файла LDF и правильный шаг авторасширения (от 512MB до 2048MB, но не в процентах!):

ALTER DATABASE [ERP_1C] 
MODIFY FILE ( NAME = N'ERP_1C_Log', SIZE = 8192MB , FILEGROWTH = 1024MB );
GO
Практический опыт инженера: Никогда не включайте опцию AUTO_SHRINK в свойствах базы данных. Постоянный цикл 'авторасширение -> автосжатие' убивает производительность дисков и фрагментирует как файлы данных, так и файловую систему NTFS.

Частые вопросы (FAQ)

Почему нельзя использовать авторасширение (Autogrowth) в процентах (например, 10%)?

Процентное расширение на больших базах порождает непредсказуемые скачки выделения места, а на малых — тысячи микро-VLF файлов размером по несколько килобайт. Это вызывает деградацию операций записи журнала (wait type WRITELOG).

Почему DBCC SHRINKFILE не уменьшает файл LDF даже после выполнения бэкапа?

Активный виртуальный лог-файл (Active VLF) может находиться в самом конце физического файла .ldf. Сделайте еще один бэкап лога или сгенерируйте фиктивную транзакцию (например, создайте и удалите временную таблицу), чтобы указатель активного VLF перешел в начало файла, затем повторите Shrink.

Можно ли сжимать файлы данных (MDF) с помощью DBCC SHRINKDATABASE?

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

Какое оптимальное количество VLF должно быть у рабочей базы 1С?

Оптимальное количество VLF для стабильной производительности составляет от 50 до 300 файлов при общем размере журнала 8-32 ГБ.