Имя: Пароль:
1C
1С v8
ЖР SQLite - внезапно 1Cv8.lgd-journal
,
0 AlexSTAL
 
06.11.20
09:29
Может кто сталкивался или подскажет, с чего начать

Кластер из 3-х серверов (2 центральных и 1 лицензирования)
Несколько инсталляций в разных филиалах, версия 8.3.17.1549, windows server, промышленная эксплуатация

В одном из филиалов пользователи начали жаловаться на внезапные полные зависания системы на продолжительное время (3-25 минут).
Вчера сам столкнулся с данной ситуацией, полез в каталог с ЖР и обнаружил, что по мимо файла 1Cv8.lgd присутствует файл журнала транзакций 1Cv8.lgd-journal и он постоянно растёт
Т.е. основной файл примерно 1,5 Гб, а файл журнала транзакций за 15 минут вырос до 0,4 Гб и исчез. В это время работа в 1С была не возможна. Записей в ЖР в этом промежутке нет.

Что может 1С делать с журналом регистрации?
1 AlexSTAL
 
06.11.20
09:32
Выглядит это вот так:
https://ibb.co/wdQvRDx
2 dmpl
 
06.11.20
09:38
(0) Отбор не попал в индекс, пошел тупой перебор.
3 AlexSTAL
 
06.11.20
09:52
(2) Речь про отображение ЖР? Ни у кого нет доступа к нему, никто не мог запрашивать из него информацию
4 vis_tmp
 
06.11.20
09:56
(3)Сделать отбор и проверить
5 AlexSTAL
 
06.11.20
09:59
(4) я не понимаю, про что речь. Отбор чего? В конфигураторе в ЖР все отборы по всем событиям работают. У пользователей нет доступа к ЖР, посему никто ничего в нём смотреть не может
6 mistеr
 
06.11.20
09:59
(0) Журнал SQLite растет, когда данные не могут быть надежно записаны в основной файл (например, его кто-то блокирует).

Смотрите логи сервера 1С, возможно там есть ответ.
7 mistеr
 
06.11.20
10:00
Может антивирус шалит.
8 AlexSTAL
 
06.11.20
10:01
(6) какая-либо незавершённая транзакция? Которая потом откатывается?
ЖР смотрел, ничего вообще подозрительного найти не смог
9 AlexSTAL
 
06.11.20
10:01
(7) Хм, спасибо, посмотрю
10 fisher
 
06.11.20
10:06
На всех больших базах перевожу ЖР в текстовый формат с разделением по периодам. Надежно и удобно. Правда и журналирование переделываю, чтобы в ЖР срало как можно меньше.
11 Жан Пердежон
 
06.11.20
10:07
(0) ставишь текстовый по дням и забываешь о проблеме
12 mistеr
 
06.11.20
10:11
(8) ЖР пишется вне транзакций.
13 mistеr
 
06.11.20
10:12
(8) А, если ты про транзакцию SQLite, то да, возможно.
14 D_E_S_131
 
06.11.20
10:12
На больших базах с интенсивным вводом данных SQLite быстро загнется. Держим там не более 2-х дней последних, остальное отрезаем и "складируем" отдельно (в базе 1С на MSSQL).
15 Ёпрст
 
06.11.20
10:13
(0) понять и простить, жр на скульлайте не удался на селезнёвке..пользуй текстовый жр
16 dmpl
 
06.11.20
10:16
(3) А если УстановитьПривилегированныйРежим()? И потом программно запустить отбор.
17 AlexSTAL
 
06.11.20
10:18
(all) Перевести в текстовый - очень быстрое решение, но при наличии наработок (агрегация ЖР, выгрузка в ИБ и т.д.) не простое решение.
Кроме того, отбор за большой период (скажем год) в SQLite будет работать в разы быстрее.

Сейчас самый большой файл ЖР 45 Гб, и ничего, работает... Значит проблема решаемая, главное понять, при каких обстоятельствах она проявилась
18 AlexSTAL
 
