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

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

См. также

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

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    9248    Evg-Lylyk    61    

44

HighLoad оптимизация Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    5088    spyke    28    

49

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

2 стартмани

15.02.2024    12403    241    ZAOSTG    80    

115

HighLoad оптимизация Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    13964    doom2good    49    

71

HighLoad оптимизация Системный администратор Программист Бесплатно (free)

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

20.11.2023    13521    ivanov660    6    

81

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

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

15.11.2023    7144    a.doroshkevich    22    

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

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

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

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

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

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

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