Как включить для каждой таблицы SQL оператора записи в MySQL - PullRequest
6 голосов
/ 13 марта 2012

Я хотел бы зарегистрировать все операторы SQL, которые обращаются к определенной или списку определенных таблиц, но не ко ВСЕМ таблицам.

Возможно ли это даже в MySQL?

Ответы [ 3 ]

6 голосов
/ 14 марта 2012

Нет - общий журнал запросов - ваш единственный вариант для регистрации запросов - и это для всего сервера ... хотя вы можете войти в таблицу и затем удалить результаты, которые вам не нужны

2 голосов
/ 11 августа 2016

Это возможно, используя Percona Toolkit pt-query-digest .

Если вы хотите отслеживать все SELECT с, UPDATE с и JOIN с, касаясь table_one, table_two и table_three на my_database, запустите что-то подобное на своем сервер базы данных сделает свое дело:

tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 |
pt-query-digest --type tcpdump \
                --run-time 5s \
                --iterations 0 \
                --filter '$event->{fingerprint} =~ m/\b(from|join|into)\s+(`?my_database`?\.)`?(table_one|table_two|table_three)`?\b/' \
                --output slowlog \
                --no-report

Он отслеживает весь ваш входящий трафик базы данных, используя tcpdump, и направляет его в инструмент pt-query-digest, который затем пытается отфильтровать его до запросов к этим таблицам. Вывод будет выглядеть как медленный журнал запросов MySQL.

Вам необходимо настроить регулярное выражение в аргументе --filter в соответствии с вашими потребностями. Как и в случае большинства регулярных выражений, будет много крайних случаев. Я попытался охватить некоторые из них, но я ни в коем случае не эксперт, когда дело доходит до регулярных выражений.

Это не идеальное решение, но оно помогло мне в определенных ситуациях, когда использование общего журнала запросов запрещено.

0 голосов
/ 10 сентября 2018

Вы можете сделать это с помощью триггера:

delimiter |
CREATE TRIGGER trigger_name AFTER UPDATE ON table_name
FOR EACH ROW
BEGIN
     insert into tmp.my_log values(........);
END;|

Исходные значения хранятся в OLD.column_name, а обновленные значения хранятся в NEW.column_name.Вы можете занести любые интересующие вас поля в другую таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...