Журнал транзакций базы 1С на SQL Server вырос: уменьшаем и держим под контролем
Содержание
Чтобы сжать лог-файл базы 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
Подходит, когда нужно разово уменьшить журнал и вы предпочитаете мышь, а не скрипты. Работает в полной и в простой модели.
Если база в полной модели и вам важна возможность восстановления на момент времени, сначала сделайте резервную копию журнала, а не переключайте модель. Иначе цепочка копий оборвётся.
- Подключитесь к серверу в SSMS, раскройте
Databasesи найдите базу 1С. - Для полной модели: щёлкните базу правой кнопкой →
Tasks → Back Up…, в полеBackup typeвыберитеTransaction Log, укажите файл.trnна диске с запасом места и нажмитеOK. - Снова правой кнопкой по базе →
Tasks → Shrink → Files. - В поле
File typeвыберитеLog. Ниже окно покажет текущий размер файла и сколько в нём свободно. - Выберите действие
Reorganize pages before releasing unused spaceи укажите целевой размер в мегабайтах. Например, 2048 МБ для базы в 20–30 ГБ. - Нажмите
OKи проверьте размер.ldfна диске.
Если файл уменьшился не до заданного размера, а лишь частично, конец журнала ещё занят. Сделайте ещё одну копию журнала и повторите сжатие: активная часть сдвигается в начало файла не сразу.
💡 Не сжимайте журнал «в ноль». При следующем закрытии месяца он всё равно вырастет, а каждое приращение файла тормозит запись. Оставьте рабочий объём.
Способ 2. Простая модель восстановления: лог 1С очищается сам
Для большинства баз 1С в небольших компаниях полная модель не нужна. Если вы делаете ежедневную полную копию базы и потеря изменений за день допустима, переведите базу в простую модель. Тогда SQL Server освобождает журнал после каждой контрольной точки.
Через SSMS
- Правой кнопкой по базе →
Properties→ страницаOptions. - В поле
Recovery modelвыберитеSimpleи нажмитеOK. - Выполните сжатие по способу 1, начиная с шага 3. Копия журнала уже не нужна.
Когда простая модель не подходит
| Ситуация | Модель | Почему |
|---|---|---|
| Ежедневная полная копия, потеря дня допустима | SIMPLE | Журнал не растёт, обслуживать нечего |
| Нужно восстановление на конкретную минуту | FULL | Нужна цепочка копий журнала |
| База в группе доступности Always On | FULL | Группы доступности требуют полной модели |
| Используется доставка журналов (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 откатывает все изменения с её начала. Для долгой операции откат может занять столько же времени, сколько она шла. Делайте это вне рабочего дня или когда операция точно зависла.
Как предотвратить разрастание журнала транзакций
Разовое сжатие снимает симптом. Чтобы через месяц не повторять процедуру, настройте четыре вещи.
- Определитесь с моделью восстановления. Простая — если хватает ежедневных полных копий. Полная — только вместе с регулярным
BACKUP LOG. - Задайте приращение в мегабайтах, а не в процентах. В свойствах базы на странице
Filesдля файла журнала поставьте рост, например, 512 МБ. Рост на 10% от 100 ГБ — это 10 ГБ за раз и заметная пауза в работе. - Выставьте разумный начальный размер. Журнал должен вмещать самую тяжёлую операцию: закрытие месяца или обновление конфигурации. Посмотрите, до какого размера он дорастал, и задайте близкое значение сразу.
- Следите за местом на диске. Держите
.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С на сервере — планируйте на нерабочее время.