Почему заклинивает журнал регистрации .lgd при очистке и как исправить эту ошибку?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При программном удалении старых записей из журнала регистрации формата SQLite (.lgd) с помощью метода ClearEventLog() администраторы и разработчики часто сталкиваются с ситуацией, когда журнал полностью перестает фиксировать новые события. В этой статье мы подробно проанализируем причины блокировки файла журнала регистрации, рассмотрим происходящие технические процессы и разберем практические варианты решения данной проблемы.

Анализ проблемы: сбои при удалении записей журнала в формате SQLite

Рассмотрим стандартный сценарий выполнения программной очистки журнала регистрации через COM-соединение:


V8ComConnector = Новый COMObject("V83.COMConnector.1");
Ист = V8ComConnector.Connect(СтрокаСоединения);

ФильтрКОМ = Ист.NewObject("Структура");
ФильтрКОМ.StartDate = ПериодНачало;
ФильтрКОМ.EndDate = ПериодКонец;

Ист.ClearEventLog(ФильтрКОМ);

Когда вызов метода ClearEventLog() выполняется в момент активной работы пользователей или фоновых заданий, СУБД журнала регистрации возвращает ошибки блокировки файла:

sqlite3_exec failed: database table is locked

или

sqlite3_exec failed: SQL logic error or missing database

После возникновения такой ошибки рабочий процесс 1С (rphost) теряет доступ к файлу журнала. В результате запись новых событий прекращается до перезапуска рабочего процесса или всей службы кластера 1С:Предприятия.

Выясним причину блокировок на техническом уровне

Проанализируем детально, почему происходит сбой журнала формата .lgd:

  1. Монопольная блокировка файла SQLite: Файл 1Cv8.lgd представляет собой единую базу данных SQLite. Операция массового удаления записей за длительный период создает продолжительную монопольную транзакцию записи. В это же время сеансы пользователей пытаются зафиксировать новые события, сталкиваясь с заблокированным файлом.
  2. Сброс подключения рабочим процессом 1С: При постоянном получении таймаута блокировки рабочий процесс 1С сбрасывает дескриптор подключения к файлу 1Cv8.lgd или помечает его как недоступный. После этого внутренний механизм логирования платформы прекращает дальнейшие попытки записи.
  3. Особенности физического размера файла: Очистка записей с помощью ClearEventLog() не уменьшает размер файла 1Cv8.lgd на диске. Освободившиеся страницы сохраняются во внутреннем списке базы данных и используются повторно. Полное сжатие файла требует выполнения команды VACUUM, которая возможна только при монопольном доступе к файлу без активных сеансов.

Способы решения и предотвращения проблемы

Разберем проверенные варианты организации очистки и архивации журнала регистрации.

Вариант 1. Переход на разделяемый текстовый формат (.lgf / .elf)

Для круглосуточно работающих систем (24/7) наиболее надежным решением является перевод журнала регистрации в текстовый формат с настройкой разбиения по периодам (дни или месяцы):

  1. В Конфигураторе или настройках базы зададим разделение журнала регистрации по дням.
  2. Текущий день записывается в активный файл, а файлы за прошлые дни не удерживаются процессами 1С.
  3. Архивные файлы прошедших дней можно свободно загружать в сторонние базы, перемещать и удалять средствами операционной системы или скриптами без остановки кластера 1С.

Вариант 2. Порционное удаление с технологическими паузами

Если необходимо продолжить использование формата .lgd, следует уменьшить объем удаляемых данных за один вызов:

  1. Разделим весь период очистки на минимальные интервалы (например, по 1 часу или по 1 дню).
  2. После выполнения удаления за каждый интервал сделаем паузу в выполнении кода, давая рабочим процессам 1С возможность сбросить накопленные события на диск.
  3. Запустим регламентную процедуру очистки в часы наименьшей нагрузки на систему.

Вариант 3. Восстановление поврежденного файла .lgd

Если журнал 1Cv8.lgd был поврежден и перестал принимать записи, восстановить его работу можно с помощью консольной утилиты sqlite3:

  1. Остановим службу кластера 1С:Предприятия.
  2. Сформируем дамп файла базы данных командой: sqlite3 1Cv8.lgd .dump > dump.sql.
  3. Проверим текстовый файл dump.sql: если незавершенная транзакция отменилась, заменим команду отмены на фиксацию COMMIT; в конце файла.
  4. Сформируем исправленный файл журнала: sqlite3 1Cv8_new.lgd < dump.sql.
  5. Заменим исходный файл 1Cv8.lgd на восстановленный и запустим службу 1С.
← На главную