06.11.20
10:21
(16) Я не понимаю, что за отбор и при чём тут отбор
19 fisher
 
06.11.20
10:26
(17) Хозяин - барин. Но во всех "взрослых" системах, если необходим быстрый анализ - сбоку прикручивается система агрегации логов с нужными свистоперделками. А первичные логи всегда ведутся локально в тексте, как в самом простом и надежном варианте, для которого в том числе легко настраивается ротация. Только 1С изобретает велосипед не подумав, а потом устраивает метания. Лично меня пока необходимость агрегации ни разу не прижимала. И "расследования" и анализ статистики проводятся не настолько часто и занимают приемлемое время, чтобы необходимость сверх-быстрого анализа стала насущной.
А проблемы с SQLite на больших базах возникают редко, но закономерно.
20 fisher
 
06.11.20
10:30
Причем когда они возникают, это как правило всегда выглядит как "стоп-система".
21 fisher
 
06.11.20
10:32
Идеальный ЖР был в 7.7
А в 8-ке на старте ТЖ не было и они попытались скрестить ежа и ужа, при этом не предоставив возможностей гибкой настройки. В результате ЖР для обеих задач (анализ работы системы и анализ действий пользователей) в своем дефолтном виде стал подходить очень плохо. И вместо решения проблемы в корне чья-то "светлая голова" решила прикрутить скулайт.
22 dmpl
 
06.11.20
10:33
(18) Только поиск в ЖР приводит к такому поведению. Причем поиск, который не попал в индекс, и начинается перебор. Перебор идет со скоростью порядка 10-30 Мб/с, на это время блокируются любые операции, требующие работы с ЖР (например, которые добавляют записи в него).
23 dmpl
 
06.11.20
10:35
+(22) Прекратить это можно, например, принудительно завершив процесс rmngr.
24 fisher
 
06.11.20
10:36
(23) Подтверждаю. Эффективный способ прекратить любые безобразия в 1С.
25 mistеr
 
06.11.20
10:38
(22) Если бы блокировалась запись, журнал бы не рос. :)
26 dmpl
 
06.11.20
10:43
(25) В журнале вполне может быть аналог tempdb, куда складываются временные данные по выполняемому запросу.
27 fisher
 
06.11.20
10:58
Из доки по скулайту -journal - это rollback journal. С помощью которого в скулайте транзакции реализуются. Просто какого-то хрена система зафигачила в скулайт большую транзакцию. Что это такое может быть - самому интересно. Но тут, ИМХО, только ТЖ может помочь прояснить картину.
28 fisher
 
06.11.20
11:02
Еще вариант - кластер какого-то хрена переводил лог в режим эксклюзивной блокировки (PRAGMA lock_mode = EXCLUSIVE;)
Это вызывает аналогичное поведение.
29 Вафель
 
06.11.20
11:13
вернуться на старый журнал
30 Вафель
 
06.11.20
11:15
говорят на него теперь можно и индексы навешать
31 AlexSTAL
 
06.11.20
11:26
Хм. Нашёл в ЖР примерно в то проблемное время событие Транзакция начало, статус транзакции - не завершена. Источник - фоновое задание
В других базах нет таких событий
32 fisher
 
06.11.20
11:36
(31) Сам по себе, откат транзакции 1С не должен приводить к откату транзакции скулайта. Это ж лог и записи о неудачных транзакциях туда тоже пишутся. Возникает вопрос, каким образом в лог происходит запись статуса об откате транзакции в сделанные ранее записи. Подозреваю, что именно после отката транзакции в 1С кластер находит все записи сделанные этой транзакцией в лог и меняет в них значение поля статуса транзакции. И именно во время этой операции произошел глобальный лок.
33 fisher
 
