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

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

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

В этой статье мы подробно разберем, почему раздувается лог транзакций, как устроена работа СУБД с журналом в различных моделях восстановления, как правильно настроить автоматическое резервное копирование и как безопасно уменьшить размер переполненного файла без ущерба для производительности системы 1С.

Выясняем причину: почему растет журнал транзакций

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

Журнал выполняет две важнейшие функции: обеспечивает целостность данных (транзакционность ACID) и позволяет восстановить базу на определенный момент времени в случае сбоя оборудования или логической ошибки пользователя. Однако скорость заполнения и логика очистки этого файла напрямую зависят от выбранной модели восстановления (Recovery Model) базы данных. Рассмотрим две основные модели, применяемые в связке с 1С.

Сравниваем модели восстановления: Full против Simple

Выбор модели восстановления определяет, насколько защищены ваши данные от потерь и как часто вам придется обслуживать файлы СУБД.

1. Простая модель восстановления (Simple Recovery Model)

В этой модели транзакции записываются в журнал только на время их активного выполнения. Как только транзакция завершается (фиксируется в базе данных), занимаемое ею место в файле .ldf помечается как свободное и может быть повторно использовано новыми транзакциями. Лог транзакций в простой модели не растет бесконечно, он циклически перезаписывается.

2. Полная модель восстановления (Full Recovery Model)

В полной модели все транзакции сохраняются в журнале и никогда не удаляются автоматически. SQL Server хранит всю историю изменений до тех пор, пока вы принудительно не сделаете специальный бэкап журнала транзакций (Transaction Log Backup). Только после успешного создания бэкапа лога СУБД очищает («усекает») виртуальное пространство внутри файла .ldf, делая его доступным для новых записей.

Проанализируем ситуацию: если в базе данных 1С ежедневно работают хотя бы 5–10 активных пользователей, использование простой модели (Simple) несет в себе огромные риски. Потеря целого рабочего дня из-за сбоя жесткого диска или ошибки СУБД может обернуться серьезными финансовыми и временными затратами на ручное восстановление учета. Поэтому для рабочих (продуктивных) баз данных настоятельно рекомендуется использовать исключительно полную модель восстановления (Full) с грамотно настроенным расписанием резервного копирования.

Организуем правильную схему резервного копирования

Основная ошибка начинающих администраторов 1С заключается в том, что они настраивают ежедневный полный бэкап базы данных, но полностью игнорируют бэкап логов транзакций, оставляя базу в полной модели восстановления. В этом случае лог никогда не очищается. Чтобы разорвать этот замкнутый круг, необходимо внедрить следующую проверенную схему: Для автоматизации этого процесса можно использовать готовые скрипты для резервного копирования и сжатия баз данных MS SQL.

  1. Полный бэкап (Full Backup): Выполняем один раз в сутки в нерабочее время (например, в 01:00 ночи). Этот файл содержит снимок всей базы данных на конкретный момент времени и является самодостаточным.
  2. Резервное копирование журнала транзакций (Transaction Log Backup): Настраиваем с высокой периодичностью в течение рабочего дня. Оптимальный интервал — каждый час или даже каждые 15–30 минут (для сильно нагруженных баз 1С).

Рассмотрим подробнее, почему частый бэкап логов — это выгодно:

Пошаговая инструкция: как безопасно сжать раздувшийся лог (Шринк)

Если лог транзакций уже разросся до критических размеров (например, 40 ГБ при базе 5 ГБ), настройка ежечасных бэкапов сама по себе не уменьшит физический размер файла .ldf на диске. Она лишь остановит его дальнейший рост. Чтобы вернуть неиспользуемое свободное место операционной системе, необходимо выполнить процедуру сжатия (Shrink).

Разберем по шагам самый простой и безопасный алгоритм сжатия лога, который можно выполнить в среде SQL Server Management Studio (SSMS):

  1. Выгоняем всех пользователей из базы данных 1С и останавливаем службу сервера приложений 1С:Предприятие, чтобы исключить появление новых блокировок и транзакций.
  2. Открываем SSMS, находим нужную базу данных, кликаем правой кнопкой мыши и выбираем Свойства (Properties) -> Параметры (Options). В поле "Модель восстановления" (Recovery model) временно переключаем базу в режим Простая (Simple). Нажимаем "ОК". При этом действии SQL Server автоматически помечает все закрытые транзакции в логе как удаленные.
  3. Кликаем правой кнопкой мыши по базе данных, выбираем Задачи (Tasks) -> Сжать (Shrink) -> Файлы (Files).
  4. В открывшемся окне в поле "Тип файла" (File type) выбираем Журнал (Log). В поле "Операция сжатия" выбираем "Освободить неиспользуемое место" или указываем целевой желаемый размер (например, 2000 МБ). Нажимаем "ОК". Файл физически уменьшится на диске до указанного размера.
  5. Снова заходим в Свойства (Properties) базы данных -> Параметры (Options) и возвращаем модель восстановления в режим Полная (Full).
  6. Критически важно: Сразу после возврата в полную модель восстановления необходимо вручную запустить полный бэкап базы данных. Переключение моделей разрывает цепочку бэкапов логов, и СУБД не позволит вам делать новые бэкапы транзакций, пока вы не создадите свежую отправную точку в виде полного бэкапа.

