При программном удалении старых записей из журнала регистрации формата SQLite (.lgd) с помощью метода ClearEventLog() администраторы и разработчики часто сталкиваются с ситуацией, когда журнал полностью перестает фиксировать новые события. В этой статье мы подробно проанализируем причины блокировки файла журнала регистрации, рассмотрим происходящие технические процессы и разберем практические варианты решения данной проблемы.
Рассмотрим стандартный сценарий выполнения программной очистки журнала регистрации через 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:
1Cv8.lgd представляет собой единую базу данных SQLite. Операция массового удаления записей за длительный период создает продолжительную монопольную транзакцию записи. В это же время сеансы пользователей пытаются зафиксировать новые события, сталкиваясь с заблокированным файлом.1Cv8.lgd или помечает его как недоступный. После этого внутренний механизм логирования платформы прекращает дальнейшие попытки записи.ClearEventLog() не уменьшает размер файла 1Cv8.lgd на диске. Освободившиеся страницы сохраняются во внутреннем списке базы данных и используются повторно. Полное сжатие файла требует выполнения команды VACUUM, которая возможна только при монопольном доступе к файлу без активных сеансов.Разберем проверенные варианты организации очистки и архивации журнала регистрации.
Для круглосуточно работающих систем (24/7) наиболее надежным решением является перевод журнала регистрации в текстовый формат с настройкой разбиения по периодам (дни или месяцы):
Если необходимо продолжить использование формата .lgd, следует уменьшить объем удаляемых данных за один вызов:
Если журнал 1Cv8.lgd был поврежден и перестал принимать записи, восстановить его работу можно с помощью консольной утилиты sqlite3:
sqlite3 1Cv8.lgd .dump > dump.sql.dump.sql: если незавершенная транзакция отменилась, заменим команду отмены на фиксацию COMMIT; в конце файла.sqlite3 1Cv8_new.lgd < dump.sql.1Cv8.lgd на восстановленный и запустим службу 1С.