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

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

См. также

Анализируем SQL сервер глазами 1С-ника

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

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

1 стартмани

15.02.2024    7641    158    ZAOSTG    68    

96

Удаление строк из таблицы значений различными способами с замером производительности

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

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

09.01.2024    5978    doom2good    48    

63

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

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

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

20.11.2023    8872    ivanov660    6    

76

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

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

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

15.11.2023    5105    a.doroshkevich    20    

72

Магия преобразований: ЖР, ТЖ, RAS/RAC, логи - универсальное решение Vector

Мониторинг Журнал регистрации Технологический журнал Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

13.11.2023    2969    4    AlexSTAL    0    

42

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

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

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

11.10.2023    16186    skovpin_sa    14    

98

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

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

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

21.09.2023    5724    Andreynikus    14    

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

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

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

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

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

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

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