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

· 10 мин

Содержание

Чтобы сжать лог-файл базы 1С на MS SQL, сначала освободите место внутри журнала транзакций: сделайте резервную копию журнала (BACKUP LOG) или переведите базу в простую модель восстановления. Затем выполните DBCC SHRINKFILE для файла журнала или команду SSMS Tasks → Shrink → Files с типом файла Log. Без первого шага сжатие ничего не даст: SQL Server не отрежет занятую часть журнала.

Типичная картина: база 1С весит 20 ГБ, а файл .ldf рядом с ней — 150 ГБ, и диск сервера заполнен до красной полосы. Уменьшить лог-файл можно за 10–15 минут, а правильная модель восстановления и приращение файла не дадут ему вырасти снова.

Почему лог-файл базы 1С на SQL Server растёт без остановки

Журнал транзакций (.ldf) хранит каждое изменение данных до тех пор, пока оно нужно серверу. Освобождённое место SQL Server использует повторно, но сам файл при этом не уменьшается. Если место внутри журнала не освобождается вовсе, файл растёт при каждой записи.

Главные причины:

  • 📦 Полная модель восстановления без резервных копий журнала. Модель FULL хранит записи до ближайшего BACKUP LOG. Нет копий журнала — нет и освобождения места. Это самая частая причина.
  • 🧬 Модель унаследована от системной базы model. Когда базу создаёт кластер 1С (флажок «Создать базу данных в случае её отсутствия»), она получает настройки model. На редакциях Standard и Enterprise там обычно стоит полная модель.
  • ⏳ Долгая открытая транзакция. Пока транзакция не завершена, журнал за ней не очищается, даже в простой модели.
  • 🔁 Массовые операции 1С. Обновление конфигурации с реструктуризацией, перепроведение за год, удаление помеченных объектов, загрузка .dt пишут в журнал гигабайты за один проход.
  • 🛠 Регламент обслуживания SQL. Перестроение индексов (REBUILD) в полной модели пишет в журнал объём, сравнимый с размером самих таблиц.

Как узнать точную причину

SQL Server сам говорит, что мешает освободить журнал. Выполните в SSMS:

SELECT name, recovery_model_desc, log_reuse_wait_desc
FROM sys.databases
WHERE name = N'buh_base';

DBCC SQLPERF(LOGSPACE);

Первый запрос показывает модель восстановления и причину ожидания. Второй — размер журнала каждой базы и процент его заполнения.

log_reuse_wait_descЧто значитЧто делать
NOTHINGЖурнал свободен внутриМожно сразу сжимать
LOG_BACKUPЖдёт резервной копии журналаBACKUP LOG или смена модели на SIMPLE
ACTIVE_TRANSACTIONВисит открытая транзакцияНайти её через DBCC OPENTRAN
ACTIVE_BACKUP_OR_RESTOREИдёт резервное копированиеДождаться окончания
REPLICATION, AVAILABILITY_REPLICAДержит репликация или группа доступностиРазбираться с репликой, а не со сжатием

Если журнал заполнен на 3–5%, а файл огромный — дело только в размере файла, и сжатие пройдёт сразу. Если заполнен на 95% — сначала устраняйте причину из таблицы.

Способ 1. Сжатие лог-файла 1С вручную в SQL Server Management Studio

Подходит, когда нужно разово уменьшить журнал и вы предпочитаете мышь, а не скрипты. Работает в полной и в простой модели.

Если база в полной модели и вам важна возможность восстановления на момент времени, сначала сделайте резервную копию журнала, а не переключайте модель. Иначе цепочка копий оборвётся.

  1. Подключитесь к серверу в SSMS, раскройте Databases и найдите базу 1С.
  2. Для полной модели: щёлкните базу правой кнопкой → Tasks → Back Up…, в поле Backup type выберите Transaction Log, укажите файл .trn на диске с запасом места и нажмите OK.
  3. Снова правой кнопкой по базе → Tasks → Shrink → Files.
  4. В поле File type выберите Log. Ниже окно покажет текущий размер файла и сколько в нём свободно.
  5. Выберите действие Reorganize pages before releasing unused space и укажите целевой размер в мегабайтах. Например, 2048 МБ для базы в 20–30 ГБ.
  6. Нажмите OK и проверьте размер .ldf на диске.

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

