MySQL Trigger только для определенного пользователя MySQL - PullRequest
4 голосов
/ 08 февраля 2010

Я пытаюсь выяснить, используется ли конкретный пользователь MySQL в нашей системе (и какие запросы он выполняет).

Поэтому я подумал о написании триггера, который будет срабатывать в любое время пользователяX выполняет запрос, и он регистрирует запрос в таблице журналов.

Как я могу это сделать?Я знаю, как написать запрос для конкретной таблицы, но не для конкретного пользователя (любой таблицы).

Спасибо

Ответы [ 5 ]

3 голосов
/ 08 февраля 2010

Вы можете включить функцию триггера на USER () .

2 голосов
/ 08 февраля 2010

Проще всего было бы, чтобы триггер всегда срабатывал, но регистрировал только, если пользователь X.

0 голосов
/ 25 января 2012

Я бы посмотрел на эти варианты:

A) Напишите плагин аудита, который фильтрует события на основе имени пользователя.

Для простоты имя пользователя может быть жестко запрограммировано в самом плагине, или, для элегантности, его можно настроить с помощью переменной плагина, если эта проблема возникнет снова.

См http://dev.mysql.com/doc/refman/5.5/en/writing-audit-plugins.html

B) Изучите параметр сервера --init-connect.

Например, вызвать хранимую процедуру, проверить значение user () / current_user (), и записать трассировку в журнал (вставить в таблицу), если было установлено соединение с пользователем.

См http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_init_connect

Это, вероятно, самая близкая вещь к триггеру соединения.

C) Использовать инструментарий схемы производительности.

Это предполагает 5,6.

Используйте таблицу performance_schema.setup_instrument, чтобы включить только инструментарий инструкций. Используйте таблицу performance_schema.setup_actors только для сеансов инструментов для этого пользователя.

Затем, после некоторого времени работы системы, посмотрите на активность для этого пользователя в следующих таблицах:

  • таблица performance_schema.users скажет, была ли вообще какая-то активность
  • таблица performance_schema.events_statements_history_long покажет последние выполненные запросы
  • таблица performance_schema.events_statements_summary_by_user покажет агрегированную статистику по каждому типу операторов (SELECT, INSERT, ...), выполненных этим пользователем.

Предполагая, что у вас есть пользователь, определенный как 'old_app' @ '%', вероятным последующим вопросом будет выяснение, откуда (с какого хоста (ов)) все еще подключается это старое приложение.

performance_schema.accounts будет просто показывать, что: если трафик для этого пользователя виден, он будет отображать каждое имя пользователя @ hostname источник трафика. Статистика также агрегирована по аккаунту, ищите таблицы "% _by_account%".

См http://dev.mysql.com/doc/refman/5.6/en/performance-schema.html

0 голосов
/ 15 апреля 2010

Есть и другие способы решения этой проблемы, например, использование MySQL proxy

В прокси вы можете делать интересные вещи - от регистрации до преобразования запросов, сопоставление с шаблоном (проверьте эту ссылку также для получения подробной информации о том, как тестировать / разрабатывать сценарии)

-- set the username
local log_user = 'username'

function read_query( packet )
    if proxy.connection.client.username == log_user and string.byte(packet) == proxy.COM_QUERY then
        local log_file = '/var/log/mysql-proxy/mysql-' .. log_user .. '.log'
        local fh = io.open(log_file, "a+")
        local query = string.sub(packet, 2)
        fh:write( string.format("%s %6d -- %s \n",
            os.date('%Y-%m-%d %H:%M:%S'),
            proxy.connection.server["thread_id"],
            query))
        fh:flush()
    end
end

Выше был проверен, и он делает то, что он должен (хотя это простой вариант, не регистрирует успех или неудачу и регистрирует только прокси.COM_QUERY, см. Список всех констант для посмотрите, что пропущено и настройте под свои нужды)

0 голосов
/ 08 февраля 2010

Да, запустить, но используйте любую систему, которая вам нужна, чтобы увидеть, какой пользователь (куки, сессия) регистрирует, только если конкретный пользователь (userID, класс) соответствует вашим учетным данным.

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