|
Неожидаемый результат выборки в триггере
|
|||
---|---|---|---|
#18+
Есть простой логгирующий триггер на AFTER INSERT/UPDATE: Код: sql 1. 2. 3. 4. 5.
Прекрасно работал годами, записывая в log_actions код инсерта/апдейта в таблицу cases с указанием кто/когда и какую запись вставлял/апдейтил. Однако, в последнее время иногда в поле original_query стало писаться NULL. Судя по датам в логе, первое появление NULL появилось после обновления MySQL на 8.0.25. На днях обновил до последней версии 8.0.26, но NULLы так изредка и проскакивают в логе. Ни сам триггер, ни код апдейта/инсерта давно не изменялся. Уже и Release Notes к версиям пролистал, но так и не понял с чем это может быть связано и как избавиться от проблемы... Может есть у кого идеи? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 09:13 |
|
Неожидаемый результат выборки в триггере
|
|||
---|---|---|---|
#18+
Ну вариантов навскидку три (все остальные по идее должны приводить к ошибке). Первый - на момент получения из INFORMATION_SCHEMA.PROCESSLIST там нет записи. Второй - запись есть, но info содержит NULL. Третий - запрос длиннее 1024. Для того, чтобы понять, с каким вариантом мы имеем дело - попробуй модифицировать, например, так: Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 10:02 |
|
Неожидаемый результат выборки в триггере
|
|||
---|---|---|---|
#18+
Да, ещё Код: sql 1.
Ну и свойства поля в таблице логов подрихтовать. Или брать не 1024, а только 1020 символов слева. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 10:38 |
|
Неожидаемый результат выборки в триггере
|
|||
---|---|---|---|
#18+
Akina, Спасибо, изменил триггер, послежу что будет писАться... По первым двум вариантам - такое может случиться только если что-то поменяли в последних версиях MySQL. Просмотрел доступные логи за три последних года - NULLы стали появляться только после версии 8.0.25, а на нее обновился с 8.0.13. Что-то в промежуточных версиях поменялось, видимо... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 10:46 |
|
Неожидаемый результат выборки в триггере
|
|||
---|---|---|---|
#18+
Ну вообще сама конструкция - она на грани фола... достаточно переписать Код: sql 1.
на Код: sql 1.
чтобы понять, что проходит-то всё "на тоненького"... и сразу становится понятно, что налететь на вариант, когда "первое уже прибито, а второе не натянуто" (ну или наткнуться на блокировку) - легче лёгкого... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 12:43 |
|
Неожидаемый результат выборки в триггере
|
|||
---|---|---|---|
#18+
Akina, ну, насколько я помню, решение было подсмотрено на stackoverflow: Get Full MySQL Query String on Insert or Update несколько лет назад. И оно 100% работало... до недавних пор)) Может уже есть какой другой способ, не подскажете? (general_log = OFF) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 13:22 |
|
Неожидаемый результат выборки в триггере
|
|||
---|---|---|---|
#18+
Не, не подскажу - никогда не занимался проблемами логирования сырых текстов запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 14:00 |
|
Неожидаемый результат выборки в триггере
|
|||
---|---|---|---|
#18+
LiYing Akina, Спасибо, изменил триггер, послежу что будет писАться... Ну вот, опять проскочило несколько NULL-ов. В 1-м случае не записался код инсерта, но последующие через несколько десятков секунд апдейты записались. А во 2-м случае - наоборот. Никакой закономерности не вижу... Есть еще идеи, что сделать можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2021, 08:52 |
|
Неожидаемый результат выборки в триггере
|
|||
---|---|---|---|
#18+
Лог однозначно говорит, что на момент получения из INFORMATION_SCHEMA.PROCESSLIST там нет записи. Почему её нет - сказать нереально. Единственное, что можно сказать точно - это то, что запись с текстом запроса, вызвавшим срабатывание триггера, уже удалена. Все остальные причины привели бы к записи в поле лога по крайней мере нуля или единицы, результата вычисления выражения info IS NULL . Хотя если честно, то для меня загадка, почему оно вообще работает - ведь по идее в момент выполнения SELECT из PROCESSLIST там уже должен лежать именно этот SELECT, а не предыдущий. Впору грешить на настройки транзакций... ведь по идее запись в PROCESSLIST выполняет система в своей транзакции, а не в пользовательской, к тому же асинхронно. И выглядит дело так, словно удаление из PROCESSLIST предыдущего и вставка текущего запросов уже выполнены, но COMMIT ещё не выполнен - иначе я вообще не понимаю, почему ловится фактически предыдущий запрос. Кстати, если это так, то при установлении дефолтного уровня изоляции в SERIALIZED (и при условии что эта настройка относится и к системным процессам) вообще ничего не будет ловиться... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2021, 09:52 |
|
|
start [/forum/search_topic.php?author=AAV&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
146ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 603ms |
total: | 867ms |
0 / 0 |