powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Неожидаемый результат выборки в триггере
9 сообщений из 9, страница 1 из 1
Неожидаемый результат выборки в триггере
    #40092589
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть простой логгирующий триггер на AFTER INSERT/UPDATE:
Код: sql
1.
2.
3.
4.
5.
CREATE TRIGGER `case_after_insert` AFTER INSERT ON `cases` FOR EACH ROW BEGIN
  DECLARE original_query varchar(1024);
  SET original_query = (SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID());
  INSERT INTO log_actions (id_user, dt, table_name, id_rec, action, sql_text) VALUES (@uid, NOW(), 'cases', NEW.id, 'I', original_query);
END


Прекрасно работал годами, записывая в log_actions код инсерта/апдейта в таблицу cases с указанием кто/когда и какую запись вставлял/апдейтил.
Однако, в последнее время иногда в поле original_query стало писаться NULL.
Судя по датам в логе, первое появление NULL появилось после обновления MySQL на 8.0.25. На днях обновил до последней версии 8.0.26, но NULLы так изредка и проскакивают в логе. Ни сам триггер, ни код апдейта/инсерта давно не изменялся.
Уже и Release Notes к версиям пролистал, но так и не понял с чем это может быть связано и как избавиться от проблемы...
Может есть у кого идеи?
...
Рейтинг: 0 / 0
Неожидаемый результат выборки в триггере
    #40092597
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вариантов навскидку три (все остальные по идее должны приводить к ошибке).

Первый - на момент получения из INFORMATION_SCHEMA.PROCESSLIST там нет записи.
Второй - запись есть, но info содержит NULL.
Третий - запрос длиннее 1024.

Для того, чтобы понять, с каким вариантом мы имеем дело - попробуй модифицировать, например, так:

Код: sql
1.
2.
3.
4.
5.
SET original_query = (
    SELECT CONCAT_WS(':', info IS NULL, LENGTH(info), LEFT(info, 1024)),
    FROM INFORMATION_SCHEMA.PROCESSLIST 
    WHERE id = CONNECTION_ID()
);
...
Рейтинг: 0 / 0
Неожидаемый результат выборки в триггере
    #40092613
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, ещё
Код: sql
1.
DECLARE original_query TEXT;


Ну и свойства поля в таблице логов подрихтовать. Или брать не 1024, а только 1020 символов слева.
...
Рейтинг: 0 / 0
Неожидаемый результат выборки в триггере
    #40092617
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Спасибо, изменил триггер, послежу что будет писАться...

По первым двум вариантам - такое может случиться только если что-то поменяли в последних версиях MySQL. Просмотрел доступные логи за три последних года - NULLы стали появляться только после версии 8.0.25, а на нее обновился с 8.0.13. Что-то в промежуточных версиях поменялось, видимо...
...
Рейтинг: 0 / 0
Неожидаемый результат выборки в триггере
    #40092651
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вообще сама конструкция - она на грани фола... достаточно переписать
Код: sql
1.
SET original_query = (SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID());


на
Код: sql
1.
SELECT info INTO original_query FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();


чтобы понять, что проходит-то всё "на тоненького"... и сразу становится понятно, что налететь на вариант, когда "первое уже прибито, а второе не натянуто" (ну или наткнуться на блокировку) - легче лёгкого...
...
Рейтинг: 0 / 0
Неожидаемый результат выборки в триггере
    #40092661
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

ну, насколько я помню, решение было подсмотрено на stackoverflow: Get Full MySQL Query String on Insert or Update несколько лет назад. И оно 100% работало... до недавних пор))

Может уже есть какой другой способ, не подскажете? (general_log = OFF)
...
Рейтинг: 0 / 0
Неожидаемый результат выборки в триггере
    #40092677
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, не подскажу - никогда не занимался проблемами логирования сырых текстов запросов.
...
Рейтинг: 0 / 0
Неожидаемый результат выборки в триггере
    #40093729
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LiYing
Akina,

Спасибо, изменил триггер, послежу что будет писАться...

Ну вот, опять проскочило несколько NULL-ов. В 1-м случае не записался код инсерта, но последующие через несколько десятков секунд апдейты записались. А во 2-м случае - наоборот. Никакой закономерности не вижу...
Есть еще идеи, что сделать можно?
...
Рейтинг: 0 / 0
Неожидаемый результат выборки в триггере
    #40093738
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лог однозначно говорит, что на момент получения из INFORMATION_SCHEMA.PROCESSLIST там нет записи. Почему её нет - сказать нереально. Единственное, что можно сказать точно - это то, что запись с текстом запроса, вызвавшим срабатывание триггера, уже удалена. Все остальные причины привели бы к записи в поле лога по крайней мере нуля или единицы, результата вычисления выражения info IS NULL .

Хотя если честно, то для меня загадка, почему оно вообще работает - ведь по идее в момент выполнения SELECT из PROCESSLIST там уже должен лежать именно этот SELECT, а не предыдущий.

Впору грешить на настройки транзакций... ведь по идее запись в PROCESSLIST выполняет система в своей транзакции, а не в пользовательской, к тому же асинхронно. И выглядит дело так, словно удаление из PROCESSLIST предыдущего и вставка текущего запросов уже выполнены, но COMMIT ещё не выполнен - иначе я вообще не понимаю, почему ловится фактически предыдущий запрос. Кстати, если это так, то при установлении дефолтного уровня изоляции в SERIALIZED (и при условии что эта настройка относится и к системным процессам) вообще ничего не будет ловиться...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Неожидаемый результат выборки в триггере
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]