Пример поиска ошибок в технологическом журнале

26.03.21

База данных - HighLoad оптимизация

Примеры bash - скриптов для поиска ошибок в технологическом журнале.

Ошибка "В данной транзакции уже происходили ошибки" возникает после так называемой невосстановимой ошибки в транзакции 1С. Обычно это откат вложенной транзакции, в том числе не явной, например отказ от записи справочника, записи или проведения документа внутри другой транзакции. После того, как вложенная транзакция откатилась, во внешней транзакции может выполняться код 1С, который не обращается к базе данных. А попытка обратиться к базе данных (запрос, запись, удаление) приведет к появлению ошибки "В данной транзакции уже происходили ошибки". Исходную транзакцию бывает нелегко найти. Подробнее про ошибку https://its.1c.ru/db/metod8dev#content:2313:hdoc

Подробнее про bash и настройку ТЖ //infostart.ru/public/825405/

Для моделирования ошибки выполним процедуру ОсновнаяТранзакция().

&НаСервере
Процедура ВложеннаяТранзакция()
//может быть явной или неявной
//например: запись справочника, документа

НачатьТранзакцию();
ОтменитьТранзакцию();	
	
КонецПроцедуры

&НаСервере
Процедура ОсновнаяТранзакция()
	
НачатьТранзакцию(); //строка 14

ВложеннаяТранзакция();
	
Счетчик = 0;
Счетчек = Счетчик + 1;

Запрос = Новый Запрос("Выбрать 1");
Запрос.Выполнить();	 //строка 22

ЗафиксироватьТранзакцию();	
	
КонецПроцедуры

Чтобы найти источник ошибки, можно открыть технологический журнал в notepad++, найти событие EXCP с содержанием «В данной транзакции уже происходили ошибки» и затем искать предшествующие ему события SDBL с тем же SessionID, в котором транзакция началась. Ниже пример журнала.

... много строк ...

47:24.154020-0,SDBL,6,process=xxxxx,p:processName=xxxxx,OSThread=xxxxx,t:clientID=xxxxx,t:applicationName=xxxxx,t:computerName=xxxxx,t:connectID=xxxxx,SessionID=xxxxx,Usr=xxxxx,AppID=xxxxx,Trans=xxxxx,Func=BeginTransaction,Context='Форма.Вызов : Обработка.ТестОшибки.Форма.Форма.Модуль.ОсновнаяТранзакция
Обработка.ТестОшибки.Форма.Форма.Форма : 14 : НачатьТранзакцию();'

... много строк ...

47:24.154066-0,EXCP,7,process=xxxxx,p:processName=xxxxx,OSThread=xxxxx,t:clientID=xxxxx,t:applicationName=xxxxx,t:computerName=xxxxx,t:connectID=xxxxx,SessionID=xxxxx,Usr=xxxxx,AppID=xxxxx,Exception=xxxxx,Descr=В данной транзакции уже происходили ошибки!,Context='Форма.Вызов : Обработка.ТестОшибки.Форма.Форма.Модуль.ОсновнаяТранзакция
Обработка.ТестОшибки.Форма.Форма.Форма : 22 : Запрос.Выполнить();'

... много строк ...

47:24.154068-0,QERR,6,process=xxxxx,p:processName=xxxxx,OSThread=xxxxx,t:clientID=xxxxx,t:applicationName=xxxxx,t:computerName=xxxxx,t:connectID=xxxxx,SessionID=xxxxx,Usr=xxxxx,AppID=xxxxx,Descr=xxxxx,Query=xxxxx,Context='Форма.Вызов : Обработка.ТестОшибки.Форма.Форма.Модуль.ОсновнаяТранзакция
Обработка.ТестОшибки.Форма.Форма.Форма : 22 : Запрос.Выполнить();'

Скрипт, который рядом с сообщением об ошибке выводит событие начала транзакции.

egrep '^[0-9][0-9]:[0-9][0-9].{8,20}(,EXCP,.*транзакции уже происходили ошибки|,SDBL,.*,Func=BeginTransaction,)' -R -h --include "*.log" \
| gawk '{
SessionID=$0 \
;sub("^.*SessionID=","",SessionID) \
;sub(",.*$","",SessionID) \
;if (match($0,"^.{12,20}SDBL")){Event[SessionID]=$0}
;if (match($0,"^.{12,20}EXCP")){print Event[SessionID]"\n"$0"\n"} \
}'

Бонус - скрипт для обезличивания технологического журнала. Заменяет переменные на "хххххх".

sed -i -E 's/=[^,]+,/=xxxxx,/g'  $(find . -name '*.log')

Благодарю Виктора Богачева за предоставленные методические материалы и поддержку.