💡 Не сжимайте журнал «в ноль». При следующем закрытии месяца он всё равно вырастет, а каждое приращение файла тормозит запись. Оставьте рабочий объём.

Способ 2. Простая модель восстановления: лог 1С очищается сам

Для большинства баз 1С в небольших компаниях полная модель не нужна. Если вы делаете ежедневную полную копию базы и потеря изменений за день допустима, переведите базу в простую модель. Тогда SQL Server освобождает журнал после каждой контрольной точки.

Через SSMS

  1. Правой кнопкой по базе → Properties → страница Options.
  2. В поле Recovery model выберите Simple и нажмите OK.
  3. Выполните сжатие по способу 1, начиная с шага 3. Копия журнала уже не нужна.

Когда простая модель не подходит

СитуацияМодельПочему
Ежедневная полная копия, потеря дня допустимаSIMPLEЖурнал не растёт, обслуживать нечего
Нужно восстановление на конкретную минутуFULLНужна цепочка копий журнала
База в группе доступности Always OnFULLГруппы доступности требуют полной модели
Используется доставка журналов (log shipping)FULL или BULK_LOGGEDМеханизм построен на копиях журнала

Переключение FULL → SIMPLE обрывает цепочку резервных копий журнала. Если позже вернёте полную модель, сразу сделайте полную или разностную копию базы — без неё новые копии журнала не к чему применять.

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

Способ 3. Скрипт T-SQL для сжатия журнала транзакций

Скрипт удобен, когда баз много или сжатие нужно повторять. Сначала узнайте логическое имя файла журнала — оно не совпадает с именем файла на диске:

USE [buh_base];
SELECT name, type_desc, size * 8 / 1024 AS size_mb
FROM sys.database_files;

В строке с type_desc = LOG будет логическое имя, например buh_base_log.

Вариант для полной модели (цепочка копий сохраняется)

USE [buh_base];
BACKUP LOG [buh_base]
  TO DISK = N'E:\Backup\buh_base_log.trn';

DBCC SHRINKFILE (N'buh_base_log', 2048);  -- целевой размер в МБ

Вариант для простой модели

USE [buh_base];
ALTER DATABASE [buh_base] SET RECOVERY SIMPLE;
CHECKPOINT;
DBCC SHRINKFILE (N'buh_base_log', 2048);

После выполнения запустите DBCC SQLPERF(LOGSPACE) ещё раз и сверьте размер.

💡 Старый приём BACKUP LOG ... WITH TRUNCATE_ONLY из статей десятилетней давности не работает : начиная с SQL Server 2008 этой опции нет. Её роль выполняет переключение на простую модель.

Автоматизация через агент SQL Server

Если база остаётся в полной модели, автоматизируйте не сжатие, а резервное копирование журнала. Создайте в SQL Server Agent → Jobs задание с шагом BACKUP LOG и расписанием раз в 15–60 минут. Тогда журнал будет переиспользоваться и не потребует сжатия.

Регулярное задание с DBCC SHRINKFILE — плохая практика. Файл сжимается ночью, днём растёт обратно, и каждое приращение притормаживает работу пользователей 1С.

Ошибки при сжатии лога SQL и как их обойти

Сжатие почти не ломает базу, но часто «не срабатывает». Вот что обычно видно в окне сообщений SSMS и как это лечить.

Диагностика: выберите симптом

Завершение сеанса 1С на сервере прерывает его транзакцию, и SQL Server откатывает все изменения с её начала. Для долгой операции откат может занять столько же времени, сколько она шла. Делайте это вне рабочего дня или когда операция точно зависла.

Как предотвратить разрастание журнала транзакций

