Почему бэкап журнала транзакций имеет большой размер и как его уменьшить?

Системный администратор 1С v8.3 (Управляемые формы) 1С:Розница Торговля и дистрибуция
← На главную

При администрировании баз данных 1С на SQL Server системные администраторы часто сталкиваются с ситуацией, когда размер резервной копии журнала транзакций (transaction log) оказывается сопоставим или даже превышает размер полной резервной копии всей базы данных. Это вызывает вопросы, особенно если полные бэкапы делаются ежедневно, а лог — каждые 30 минут. Давайте разберем эту ситуацию на примере работы с 1С:Розница и SQL Server 2017, выясним причины такого поведения системы и найдем эффективные способы оптимизации.

Анализируем механизм работы журнала транзакций

Для начала развеем популярный миф: полная резервная копия базы данных (Full Backup) не очищает и не усекает журнал транзакций в полной модели восстановления (Full Recovery Model). В этой модели единственный способ «пометить» пространство в логе как свободное для повторного использования — это сделать бэкап самого журнала транзакций (Log Backup).

Рассмотрим стандартную ситуацию. У нас есть база объемом 35 Гб. Мы делаем полный бэкап, после чего запускаем обслуживание индексов, а затем — бэкап лога. Если первый бэкап лога после «фулла» весит 15 Гб, это означает, что между моментом завершения полного бэкапа и моментом запуска бэкапа лога в базе было изменено или переписано данных именно на этот объем. В контексте 1С основным потребителем места в логе выступает операция INDEX REBUILD.

Причина №1: Перестроение индексов (Index Rebuild)

Основная причина взрывного роста журнала транзакций — это регламентное задание по перестроению индексов. Когда SQL Server выполняет REBUILD, он фактически создает новый индекс и удаляет старый. В полной модели восстановления каждая такая операция фиксируется в журнале транзакций. Если база данных интенсивно работает и индексы занимают значительную часть объема, их перестроение легко может сгенерировать десятки гигабайт записей в логе.

Проанализируем разницу между двумя методами обслуживания:

  1. Rebuild (Перестроение): Тяжелая операция, которая полностью пересоздает структуру индекса. Она максимально нагружает журнал транзакций.
  2. Reorganize (Реорганизация): Более легкая операция (INDEX REORGANIZE), которая дефрагментирует существующие страницы индекса. Она протоколируется минимально и почти не вызывает роста бэкапа лога.

Рекомендация: Пересмотрите свои скрипты обслуживания. Для баз 1С хорошей практикой считается использование адаптивных сценариев:

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

Причина №2: Специфика SQL Server 2017 и возобновляемые индексы

Поскольку мы рассматриваем SQL Server 2017, нам доступна отличная функция — возобновляемое перестроение индексов (RESUMABLE INDEX REBUILD). Разберем, как это помогает контролировать размер лога. При обычном перестроении SQL Server вынужден держать транзакцию открытой до самого конца операции, что не дает журналу усекаться даже при частых бэкапах лога.

Если использовать RESUMABLE = ON, транзакция может фиксироваться частями. Это позволяет бэкапам лога, которые идут параллельно (например, каждые 30 минут), реально очищать уже обработанные части индекса из журнала, не дожидаясь окончания всего процесса. Пример команды:


ALTER INDEX ALL ON [ИмяТаблицы] REBUILD WITH (RESUMABLE = ON, MAX_DURATION = 120 MINUTES);

Причина №3: Модель восстановления и Bulk-Logged

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

Алгоритм действий может быть следующим:

  1. Переводим базу в BULK_LOGGED.
  2. Выполняем обслуживание индексов (Rebuild).
  3. Возвращаем базу в FULL.
  4. Сразу после этого обязательно делаем полный бэкап или бэкап лога, так как цепочка логов была изменена.

Внимание: Помните, что при нахождении базы в режиме Bulk-Logged вы теряете возможность восстановления «на точку во времени» (point-in-time) для транзакций, произошедших в этот период.

Проблема виртуальных лог-файлов (VLF) и Shrink

Рассмотрим ситуацию, упомянутую в обсуждении: файл лога раздут до 60 Гб, хотя данных в нем мало. Часто администраторы используют SHRINKFILE, чтобы уменьшить файл на диске. Однако постоянный цикл «рост файла — шринк» приводит к фрагментации самого файла лога на тысячи мелких виртуальных файлов (VLF).

Большое количество VLF (свыше 1000) значительно замедляет бэкап лога и процесс восстановления базы при сбоях. Выясним, как правильно настроить размер лога:

  1. Выполните SHRINKFILE для журнала до минимального размера.
  2. Вручную увеличьте файл журнала (Manual Grow) до размера, который покроет вашу ежедневную нагрузку (например, 10–15 Гб для базы в 35 Гб).
  3. Установите фиксированный шаг автороста (например, 512 Мб или 1024 Мб), избегайте роста в процентах.

Это позволит SQL Server создать несколько крупных и производительных VLF.

Мониторинг: Почему лог не очищается?

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


SELECT name, log_reuse_wait_desc 
FROM sys.databases 
WHERE name = 'ИмяВашейБазы';

Разберем основные значения log_reuse_wait_desc:

Специфика 1С:Розница и таблицы регистрации

В распределенных информационных базах (РИБ), характерных для ритейла, часто активно работают таблицы регистрации изменений. При интенсивных обменах эти таблицы постоянно меняются. Если в плане обслуживания стоит жесткое перестроение индексов для всех таблиц подряд, это создает колоссальный поток данных в лог.

Проанализируем возможность исключения таблиц регистрации изменений (начинаются на _ChangeRec) из ежедневного REBUILD. Для них лучше использовать REORGANIZE, так как они постоянно находятся в динамике, и их перестроение дает лишь кратковременный эффект, заполняя при этом весь диск бэкапами лога.

Итоговый алгоритм решения проблемы

  1. Сместите время обслуживания: Убедитесь, что перестроение индексов не пересекается по времени с важными бизнес-процессами и выполняется в «окно», когда размер бэкапа лога менее критичен для дискового пространства.
  2. Используйте умные скрипты: Замените тотальный REBUILD на скрипт с проверкой уровня фрагментации (например, популярный скрипт от Ola Hallengren или аналоги).
  3. Настройте бэкап лога: Если операция перестроения индексов занимает 2 часа, делайте бэкап лога чаще во время этой операции, чтобы он усекался порциями (при условии использования RESUMABLE в SQL 2017+).
  4. Контролируйте размер файла: Не делайте SHRINK лога ежедневно. Пусть файл имеет стабильный размер, достаточный для прохождения регламентных работ без автороста.

Соблюдение этих правил позволит вам сократить размер первого бэкапа журнала транзакций после обслуживания индексов в несколько раз и обеспечит стабильную работу системы 1С.

← На главную