Одной из частых проблем при администрировании баз данных 1С:Предприятия на платформе Microsoft SQL Server является неконтролируемый рост файла журнала транзакций (с расширением .ldf). Нередко лог разрастается до сотен гигабайт, переполняя дисковое пространство и замедляя обслуживание СУБД. Разберем по шагам, почему это происходит, как корректно уменьшить файл журнала и как настроить сервер, чтобы проблема больше не повторялась.
Для понимания сути проблемы выясним причину такого поведения СУБД. В SQL Server поведение журнала транзакций напрямую зависит от выбранной модели восстановления базы данных:
BACKUP LOG). Если бэкап лога не настроен или выполняется слишком редко, виртуальные файлы лога (VLF) не освобождаются, и файл продолжает непрерывно расти.REBUILD) при полной модели восстановления генерирует огромный объем транзакционных записей.Прежде чем выполнять какие-либо действия, проанализируем текущее состояние базы данных и выясним, что именно блокирует усечение журнала. Для этого выполним следующий SQL-запрос:
SELECT name, recovery_model_desc, log_reuse_wait_desc
FROM sys.databases;
Обратите внимание на значение в столбце log_reuse_wait_desc:
LOG_BACKUP — лог ожидает создания резервной копии журнала транзакций.ACTIVE_TRANSACTION — усечение заблокировано длительной или незавершенной транзакцией.NOTHING — журнал свободен и готов к повторному использованию внутреннего пространства.Если отображается статус ACTIVE_TRANSACTION, проверим наличие открытых транзакций с помощью команды:
DBCC OPENTRAN;
Если для вашей информационной базы не требуется возможность восстановления на произвольный момент времени (Point-in-Time Recovery), а достаточно восстанавливаться из ежедневных полных бэкапов, наиболее простым и надежным решением будет переключение базы в простую модель восстановления.
В модели SIMPLE журнал транзакций автоматически очищается сразу после фиксации каждой транзакции, и файл перестает неконтролируемо расти.
Рассмотрим порядок разового перевода базы в простую модель и сжатия существующего раздутого файла лога:
USE [master];
GO
ALTER DATABASE [ИмяБазыДанных] SET RECOVERY SIMPLE;
GO
USE [ИмяБазыДанных];
GO
DBCC SHRINKFILE (N'ИмяФайлаЛога_log', 2048);
GO
Здесь параметр 2048 указывает целевой размер файла в мегабайтах (2 ГБ). Важно: не сжимайте лог до нуля или минимальных значений, задайте ему достаточный рабочий объем.
Если базе данных необходима возможность восстановления на любую секунду (что критично для высоконагруженных рабочих баз 1С), модель FULL обязательна. Однако оставлять ее без резервного копирования лога нельзя.
Разберем правильный регламент обслуживания:
BACKUP LOG каждые 10–30 минут (для высокоинтенсивных систем — каждые 5–15 минут). Это освободит виртуальные файлы лога для повторной записи без физического увеличения файла.WITH COMPRESSION ускорит создание копий и существенно сэкономит место на диске.Часто встречается скрипт, выполняющий циклическое переключение FULL -> SIMPLE -> SHRINK -> FULL по расписанию:
USE [master];
GO
ALTER DATABASE [ИмяБазыДанных] SET RECOVERY SIMPLE;
GO
USE [ИмяБазыДанных];
GO
DBCC SHRINKFILE (N'ИмяФайлаЛога_log', 2);
GO
USE [master];
GO
ALTER DATABASE [ИмяБазыДанных] SET RECOVERY FULL;
GO
Обратите внимание на критические риски этого подхода:
SIMPLE полностью разрушает цепочку журналов транзакций. Вы не сможете восстановить базу на момент времени до тех пор, пока после обратного включения FULL не сделаете новый полный бэкап базы данных (BACKUP DATABASE).SHRINK приводит к тому, что база сначала сжимает файл, а затем в рабочее время тратит огромные ресурсы сервера на его экстренное расширение и выделение места на диске, вызывая зависания пользователей в 1С.Чтобы снизить нагрузку на журнал транзакций со стороны конфигурации 1С, придерживайтесь следующих правил:
ЗафиксироватьТранзакцию() и открывая новую. Избегайте обработки сотен тысяч строк в одной транзакции.REBUILD всех таблиц подряд. Используйте реорганизацию (REORGANIZE) для индексов с фрагментацией от 10% до 30% (она практически не создает записей в журнале) и только при фрагментации выше 30% выполняйте перестроение (REBUILD).