06.11.20
11:43
Скорее всего, изменение поля статуса транзакций в куче записей лога делается в транзакции. И так как это лочит все последние записи, то вероятно скулайт в это время не позволяет добавлять новые записи.
В сиквеле, ИМХО, будет такое-же поведение. Если эксклюзивно залочить последние строки кластерного индекса - новую строку добавить не даст.
34 dmpl
 
06.11.20
11:45
(33) Но тут же индексы должны рулить, а потому эта операция должна быть относительно быстрой.
35 fisher
 
06.11.20
11:46
Получается, что откат любых больших транзакций в 1С с журналом на скулайте приводит к stop the world
Интересно, что в аналогичной ситуации происходит на текстовых логах. Может, тоже самое, просто быстрее обрабатывается.
36 fisher
 
06.11.20
11:48
(34) Если у тебя транзакция на 10 мин растянулась - ее откат физически не способен произойти быстро.
37 AlexSTAL
 
06.11.20
11:49
Хм2... больше таких записей не нашёл, когда у сотрудников был stop the world. Может разные проблемы конечно...
Самое простое, насколько я понимаю, написать мониторинг наличия/отсутствия файла лога в каталоге
38 fisher
 
06.11.20
11:49
Вернее, транзакция в скулайте оказывается очень большая. В обычной ситуации их вообще как бы и нет - тупо строчка добавляется.
39 fisher
 
06.11.20
11:50
(37) Вероятно, это просто редкий случай когда откатывалась очень большая транзакция. Скорее всего на очень большое количество мелких объектов.
40 fisher
 
06.11.20
11:51
Хотя не обязательно. Там же по дефолту и движения регистров логируется.
41 fisher
 
06.11.20
12:06
(37) Можно косвенно прикинуть справедливость гепотезы - если ты посчитаешь количество записей в лог, которое сделала транзакция которая откатилось. Если это объективно очень большое число, то субъективно можно предположить, что в этом могла быть причина :) А если не очень большое - тогда неясно. Гипотеза может быть верной, просто мог вмешаться какой-то дополнительный фактор. Например просто начались проблемы с диском в том месте, где лежит лог и производительность записи в него резко упала. На добавлениях незаметно, а на массивных операциях уже проявляется.
42 fisher
 
06.11.20
12:10
Предварительно количество записей должно быть очень большим. Раз размер файла транзакции составил четверть размера от основного файла. Если лог ведется от начала работы базы - то это как-то ненормально много. Может, у тебя там перепроведение в транзакции? :)
43 Вафель
 
06.11.20
12:11
зачем пытаться разобратся с этим сиквел лайт, когда сама 1с рекомендует на старый журнал переходить
44 Вафель
 
06.11.20
12:12
(42) транзакции ЖР никакого отношения не  имеют к транзакциям внутри самой 1с
45 dmpl
 
06.11.20
12:18
(42) Структура ЖР в SQLite практически такая же, как в текстовом виде. Т.е. 1С просто вместо текстового файла отправляет записи в базу SQLite. Поэтому все предварительные записи есть только в памяти 1С.
46 mistеr
 
06.11.20
12:27
(33) Откуда такие фантазии?
47 fisher
 
06.11.20
12:31
(44) Прямого - не имеют. Но при откате транзакции 1С в ЖР необходимо проставить признак неудачной транзакции для всех записей, по которым она сделала записи в ЖР
(46) Все фантазии - они от воображения. Воображение нужно развивать!
48 fisher
 
06.11.20
12:32
Тьфу! "Но при откате транзакции 1С в ЖР необходимо проставить признак неудачной транзакции для всех записей, которые она сделала в ЖР"
49 Cyberhawk
 
06.11.20
12:41
(43) В том-то и дело, что нет такой рекомендации. Только намеки :)
50 fisher
 
06.11.20
12:46
(43) Причем это после того, как они сначала вообще отключили в интерфейсе возможность выбрать текстовый формат и для всех новых баз форсили скулайтный по дефолту.