В процессе администрирования баз данных «1С:Предприятие 8.3» можно столкнуться с ситуацией, когда журнал регистрации внезапно перестает фиксировать новые события. Чаще всего такое поведение наблюдается после аварийного отключения электропитания, внезапного падения сети или некорректного завершения работы процессов сервера 1С. При этом информационная база продолжает функционировать в штатном режиме, пользователи работают, но история действий не сохраняется либо новые записи не отображаются в интерфейсе.
Разберем по шагам, почему возникает эта неполадка в современном формате журнала регистрации, как провести быструю диагностику и какими способами восстановить корректную фиксацию событий без потери истории.
Начиная с версии платформы 8.3, журнал регистрации по умолчанию использует единую базу данных на движке SQLite (файл 1Cv8.lgd), функционирующую с механизмом упреждающей записи WAL (Write-Ahead Logging). Вместе с основным файлом создаются вспомогательные файлы 1Cv8.lgd-wal и 1Cv8.lgd-shm.
Выясним основные причины, приводящие к остановке записи:
1Cv8.lgd-wal не успевают перенестись в основной файл 1Cv8.lgd, из-за чего база журнала переходит в несогласованное состояние и блокирует новые операции вставки.rphost) или фоновый антивирусный монитор может удерживать дескрипторы файлов журнала.Для начала проверим, способна ли платформа 1С в текущем состоянии отправлять команды записи в журнал или возникает системная ошибка. Выполним проверочный запуск специального фрагмента кода во внешней обработке или через консоль кода:
Для Х = 1 По 10 Цикл
Попытка
ЗаписьЖурналаРегистрации("ТестоваяЗапись", УровеньЖурналаРегистрации.Информация, , , "Проверка фиксации события: " + Х);
Исключение
Сообщить("Ошибка записи: " + ОписаниеОшибки());
КонецЦикла;
Если цикл выполняется без исключений, но в стандартной форме просмотра журнала новых строк не видно, имеет место повреждение индексов базы SQLite либо журнала в целом. Если же вызывается исключение, это явно свидетельствует о физической блокировке или недоступности файлов лога на сервере.
Проверим базовые настройки отображения и регистрации:
Если требуется срочно возобновить фиксацию событий на рабочем сервере, самым быстрым способом является создание нового файла журнала с сохранением резервной копии старого:
1C:Enterprise Server Agent (служба ragent)..../srvinfo/reg_xxxx/<GUID_базы>/1Cv8Log/.1Cv8.lgd (а также временные файлы 1Cv8.lgd-wal и 1Cv8.lgd-shm, если они присутствуют) в отдельную архивную папку.При первом же обращении к базе платформа автоматически создаст новый чистый файл 1Cv8.lgd, и запись событий возобновится в штатном режиме.
Если архивные записи критически важны и их требуется сохранить в текущей базе, выполним процедуру восстановления структуры SQLite с помощью консольной утилиты sqlite3:
1Cv8Log.sqlite3 1Cv8.lgd "PRAGMA integrity_check;"sqlite3 1Cv8.lgd ".recover" | sqlite3 1Cv8_new.lgd1Cv8.lgd полученным файлом 1Cv8_new.lgd, удалив остаточные файлы -wal и -shm.Если оборудование сервера периодически подвергается сбоям электропитания, новый единый формат SQLite может регулярно повреждаться. В таких условиях более устойчивым решением является перевод журнала в старый текстовый формат (набор файлов .lgf и .lgp, разделенных по периодам). При повреждении одного текстового фрагмента остальные периоды остаются полностью доступными.
Конвертацию выполним в пакетном режиме запуска Конфигуратора через командную строку:
/ConvertEventLogToTextFormat:
"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" CONFIG /S "server-1c\base_name" /N "Admin" /P "Password" /ConvertEventLogToTextFormat
/ConvertEventLogToSQLiteFormat:
"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" CONFIG /S "server-1c\base_name" /N "Admin" /P "Password" /ConvertEventLogToSQLiteFormat
При конвертации платформа выполнит перенос всех накопленных записей в новый формат автоматически.
Чтобы исключить повторение сбоев в работе журнала регистрации, настроим следующие системные параметры:
srvinfo кластера 1С и все его подкаталоги в список исключений сканирования постоянной защиты.СкопироватьЖурналРегистрации() и последующее удаление старых периодов вызовом ОчиститьЖурналРегистрации().