Как уменьшить размер разросшегося файла журнала транзакций LDF в MS SQL Server для 1С?

Системный администратор IT и автоматизация бизнеса
← На главную

При администрировании баз данных 1С:Предприятия под управлением Microsoft SQL Server системные администраторы часто сталкиваются с ситуацией, когда файл журнала транзакций (с расширением .ldf) начинает бесконтрольно увеличиваться в размерах, занимая десятки и сотни гигабайт дискового пространства. Разберем по шагам, почему возникает эта проблема, когда имеет смысл перевести базу в простую модель восстановления (Simple), как правильно выполнить сжатие (Shrink) и как оптимизировать работу СУБД и платформы 1С, чтобы ситуация не повторялась.

Выясним причины избыточного роста файла LDF

Файл .ldf содержит журнал всех изменений данных, происходящих в базе. Проанализируем основные факторы, которые приводят к его стремительному росту:

  1. Полная модель восстановления (Full Recovery Model) без резервного копирования лога: в режиме Full СУБД не очищает неактивную часть журнала автоматически после фиксации транзакции. Очистка происходит только в момент выполнения резервного копирования журнала транзакций. Если настроен только бэкап самой базы данных (Full Backup), файл лога будет расти непрерывно.
  2. Длительные неделимые транзакции в 1С: массовое перепроведение документов за большой период, закрытие месяца, групповые обработки или масштабные обмены данными удерживают журнал открытым до момента завершения всей операции.
  3. Регламентные операции СУБД: перестроение и реорганизация индексов (Index Rebuild / Reorganize) генерируют колоссальный объем журнальных записей.
  4. Зависшие сеансы и блокировки: незавершенные транзакции пользователей или зависшие фоновые задания на сервере 1С не позволяют усечь лог.

Диагностика состояния журнала транзакций

Прежде чем предпринимать действия по очистке, выясним причину, по которой SQL Server не может освободить пространство внутри файла. Для этого выполним системный запрос к представлению sys.databases:


SELECT name, recovery_model_desc, log_reuse_wait_desc 
FROM sys.databases 
WHERE name = 'Имя_Базы_1С';

Рассмотрим значения поля log_reuse_wait_desc, которые объясняют причину блокировки усечения:

  1. LOG_BACKUP: усечение лога невозможно, так как не был сделан бэкап журнала транзакций (актуально для модели Full).
  2. ACTIVE_TRANSACTION: очистке мешает активная транзакция. Найти ее идентификатор и процесс можно с помощью команды DBCC OPENTRAN.
  3. CHECKPOINT: журнал ожидает создания контрольной точки (характерно для простой модели).
  4. REPLICATION / AVAILABILITY_GROUP: ожидается передача данных в узел репликации или группу доступности.

Вариант 1. Перевод базы данных в простую модель восстановления (Simple)

Если для базы данных нет жесткого требования восстанавливать состояние на любую произвольную секунду (Point-in-Time Recovery), а достаточно иметь ночные копии базы, перевод в режим Simple является самым простым и надежным решением. В этом режиме журнал транзакций автоматически усекается по контрольной точке (Checkpoint).

Разберем по шагам правильный алгоритм перевода базы в режим Simple:

  1. Создание полной резервной копии: перед любыми манипуляциями с настройками восстановления обязательно создаем свежий бэкап базы данных.
  2. Смена модели восстановления: в среде SQL Server Management Studio (SSMS) открываем свойства базы данных, переходим на вкладку Параметры (Options) и в поле Модель восстановления (Recovery model) выбираем Простая (Simple). Либо выполняем скрипт:
    
    USE [master];
    ALTER DATABASE [Имя_Базы_1С] SET RECOVERY SIMPLE;
    
  3. Уменьшение размера файла (Shrink): сама по себе смена модели не уменьшает физический размер файла на диске — она лишь освобождает внутреннее пространство. Чтобы вернуть место операционной системе, необходимо выполнить сжатие файла:
    
    USE [Имя_Базы_1С];
    DBCC SHRINKFILE (N'Имя_Файла_Лога' , 1024);
    

    Здесь второй параметр задает целевой размер файла в мегабайтах (например, 1024 МБ).