Важное предостережение: Никогда не делайте регулярный автоматический шринк файлов данных базы (файлов .mdf) с помощью планов обслуживания или регламентных заданий! Процедура DBCC SHRINKDATABASE или DBCC SHRINKFILE для файлов данных хаотично перемещает страницы в начало файла, полностью разрушая индексы таблиц. Это приводит к мгновенной 100%-ной фрагментации индексов, из-за чего производительность 1С упадет в несколько раз. Шринк лога транзакций (файла .ldf) делать можно, так как он не содержит индексов, но шринк файлов данных — это крайняя мера, которую стоит избегать.

Борьба с фрагментацией виртуального лога (VLF)

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

Большое количество VLF (более 1000) приводит к серьезным техническим проблемам:

Выясним, как правильно решить эту проблему раз и навсегда:

  1. Выполняем процедуру сжатия лога (по инструкции выше) до минимального размера — около 50–100 МБ.
  2. Вручную увеличиваем файл лога до расчетного фиксированного размера, который необходим вашей базе для комфортной работы в течение недели (например, до 4–8 ГБ). Делаем это за один шаг в свойствах файлов базы данных. При выделении большого объема за один раз SQL Server создаст оптимальное количество VLF крупного размера (около 16–32 штук).
  3. Настраиваем авторасширение (Autogrowth) файла лога. Запрещаем рост в процентах! Устанавливаем фиксированное значение расширения, например, по 512 МБ или 1024 МБ. Это предотвратит дробление лога на мелкие кусочки при его возможном вынужденном росте в будущем.

Особенности автоматизации обслуживания на MS SQL Server Express

Если вы используете бесплатную редакцию MS SQL Server Express (например, 2008 R2 Express), то наверняка столкнулись с проблемой отсутствия встроенного планировщика задач (SQL Server Agent) и мастеров создания планов обслуживания (Maintenance Plans). Автоматизировать бэкапы силами самой СУБД в этой редакции невозможно, но решение есть.

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

  1. Скрипты обслуживания Олы Халленгрена (Ola Hallengren's SQL Server Maintenance Solution): Это бесплатный отраслевой стандарт. Скачайте официальный скрипт обслуживания, который создает набор универсальных хранимых процедур в базе данных master. Эти процедуры умеют делать резервное копирование (включая бэкапы логов с автоматической очисткой устаревших архивов), проверять целостность баз данных и выполнять оптимизацию индексов.
  2. Планировщик задач Windows (Task Scheduler) + утилита SQLCMD: Поскольку агента SQL нет, запускать процедуры обслуживания мы будем из стандартного планировщика Windows. Создается текстовый файл сценария с расширением .bat или .cmd, внутри которого прописывается вызов консольной утилиты sqlcmd с параметрами подключения и запуска нужной процедуры.

Проанализируем пример готовой команды для резервного копирования журналов транзакций всех пользовательских баз данных с помощью скрипта Олы Халленгрена:


sqlcmd -E -S localhost\SQLEXPRESS -Q "EXECUTE [master].[dbo].[DatabaseBackup] @Databases = 'USER_DATABASES', @Directory = 'D:\Backup', @BackupType = 'LOG', @CleanupTime = 168"

В данном примере параметр @BackupType = 'LOG' указывает на бэкап журналов транзакций, а параметр @CleanupTime = 168 автоматически удаляет файлы резервных копий логов, созданные более 168 часов (7 дней) назад, предотвращая переполнение диска бэкапами.

Этот батник добавляется в Планировщик задач Windows с триггером запуска "Каждый час ежедневно". Аналогично настраивается запуск ночного полного бэкапа базы данных (параметр @BackupType = 'FULL').

Учитываем ограничения SQL Express для баз 1С

Поскольку мы рассматриваем администрирование баз данных на редакции Express, необходимо помнить о жестких рамках и лимитах, которые накладывает корпорация Microsoft на бесплатные версии:

Взаимосвязь реиндексации 1С и роста журнала транзакций

В процессе обсуждения обслуживания СУБД часто поднимается вопрос о регулярной переиндексации (Rebuild) и обновлении статистик. Это важнейшие операции, без которых базы данных 1С начинают работать крайне медленно. Однако здесь кроется еще одна причина внезапного взрывного роста журнала транзакций.

Любая операция перестройки индексов (ALTER INDEX REBUILD) является полностью протоколируемой в полной модели восстановления. Когда SQL Server перестраивает индекс таблицы размером 5 ГБ, он записывает все эти изменения в журнал транзакций. В итоге лог транзакций мгновенно увеличивается на те самые 5 ГБ. Для снижения нагрузки на лог подойдёт скрипт адаптивного обновления индексов MS SQL.

Выясним, как правильно совместить эти процессы:

  1. Запускайте регламентные процедуры обслуживания индексов только в период минимальной активности пользователей (ночью).
  2. Сразу после завершения процесса реиндексации СУБД обязательно настройте автоматический запуск полного резервного копирования базы данных или бэкапа журнала транзакций. Это позволит своевременно очистить виртуальное пространство внутри файла .ldf, которое заняла процедура реиндексации, и не даст файлу раздуться еще сильнее при последующей работе пользователей.
  3. Используйте умные скрипты обслуживания (например, ту же систему Ola Hallengren). Они умеют анализировать уровень фрагментации индексов и выполнять легкую реорганизацию (ALTER INDEX REORGANIZE) вместо тяжелой перестройки (Rebuild), если фрагментация составляет менее 30%. Реорганизация индексов создает значительно меньшую нагрузку на журнал транзакций.

Подводим итоги: золотые правила администрирования логов

Мы подробно разобрали основные аспекты работы с журналом транзакций в MS SQL Server при интеграции с решениями 1С:Предприятие. Сформулируем финальные практические рекомендации для создания надежной и быстрой системы:

← На главную