Как предотвратить разрастание журнала транзакций MS SQL в базах 1С?

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

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

Почему разрастается журнал транзакций

Для понимания сути проблемы выясним причину такого поведения СУБД. В SQL Server поведение журнала транзакций напрямую зависит от выбранной модели восстановления базы данных:

  1. Модель FULL (Полная): все изменения записываются в журнал транзакций и хранятся там до тех пор, пока не будет выполнено резервное копирование самого лога (BACKUP LOG). Если бэкап лога не настроен или выполняется слишком редко, виртуальные файлы лога (VLF) не освобождаются, и файл продолжает непрерывно расти.
  2. Длительные транзакции в 1С: групповые обработки, массовое перепроведение документов, закрытие месяца или зависшие фоновые задания удерживают транзакцию открытой. Пока транзакция активна, SQL Server не может усечь журнал.
  3. Регламентные операции: полное перестроение индексов (REBUILD) при полной модели восстановления генерирует огромный объем транзакционных записей.
  4. Неправильные параметры авторасширения: если шаг авторасширения лога задан в процентах или слишком маленьким значением, файл дробится на десятки тысяч мелких виртуальных файлов (VLF), что резко снижает скорость резервного копирования и работы СУБД.

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

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


SELECT name, recovery_model_desc, log_reuse_wait_desc 
FROM sys.databases;

Обратите внимание на значение в столбце log_reuse_wait_desc:

  1. LOG_BACKUP — лог ожидает создания резервной копии журнала транзакций.
  2. ACTIVE_TRANSACTION — усечение заблокировано длительной или незавершенной транзакцией.
  3. NOTHING — журнал свободен и готов к повторному использованию внутреннего пространства.

Если отображается статус ACTIVE_TRANSACTION, проверим наличие открытых транзакций с помощью команды:

DBCC OPENTRAN;

Решение 1. Переход на простую модель восстановления (SIMPLE)

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

В модели SIMPLE журнал транзакций автоматически очищается сразу после фиксации каждой транзакции, и файл перестает неконтролируемо расти.

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


USE [master];
GO
ALTER DATABASE [ИмяБазыДанных] SET RECOVERY SIMPLE;
GO
USE [ИмяБазыДанных];
GO
DBCC SHRINKFILE (N'ИмяФайлаЛога_log', 2048);
GO

Здесь параметр 2048 указывает целевой размер файла в мегабайтах (2 ГБ). Важно: не сжимайте лог до нуля или минимальных значений, задайте ему достаточный рабочий объем.

Решение 2. Корректная настройка полной модели восстановления (FULL)

Если базе данных необходима возможность восстановления на любую секунду (что критично для высоконагруженных рабочих баз 1С), модель FULL обязательна. Однако оставлять ее без резервного копирования лога нельзя.

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

  1. Настройте регулярный бэкап журнала транзакций: создайте задание в SQL Server Agent, которое выполняет BACKUP LOG каждые 10–30 минут (для высокоинтенсивных систем — каждые 5–15 минут). Это освободит виртуальные файлы лога для повторной записи без физического увеличения файла.
  2. Включите сжатие бэкапов: использование параметра WITH COMPRESSION ускорит создание копий и существенно сэкономит место на диске.
  3. Установите фиксированный шаг авторасширения: укажите в свойствах файла лога фиксированный прирост (например, 512 МБ или 1024 МБ) вместо процентов.

Почему нельзя использовать сжатие по расписанию через переключение моделей

Часто встречается скрипт, выполняющий циклическое переключение FULL -> SIMPLE -> SHRINK -> FULL по расписанию:


USE [master];
GO
ALTER DATABASE [ИмяБазыДанных] SET RECOVERY SIMPLE;
GO
USE [ИмяБазыДанных];
GO
DBCC SHRINKFILE (N'ИмяФайлаЛога_log', 2);
GO
USE [master];
GO
ALTER DATABASE [ИмяБазыДанных] SET RECOVERY FULL;
GO

Обратите внимание на критические риски этого подхода:

  1. Разрыв цепочки LSN (Log Sequence Number): переключение в SIMPLE полностью разрушает цепочку журналов транзакций. Вы не сможете восстановить базу на момент времени до тех пор, пока после обратного включения FULL не сделаете новый полный бэкап базы данных (BACKUP DATABASE).
  2. Падение производительности (деградация диска): регулярный SHRINK приводит к тому, что база сначала сжимает файл, а затем в рабочее время тратит огромные ресурсы сервера на его экстренное расширение и выделение места на диске, вызывая зависания пользователей в 1С.

Оптимизация на уровне 1С и регламентных заданий

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

  1. Порционная обработка данных: при написании внешних обработок или массовой модификации данных разбивайте процесс на небольшие пачки (порции), фиксируя транзакцию вызовом ЗафиксироватьТранзакцию() и открывая новую. Избегайте обработки сотен тысяч строк в одной транзакции.
  2. Выборочное обслуживание индексов: откажитесь от тотального REBUILD всех таблиц подряд. Используйте реорганизацию (REORGANIZE) для индексов с фрагментацией от 10% до 30% (она практически не создает записей в журнале) и только при фрагментации выше 30% выполняйте перестроение (REBUILD).
  3. Контроль зависших сеансов: своевременно отслеживайте и завершайте «мертвые» соединения и зависшие фоновые задания через консоль администрирования кластера серверов 1С:Предприятия.
← На главную