Вариант 2. Обслуживание лога при сохранении полной модели (Full)

Если специфика бизнеса требует возможности восстановления на любой момент времени, базу необходимо оставить в режиме Full. В этом случае уменьшение размера и предотвращение дальнейшего роста решается организацией правильного расписания обслуживания:

  1. Настройка частого бэкапа журнала: создаем регламентное задание в SQL Server Agent, выполняющее бэкап лога транзакций каждые 10–30 минут. Это позволит своевременно переиспользовать пространство внутри файла без его бесконечного расширения.
  2. Однократное усечение и сжатие: если файл уже раздут, делаем бэкап журнала с усечением, после чего выполняем команду DBCC SHRINKFILE.

Управление виртуальными файлами журнала (VLF) и шагом автороста

Проанализируем важный нюанс: при частых автоматических увеличениях файла лога на маленькие порции (например, по 1 МБ или по 10%) внутри файла создается огромное количество виртуальных файлов журнала (Virtual Log Files — VLF). Избыток VLF (более 1000) приводит к существенному замедлению старта базы, фиксации транзакций и создания бэкапов.

Посмотрим, как оптимизировать параметры размещения файла:

  1. Проверка количества VLF: выполним команду DBCC LOGINFO или сделаем выборку из sys.dm_db_log_info. Если количество строк превышает 1000–2000, структуру лога следует оптимизировать.
  2. Сброс и правильное выделение размера: усекаем файл журнала до минимума с помощью DBCC SHRINKFILE, а затем сразу вручную задаем ему фиксированный рабочий объем (например, 4096 МБ или 8192 МБ). Это сформирует минимальное и оптимальное количество фрагментов VLF.
  3. Настройка шага автороста (Autogrowth): категорически избегаем процентного прироста и шагов менее 256 МБ. Устанавливаем фиксированный шаг автороста в мегабайтах — 512 МБ, 1024 МБ или 2048 МБ.
  4. Отказ от регулярного сжатия (Auto Shrink): опция AUTO_SHRINK должна быть отключена, а регулярное сжатие лога не должно входить в ночные планы обслуживания, так как постоянное сжатие и расширение файла фрагментирует диск и создает лишнюю нагрузку на подсистему ввода-вывода.

Рекомендации по оптимизации со стороны платформы 1С:Предприятие

Чтобы снизить нагрузку на журнал транзакций на уровне прикладного кода 1С, рассмотрим следующие правила разработки и администрирования:

  1. Пакетная обработка данных: при написании алгоритмов массового изменения или загрузки данных обязательно делим выборку на порции (пакеты по 500–1000 элементов) с явным вызовом ЗафиксироватьТранзакцию() и последующим открытием новой транзакции методом НачатьТранзакцию():
    
    Счетчик = 0;
    НачатьТранзакцию();
    
    Для Каждого Стр Из ТаблицаДанных Цикл
        // Обработка данных
        Счетчик = Счетчик + 1;
        
        Если Счетчик % 1000 = 0 Тогда
            ЗафиксироватьТранзакцию();
            НачатьТранзакцию();
        КонецЕсли;
    КонецЦикла;
    
    Если ТранзакцияАктивна() Тогда
        ЗафиксироватьТранзакцию();
    КонецЕсли;
    
  2. Контроль регламентных заданий: отслеживаем через консоль кластера серверов 1С зависшие или зациклившиеся фоновые задания, которые могут часами удерживать транзакцию открытой.
  3. Использование временных таблиц: при сложных вычислениях во встроенном языке запросов отдаем предпочтение временным таблицам (помещаемым в tempdb), а не промежуточным записям в физические таблицы базы.
← На главную