Разовое сжатие снимает симптом. Чтобы через месяц не повторять процедуру, настройте четыре вещи.

  1. Определитесь с моделью восстановления. Простая — если хватает ежедневных полных копий. Полная — только вместе с регулярным BACKUP LOG.
  2. Задайте приращение в мегабайтах, а не в процентах. В свойствах базы на странице Files для файла журнала поставьте рост, например, 512 МБ. Рост на 10% от 100 ГБ — это 10 ГБ за раз и заметная пауза в работе.
  3. Выставьте разумный начальный размер. Журнал должен вмещать самую тяжёлую операцию: закрытие месяца или обновление конфигурации. Посмотрите, до какого размера он дорастал, и задайте близкое значение сразу.
  4. Следите за местом на диске. Держите .ldf на отдельном томе от .mdf и настройте оповещение агента SQL Server на заполнение журнала.

Число виртуальных лог-файлов (VLF)

Каждое приращение файла журнала делится на внутренние блоки — VLF. Тысячи мелких приращений дают тысячи VLF, и после этого база дольше стартует и восстанавливается. Проверить количество можно запросом:

USE [buh_base];
SELECT COUNT(*) AS vlf_count
FROM sys.dm_db_log_info(DB_ID());

Функция есть в SQL Server 2016 SP2 и новее. Если VLF тысячи, сожмите журнал до минимума и сразу вручную увеличьте его до рабочего размера одним-двумя шагами в Properties → Files.

Что в 1С:Предприятии 8.3 раздувает лог SQL

Некоторые операции 1С пишут в журнал SQL Server особенно много. Если журнал вырос скачком, ищите их по времени в журнале регистрации 1С.

  • 🧱 Обновление конфигурации с реструктуризацией. Платформа переписывает изменённые таблицы целиком. На большой базе журнал прирастает на размер этих таблиц.
  • 📥 Загрузка информационной базы из .dt. Все данные пишутся заново. В полной модели журнал получается сравнимым с самой базой.
  • 🗂 Перепроведение и закрытие месяца за длинный период. Массовая перезапись движений регистров.
  • 🗑 Удаление помеченных объектов на большом объёме.
  • 🔧 Тестирование и исправление с реиндексацией таблиц.

💡 Перед загрузкой .dt или крупным обновлением на базе в полной модели удобно временно переключить её в простую. После операции верните полную модель и сразу сделайте полную копию базы.

Не путайте журнал SQL и журнал регистрации 1С

В 1С есть свой журнал — журнал регистрации. Он к файлу .ldf отношения не имеет. В клиент-серверном варианте он лежит в каталоге кластера, в папке 1Cv8Log внутри каталога информационной базы, и тоже может занимать десятки гигабайт.

Сократить его можно в конфигураторе: Администрирование → Настройка журнала регистрации, кнопка «Сократить». Там же выбирается уровень регистрации событий. Если на диске сервера 1С растёт папка srvinfo, а не файлы SQL, — дело в журнале регистрации, и DBCC SHRINKFILE не поможет.

Ещё один кандидат на рост — системная база tempdb. 1С активно пользуется временными таблицами, и её журнал тоже может увеличиться. Он очищается при перезапуске службы SQL Server, но это оборвёт все сеансы 1С на сервере — планируйте на нерабочее время.

Частые вопросы

Можно ли просто удалить файл .ldf, чтобы освободить место?
Нет. Без журнала база может не подключиться или подключиться с потерей незавершённых транзакций. Уменьшайте журнал только средствами SQL Server.
Нужно ли выгонять пользователей 1С перед сжатием журнала?
Не обязательно: DBCC SHRINKFILE и смена модели восстановления работают при подключённых пользователях. Но сжатие нагружает диск, поэтому большие файлы лучше сжимать вечером.
Почему после перехода на простую модель журнал всё равно большой?
Простая модель освобождает место внутри файла, но не уменьшает сам файл. После смены модели один раз выполните сжатие.
Можно ли сжимать заодно и файл данных .mdf?
Технически да, но регулярно этого делать не стоит. Сжатие файла данных сильно фрагментирует индексы, и запросы 1С начинают работать медленнее.
Какой размер журнала считать нормальным?
Жёсткой нормы нет. Ориентир — объём, который журнал набирает за самую тяжёлую операцию между двумя копиями журнала. Для баз 1С в десятки гигабайт это обычно единицы гигабайт.