Администрирование · 10 мин
Как почистить журнал транзакций 1С в SQL Server
Пошаговая инструкция по очистке и усечению журнала транзакций базы 1С в SQL Server: причины роста LDF, резервное копирование, shrink и профилактика.
Файл журнала транзакций (LDF) базы 1С на SQL Server иногда разрастается до десятков и сотен гигабайт, заполняет диск и останавливает работу пользователей. Причина почти всегда одна: база работает в полной модели восстановления (Full), а резервные копии журнала не делаются, поэтому SQL Server не может переиспользовать место внутри файла.
Почистить журнал транзакций можно двумя безопасными способами: штатным усечением через резервное копирование журнала с последующим сжатием файла либо переводом базы в простую модель восстановления с усечением. Оба варианта выполняются штатными средствами SQL Server и не требуют остановки сервера 1С надолго, но требуют понимания последствий для восстановления данных.
Ниже разобрано, почему журнал растёт, как проверить его состояние, какие команды выполнить и как настроить систему так, чтобы проблема не возвращалась. Отдельно описаны типичные ошибки, из-за которых администраторы теряют возможность восстановить базу на нужный момент времени.
Почему журнал транзакций базы 1С разрастается
Журнал транзакций фиксирует каждое изменение данных: проведение документов, запись справочников, обмены, регламентные задания. В базе 1С с активной работой пользователей объём изменений за день измеряется гигабайтами, и всё это проходит через LDF-файл.
В модели восстановления Full или Bulk-Logged SQL Server хранит записи журнала до тех пор, пока не будет создана резервная копия журнала. Усекаться (переиспользовать место внутри файла) журнал не может, поэтому файл только растёт. Типовой сценарий: базу развернули из бэкапа, модель осталась Full, а задание бэкапа журнала никто не настроил.
Ускоряют рост массовые операции: свёртка базы, групповое перепроведение, загрузка данных через обмен, обновление конфигурации на большой базе. Одна такая операция способна увеличить журнал на десятки гигабайт за час.
Проверьте recovery model в свойствах базы и наличие задания BACKUP LOG
Проверьте свободное место и долю свободного места внутри LDF через sys.dm_db_log_space_usage
Запросите sys.databases — это прямое указание сделать бэкап журнала
После усечения настройте регулярные бэкапы журнала, чтобы не повторилось
Что проверить перед очисткой
Перед любыми действиями убедитесь, что у вас есть актуальная полная резервная копия базы. Усечение журнала в модели Full разрывает цепочку бэкапов журнала, и без свежей полной копии восстановление на произвольный момент времени станет невозможным.
Проверьте три вещи: модель восстановления базы, причину, по которой журнал не усекается, и реальную заполненность файла. Для этого достаточно трёх запросов в SQL Server Management Studio.
SELECT name, recovery_model_desc, log_reuse_wait_desc FROM sys.databases WHERE name = 'MyBase1C';
SELECT DB_NAME(database_id) AS db, total_log_size_mb, used_log_space_mb, used_log_space_in_percent FROM sys.dm_db_log_space_usage;Если log_reuse_wait_desc показывает LOG_BACKUP — достаточно сделать бэкап журнала. Если ACTIVE_TRANSACTION или OLDEST_PAGE — есть долгая незавершённая транзакция или проблема с репликацией, и сначала нужно разобраться с ней, иначе усечение не сработает.
Способ 1: усечение через резервную копию журнала
Это правильный способ для баз в модели Full, где важна возможность восстановления на любой момент времени. Он состоит из трёх шагов: полный бэкап (если его давно не было), бэкап журнала, сжатие файла.
Резервная копия журнала освобождает место внутри LDF-файла, но не уменьшает сам файл на диске. Чтобы вернуть место операционной системе, после бэкапа выполняется сжатие через DBCC SHRINKFILE.
BACKUP DATABASE [MyBase1C] TO DISK = 'D:\Backup\MyBase1C_full.bak';
BACKUP LOG [MyBase1C] TO DISK = 'D:\Backup\MyBase1C_log.trn';
USE [MyBase1C];
DBCC SHRINKFILE (N'MyBase1C_log', 1024);Имя логического файла журнала (в примере MyBase1C_log) посмотрите запросом SELECT name FROM sys.database_files WHERE type_desc = 'LOG'. Целевой размер (в примере 1024 МБ) задайте с запасом под пиковые операции — слишком маленький файл будет постоянно autorow'иться и фрагментироваться.
- 1Убедитесь, что на диске с бэкапами достаточно места
- 2Сделайте полную резервную копию базы (BACKUP DATABASE)
- 3Сделайте резервную копию журнала (BACKUP LOG)
- 4Проверьте долю свободного места в журнале через sys.dm_db_log_space_usage
- 5Сожмите LDF-файл командой DBCC SHRINKFILE до разумного размера
- 6Настройте регулярное задание бэкапа журнала, чтобы проблема не вернулась
Способ 2: перевод базы в простую модель восстановления
Если восстановление на произвольный момент времени для базы не требуется (например, достаточно ежедневных полных бэкапов), проще перевести базу в модель Simple. В ней журнал усекается автоматически после каждой контрольной точки, и его рост ограничен объёмом текущих активных транзакций.
Последовательность такая: перевести базу в Simple, выполнить CHECKPOINT, сжать файл. Все действия занимают несколько минут и не требуют выгона пользователей, хотя на время сжатия возможна нагрузка на дисковую подсистему.
ALTER DATABASE [MyBase1C] SET RECOVERY SIMPLE;
USE [MyBase1C];
CHECKPOINT;
DBCC SHRINKFILE (N'MyBase1C_log', 1024);Многие организации сознательно держат файловые и клиент-серверные базы 1С в модели Simple: для типовых конфигураций с ежедневным бэкапом потеря данных максимум за сутки считается приемлемой, а обслуживание заметно упрощается. Решение должен принимать владелец данных, а не только администратор.
Сравнение вариантов
Восстановление на любой момент времени. Требует настроенных заданий BACKUP LOG и места под копии; без них журнал растёт бесконечно
Простое обслуживание, журнал усекается сам. Минус: восстановление только на момент последнего полного или разностного бэкапа
Решает проблему на день-два. Журнал вырастет снова — вариант годится только как аварийная мера
Как сжать файл и проверить результат
Сжатие выполняется командой DBCC SHRINKFILE с указанием логического имени файла и целевого размера в мегабайтах. Альтернатива — графический интерфейс: в SSMS правый клик по базе → Tasks → Shrink → Files → выбрать тип файла Log.
Учтите: сжать файл можно только до объёма фактически занятых данных плюс служебные структуры. Если журнал не был усечён (нет бэкапа журнала или есть активная транзакция), SHRINKFILE отработает без ошибки, но файл не уменьшится. Это самая частая причина «не работает shrink».
Как проверить результат
Файл уменьшился до заданного размера
Размер прежний — журнал не усечён, смотрите log_reuse_wait_desc
Низкий процент занятого места внутри журнала
Почти 100% — есть активная транзакция или не сделан бэкап журнала
NOTHING
LOG_BACKUP, ACTIVE_TRANSACTION, REPLICATION — сначала устраните причину
Размер стабилен при настроенных бэкапах журнала
Журнал снова растёт — задание бэкапа журнала не работает
Профилактика: как не допустить повторного роста
Разовая очистка не решает проблему, если не устранить причину. Для модели Full настройте регулярное задание резервного копирования журнала — через план обслуживания (Maintenance Plan) в SSMS или скриптом в SQL Server Agent. Интервал зависит от интенсивности работы: обычно от 15 минут до нескольких часов.
Дополнительные меры: задайте разумный начальный размер LDF-файла и прирост в мегабайтах (а не в процентах), следите за свободным местом на диске мониторингом, а массовые операции (свёртку, перепроведение) планируйте на нерабочее время и при возможности выполняйте порциями.
Частые вопросы
Можно ли почистить журнал транзакций без остановки работы пользователей 1С?
Да. BACKUP LOG, перевод в модель Simple, CHECKPOINT и DBCC SHRINKFILE выполняются «на горячую», без монопольного доступа. Сжатие создаёт нагрузку на диск, поэтому на слабом оборудовании его лучше делать в нерабочее время.
Чем отличается усечение журнала от сжатия файла?
Усечение (truncate) помечает место внутри LDF-файла как свободное для переиспользования, но размер файла на диске не меняет. Сжатие (shrink) возвращает свободное место операционной системе, уменьшая файл. Сначала всегда усечение, потом сжатие.
Почему SHRINKFILE выполняется, но файл не уменьшается?
Внутри файла нет свободного места: журнал не усечён. Проверьте log_reuse_wait_desc в sys.databases. Чаще всего не сделан бэкап журнала (LOG_BACKUP) или висит долгая активная транзакция (ACTIVE_TRANSACTION), которую нужно найти и завершить.
Какую модель восстановления выбрать для базы 1С?
Если требования по потере данных допускают восстановление на момент последнего полного бэкапа — подходит Simple, и обслуживание будет минимальным. Если нужно восстановление на произвольный момент времени — только Full с обязательным регулярным бэкапом журнала.
Опасно ли сжимать LDF-файл регулярно?
Регулярное сжатие — признак неправильной настройки, а не норма. При корректных бэкапах журнала файл держит стабильный размер и сжимать его не нужно. Постоянный shrink приводит к фрагментации файла и лишним операциям autorow.
Что делать, если диск заполнен на 100% и SQL Server встал?
Освободите место любым безопасным способом (перенесите старые бэкапы, временные файлы), затем выполните усечение и сжатие журнала по инструкции выше. Если места нет даже для бэкапа журнала, временно переведите базу в Simple, сделайте CHECKPOINT и сожмите файл, после чего верните Full и сразу сделайте полный бэкап.
Что важно запомнить
Журнал транзакций 1С растёт из-за модели Full без бэкапов журнала. Правильная очистка: BACKUP LOG (или перевод в Simple) → DBCC SHRINKFILE → настройка регулярных бэкапов журнала. Никогда не удаляйте LDF-файл вручную и всегда держите актуальную полную резервную копию.