В процессе активной работы пользователей журнал регистрации платформы «1С:Предприятие 8.3» нового формата (файл базы данных SQLite 1Cv8.lgd) быстро увеличивается в размерах, занимая десятки гигабайт на диске сервера. При этом системные администраторы часто сталкиваются с ситуацией: стандартная процедура сокращения журнала через Конфигуратор выполнена, старые записи удалены, но сам файл 1Cv8.lgd физически не уменьшается в объеме, а попытка сжать его утилитой SQLite завершается без результата. Разберем детально механизм работы журнала регистрации и рассмотрим эффективные способы решения этой проблемы.
Проанализируем логику работы СУБД SQLite, на базе которой реализован журнал регистрации 1Cv8.lgd:
СократитьЖурналРегистрации(), платформа удаляет строки с помощью стандартной операции DELETE.Для физического уменьшения файла и возврата свободного пространства операционной системе используется команда VACUUM утилиты sqlite3.exe. Однако ее выполнение имеет строгие технические ограничения:
Утилита SQLite не выполняет сжатие «на лету» внутри текущего файла. Команда VACUUM создает полную временную копию базы данных, переносит в нее только актуальные (непустые) страницы и после завершения операции подменяет исходный файл новым. Таким образом, если исходный файл 1Cv8.lgd занимает 15 Гб, то на диске, где выполняется операция (или в системном каталоге временных файлов), должно быть свободно не менее 15–16 Гб. Если на диске свободно лишь 11 Гб, команда завершается с ошибкой переполнения диска (database or disk is full), а размер файла не меняется.
Если на диске имеется достаточный запас свободного пространства (больше текущего размера файла 1Cv8.lgd), выполним процедуру сжатия по шагам:
sqlite3.exe с передачей команды сжатия в кавычках и точкой с запятой на конце.Посмотрим на пример командного файла (bat/cmd), автоматизирующего данный процесс:
net stop "1C:Enterprise 8.3 Server Agent (x86-64)"
timeout /t 5 /nobreak
"D:\scripts\sqlite3.exe" "D:\1Cv8Log\1Cv8.lgd" "VACUUM;"
net start "1C:Enterprise 8.3 Server Agent (x86-64)"
Если на диске с логами недостаточно места для создания временного файла, разберем два надежных способа обойти данное ограничение:
Способ А. Перенос на другой накопитель:
net stop "1C:Enterprise 8.3 Server Agent (x86-64)".1Cv8.lgd на другой локальный или сетевой диск, где свободно более 15 Гб (например, на диск E:\TempLog\)."D:\scripts\sqlite3.exe" "E:\TempLog\1Cv8.lgd" "VACUUM;"net start "1C:Enterprise 8.3 Server Agent (x86-64)".Способ Б. Использование команды VACUUM INTO:
Современные версии SQLite (начиная с 3.27) поддерживают прямую выгрузку сжатой копии на другой накопитель без предварительного ручного копирования исходного файла:
net stop "1C:Enterprise 8.3 Server Agent (x86-64)"
"D:\scripts\sqlite3.exe" "D:\1Cv8Log\1Cv8.lgd" "VACUUM INTO 'E:\Temp\1Cv8_compacted.lgd';"
move /Y "E:\Temp\1Cv8_compacted.lgd" "D:\1Cv8Log\1Cv8.lgd"
net start "1C:Enterprise 8.3 Server Agent (x86-64)"
Рассмотрим радикальный, но абсолютно безопасный способ быстрого освобождения дискового пространства, если история прошлых событий не представляет ценности:
1Cv8.lgd (или переместим его в архив на внешний накопитель).Важно понимать последствия: удаление файла 1Cv8.lgd никак не влияет на работоспособность информационной базы и целостность учетных данных в СУБД (MS SQL Server, PostgreSQL и др.). При следующем обращении к базе платформа автоматически создаст новый чистый файл 1Cv8.lgd нулевого размера. Единственное последствие — безвозвратная потеря предшествующей истории действий пользователей.
В платформе 1С 8.3 существует возможность вернуться к классическому текстовому формату хранения логов (набор файлов с расширением .lgp, разбитых по дням, неделям или месяцам). Это позволяет удалять устаревшие логи простым удалением файлов за прошлые периоды средствами операционной системы без остановки сервера и процедур сжатия.
Для перевода сервера на раздельное хранение выполним следующие действия:
conf.cfg (по умолчанию находится в каталоге C:\Program Files\1cv8\conf\).LogFormat=0 (или LogFormat=text).Чтобы избежать критического заполнения диска в будущем, настроим регулярное обслуживание:
ГраницаОчистки = НачалоДня(ТекущаяДата() - (60 * 24 * 60 * 60)); // Храним 60 дней
СократитьЖурналРегистрации(ГраницаОчистки);