Администрирование · 12 мин
1С и SQL Server: как сжать лог файл транзакций
Как сжать лог файл базы 1С на SQL Server: перевод в простую модель восстановления, DBCC SHRINKFILE, настройка автосжатия и профилактика роста журнала транзакций.
Журнал транзакций (файл .ldf) базы 1С на SQL Server нередко разрастается до десятков и сотен гигабайт, переполняя диск и останавливая работу пользователей. Происходит это потому, что SQL Server по умолчанию работает в полной модели восстановления (Full), при которой каждая операция записывается в лог и хранится там до тех пор, пока не будет сделана резервная копия журнала. Если бэкапы лога не настроены — а в типовых внедрениях 1С их почти никогда не настраивают — файл растёт бесконечно.
Сжать лог можно штатными средствами SQL Server Management Studio или запросом T-SQL, и в большинстве случаев это занимает несколько минут. Однако механическое сжатие без изменения настроек приведёт к тому, что через неделю–месяц проблема вернётся. Поэтому правильный подход состоит из трёх шагов: освободить место, выбрать подходящую модель восстановления и настроить регулярное обслуживание.
Ниже разобраны оба способа сжатия — через графический интерфейс и через скрипт, — а также условия, при которых сжатие не сработает, и меры профилактики повторного роста файла.
Почему лог-файл базы 1С растёт и когда это опасно
SQL Server ведёт журнал транзакций, чтобы гарантировать целостность данных и возможность отката. В модели восстановления Full каждая транзакция остаётся в логе, пока не будет создана резервная копия журнала. Поскольку 1С активно пишет в базу — проведение документов, обмены, регламентные задания, — за день интенсивной работы лог может прибавить десятки гигабайт.
Типичные триггеры резкого роста: массовая загрузка данных (начальное заполнение, обмен с другой базой, перенос остатков), перепроведение документов за длительный период, обновление конфигурации с реструктуризацией таблиц, а также реиндексация больших таблиц. Одна такая операция способна увеличить лог в разы за считанные часы.
Опасность не только в заполнении диска. Когда место заканчивается, транзакции 1С начинают завершаться с ошибками, пользователи не могут провести документы, а база может перейти в состояние, требующее восстановления. Поэтому контроль размера лога — обязательная часть администрирования связки 1С + SQL Server.
Проверить recovery model в свойствах базы
Уточнить, какие регламентные задачи выполнялись
Срочно освободить место и сжать лог
Выполнить CHECKPOINT и повторить сжатие
Подготовка: что проверить перед сжатием
Перед любыми действиями сделайте полную резервную копию базы средствами SQL Server или через выгрузку .dt из конфигуратора 1С. Сама операция сжатия безопасна для данных, но смена модели восстановления разрывает цепочку журналов, и без свежего бэкапа откатиться на произвольный момент времени будет невозможно.
Убедитесь, что у вас есть права: нужна роль sysadmin или db_owner на уровне базы, а также доступ к SQL Server Management Studio (SSMS) или возможность выполнять запросы через sqlcmd. Проверьте текущую модель восстановления: откройте свойства базы, вкладка «Параметры» (Options), поле «Модель восстановления».
Также зафиксируйте текущие размеры файлов, чтобы потом оценить результат. Это можно сделать запросом к системному представлению sys.database_files — он покажет размер файла данных и лога в мегабайтах.
Способ 1: сжатие лога через SQL Server Management Studio
Графический способ подходит, когда операция разовая и выполняет её администратор без глубокого знания T-SQL. Последовательность такая:
- 1Откройте свойства базы, вкладка Options, установите Recovery model = Simple, нажмите OK
- 2Кликните правой кнопкой по базе: Tasks → Shrink → Files
- 3В поле File type выберите Log, оставьте действие по умолчанию (Release unused space), нажмите OK
- 4Дождитесь завершения операции и проверьте размер файла на диске
- 5Если требуется Full-модель — верните её и сразу сделайте полный бэкап базы
Перевод в Simple перед сжатием важен: в этой модели SQL Server автоматически отсекает неактивную часть журнала при контрольных точках, и физическое сжатие файла проходит быстро и полностью. Если пытаться сжать лог в Full-модели без предварительного бэкапа журнала, операция часто завершается с нулевым результатом — файл остаётся прежнего размера.
После сжатия проверьте фактический размер .ldf-файла в каталоге данных SQL Server. Нормальный результат — уменьшение с десятков гигабайт до нескольких сотен мегабайт или единиц гигабайт в зависимости от текущей активности базы.
Способ 2: сжатие лога скриптом T-SQL
Скрипт удобнее для автоматизации и для случаев, когда баз много. Логическое имя лог-файла можно узнать запросом к sys.database_files (обычно это имя вида «ИмяБазы_log», но лучше проверить).
USE [ИмяБазы1С];
GO
ALTER DATABASE [ИмяБазы1С] SET RECOVERY SIMPLE;
GO
CHECKPOINT;
GO
DBCC SHRINKFILE (N'ИмяБазы1С_log', 1024);
GO
-- при необходимости вернуть полную модель:
-- ALTER DATABASE [ИмяБазы1С] SET RECOVERY FULL;
GOПараметр 1024 в команде DBCC SHRINKFILE — целевой размер файла в мегабайтах. SQL Server сожмёт файл до этого значения, если позволяет расположение активных виртуальных логов. Указывать размер меньше реального минимума бессмысленно — операция завершится без ошибок, но файл останется больше.
Для нескольких баз скрипт оборачивают в цикл по списку баз или выполняют через msdb.dbo.sp_MSforeachdb с фильтром по имени. В продуктивной среде лучше запускать сжатие в нерабочее время: операция может кратковременно повышать нагрузку на дисковую подсистему.
Почему сжатие может не сработать
Самая частая причина — активный виртуальный лог-файл (VLF) находится в конце физического файла. SQL Server может освободить только неактивное пространство до последнего активного VLF. Помогает последовательность: CHECKPOINT (в Simple-модели), затем повторный SHRINKFILE, иногда два-три раза подряд.
Вторая причина — долгая незавершённая транзакция. Открытая транзакция удерживает журнал от точки своего начала, и сжать пространство до неё невозможно. Найти её можно запросом к sys.dm_tran_database_transactions или через Activity Monitor. Решение — дождаться завершения или, с пониманием рисков, завершить зависший сеанс.
Третья причина — репликация, Always On или log shipping: эти механизмы удерживают записи журнала до их доставки на вторичные узлы. Если в базе 1С они не используются, но когда-то включались, проверьте значение log_reuse_wait_desc в sys.databases — там будет указано, что именно блокирует очистку лога.
Выбор модели восстановления для базы 1С
Для большинства баз 1С, где допустима потеря данных за период между последним бэкапом и сбоем (обычно сутки, если бэкап делается ночью), оптимальна простая модель восстановления (Simple). Она сама поддерживает журнал в разумных пределах и не требует обслуживания лога.
Полная модель (Full) оправдана, когда критично восстановление на произвольный момент времени: например, в базе с непрерывным вводом первичных документов, где потеря даже часа работы недопустима. Но тогда обязательно нужен регулярный бэкап журнала транзакций — например, каждые 15–60 минут, — иначе лог снова разрастётся.
Сравнение моделей восстановления
Подходит большинству баз 1С: лог сам очищается, обслуживание минимально. Ограничение — восстановление только на момент последнего бэкапа
Для критичных баз с восстановлением на любой момент времени. Требует регулярных бэкапов журнала, иначе лог растёт бесконтрольно
Промежуточный вариант для массовых загрузок: меньше записей в лог при bulk-операциях, но нет восстановления на момент времени внутри таких операций
Профилактика: как не допустить повторного роста лога
Настройте план обслуживания: для Simple-модели достаточно ежедневного полного бэкапа и периодической реиндексации; для Full добавьте бэкап журнала с интервалом 15–60 минут. Бэкап журнала — единственный штатный механизм, который регулярно освобождает место в логе при Full-модели.
Задайте разумные параметры автоприроста файла: фиксированный прирост в мегабайтах (например, 256–1024 МБ) вместо прироста в процентах. Процентный прирост на большом файле приводит к огромным разовым расширениям и паузам в работе 1С.
Контролируйте массовые операции: обмены, перепроведение за длительный период и обновления конфигурации планируйте на нерабочее время и при необходимости временно переводите базу в Simple на время операции. Настройте мониторинг свободного места на диске с данными SQL Server — сигнал о заполнении на 80% даёт время среагировать до остановки работы.
Проверка результата после сжатия
После операции убедитесь, что файл физически уменьшился: откройте каталог данных и сравните размер .ldf с исходным. Затем проверьте состояние базы запросом к sys.databases — поле state_desc должно быть ONLINE, а log_reuse_wait_desc — в значении NOTHING или CHECKPOINT.
Функциональная проверка: войдите в 1С, проведите тестовый документ, выполните типовой отчёт. Если бэкапы настроены, убедитесь, что после возврата Full-модели сделан полный бэкап — без него последующие бэкапы журнала не имеют смысла.
Как проверить результат
Уменьшился до сотен МБ — единиц ГБ
Остался прежним — ищите активный VLF или открытую транзакцию
state_desc = ONLINE
Suspect или Recovery Pending — требуется восстановление
NOTHING или CHECKPOINT
ACTIVE_TRANSACTION, REPLICATION, LOG_BACKUP — есть блокировка очистки
Документы проводятся, отчёты строятся
Ошибки записи — проверяйте место на диске и целостность базы
Что важно запомнить
Сжатие лога 1С делается в три шага: Simple-модель, DBCC SHRINKFILE, возврат настроек. Работайте только средствами SQL Server, никогда не трогайте .ldf в файловой системе. Без правильной модели восстановления и регулярных бэкапов журнала проблема гарантированно вернётся.
Частые вопросы
Можно ли сжать лог 1С без остановки работы пользователей?
Да, сжатие и смена модели восстановления не требуют монопольного доступа и выполняются «на живую». Однако операция повышает нагрузку на диск, поэтому на слабом оборудовании её лучше проводить в нерабочее время. Активные транзакции пользователей могут ограничить степень сжатия.
Безопасно ли удалить файл .ldf, если база уже не нужна?
Если база не нужна вообще — удалите её целиком через SSMS (правой кнопкой → Delete), файлы удалятся автоматически. Удалять .ldf отдельно в обход SQL Server нельзя даже для ненужной базы: при подключённой базе это невозможно, а при отключённой приведёт к проблемам при повторном присоединении.
Лог сжался, но через неделю снова вырос. Что делать?
Значит, база работает в Full-модели без регулярных бэкапов журнала. Выберите один из путей: переведите базу в Simple (если достаточно ночного бэкапа) или настройте бэкап журнала транзакций каждые 15–60 минут. Разовое сжатие причину роста не устраняет.
Чем отличается сжатие лога от сжатия файла данных (.mdf)?
Лог содержит временные записи транзакций, и его сжатие почти всегда безопасно и оправдано. Файл данных хранит сами таблицы и индексы 1С; его сжатие освобождает только незанятое место, сильно фрагментирует индексы и замедляет работу — выполнять его стоит только после массового удаления данных, с последующей реиндексацией.
Как узнать, что именно мешает очистке журнала?
Выполните запрос SELECT name, log_reuse_wait_desc FROM sys.databases WHERE name = 'ИмяБазы'. Значение ACTIVE_TRANSACTION указывает на открытую транзакцию, LOG_BACKUP — на необходимость бэкапа журнала, REPLICATION или AVAILABILITY_REPLICA — на механизмы репликации, удерживающие записи.
Нужно ли сжимать лог на файловой версии 1С?
Нет. Файловый вариант 1С (файл 1Cv8.1CD) не использует SQL Server и журнал транзакций в описанном смысле. Тема сжатия лога актуальна только для клиент-серверного варианта работы 1С с СУБД Microsoft SQL Server.