технологический bash context регулярные Богачев grep egrep awk gawk cat sed print printf echo sort logcfg

См. также

Опыт оптимизации 1С на PostgreSQL

HighLoad оптимизация Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    5704    ivanov660    4    

61

ТОП проблем/задач у владельцев КОРП лицензий 1С на основе опыта РКЛ

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    3634    a.doroshkevich    20    

64

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    13584    skovpin_sa    14    

82

«Монитор» – простой анализ производительности

Администрирование СУБД Технологический журнал Бесплатно (free)

Для расследования проблем производительности недостаточно просто проанализировать технологический журнал. Нужен парсинг контекста событий, его сопоставление с информацией из Extended Events и логов, агрегация огромного количества информации.

21.09.2023    4597    Andreynikus    14    

77

Как эффективно настроить autovacuum в Postgres для 1С

HighLoad оптимизация Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Кто не любит убирать мусор? Думаю, практически все, а вот в Postgres это обязательный ритуал для эффективной работы. Как эффективно настроить уборку за 1С в Postgres, можно прочитать в этой статье и еще раз задуматься о бесплатности Postgres.

05.08.2023    4210    1CUnlimited    5    

48

MS SQL Server: изучаем планы запросов

Запросы HighLoad оптимизация Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    10867    Филин    37    

101
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VKislitsin 931 23.04.20 17:23 Сейчас в теме
Николай, я опять конечно плюсанул. Но спрошу оффтопом: Вы в каждой публикации благодарите Виктора. Он обещал за 10 рекламных ссылок принять экзамен? Полагаю, Вы пользуетесь не только его материалами. Как минимум, думаю, прочитана вся kb. Там есть Морозов, Голиков, Федоров и другие достойные люди. :)
kser87; MVK80; +2 Ответить
2. vasilev2015 2605 23.04.20 17:42 Сейчас в теме
(1) я благодарю потому что сейчас слушаю его курс. В курсе есть домашнее задание, его делают многие, просто не все публикуют свои результаты. Хочу сделать библиотеку скриптов. Чтобы было проще пользоваться. Присоединяйтесь.
gabrielyants; RustIG; +2 Ответить
3. VKislitsin 931 23.04.20 17:59 Сейчас в теме
(2)
Хочу сделать библиотеку скриптов. Чтобы было проще пользоваться. Присоединяйтесь

У меня немного другой подход. Я думал насчет готовых скриптов под определенные задачи. И что-то конечно же есть. Но, по сути, у меня в ходу "кубики" из которых я под конкретные нужды скрипт делаю. Думал когда-нибудь опубликовать эти свои "кубики", но больно уж много сил отнимает подготовка публикаций. Пока ленюсь. Да и сомневаюсь что это кому-то нужно. Они ведь не универсальные. Их невозможно использовать без понимания что именно ты делаешь, как и зачем.
SerVer1C; +1 Ответить
4. VKislitsin 931 23.04.20 18:19 Сейчас в теме
(2) По теме:
Скрипт, который рядом с сообщением об ошибке выводит событие начала транзакции

Транзакции ведь могут содержать много запросов. И ошибка где-то в середине обычно бывает.
Скрипт выводит SDBL начала транзакции. А нужен запрос (и его контекст), на котором "что-то пошло не так".
5. vasilev2015 2605 23.04.20 18:53 Сейчас в теме
(4) вопрос прямо в точку. Когда Виктор показывал эту тему, он нашел именно проблемный запрос по маске SDBL.*setRollBackOnly
У меня так не получилось: скорее всего - старая платформа (8.3.12.1714).
Поэтому я вывел начало транзакции.

Коллеги, попробуйте - у кого-то свежая платформа - должно получиться !
Ключевое слово setRollBackOnly.
6. VKislitsin 931 23.04.20 19:07 Сейчас в теме
(5) Я бы, пожалуй, искал просто последний запрос в этой сессии. Ведь, как Вы сами и написали, после ошибки следующее же обращение к данным выкидывает "в этой транзакции уже...". Если ищете DBMSSQL (или аналогичный для другой БД), можно уточнить что в транзакции - Tran=1. Хотя это избыточно.

Обычно это * вложенной транзакции

И, по моему опыту, чаще всего это злоупотребление конструкцией Попытка..Исключение, а не вложенная транзакция.
7. gabrielyants 14.09.20 12:06 Сейчас в теме
(2)
делают многие, просто не все публикуют свои результаты. Хочу сделать библиотеку скриптов. Чтобы было проще пользоваться. Присоединяйтесь.

Сейчас тоже делаю свою библиотеку, предлагаю объединить усилия
Оставьте свое сообщение