Задавайте вопросы, мы ответим
Вы не зашли.
Стоит не тривиальная задача логировать только запросы изменяющие базу данных сделанные только администраторами через консоль или через программы администрирования баз данных. Запросы сделанные движком сайта логировать не нужно.
1) Запросы изменяющие базу данных логируются в binary_log – это не подходит потому что там не пишется ip-адрес клиента. Есть ли способ писать в этот лог ip-адрес клиента?
2) Все запросы логировать в general log. Если логировать в таблицу я вижу ip-адрес клиента в квадратных скобках и это рабочий способ выполнить задачу, однако очень накладный по ресурсам.
general_log в таблицу написал:
2019-01-04 11:29:47 user[user] @ localhost [127.0.0.1] 1 0 Query select * from db.acq_rss
Если писать в файл, то в логах отсутствует информация по ip-адресу клиента.
general_log в файл написал:
190104 11:29:38 1 Connect user@localhost on
190104 11:29:47 1 Query select * from db.acq_rss
Есть ли способ писать в файл ip-адрес клиента?
3) Триггер на изменение каждой таблицы, информацию берем из information_schema.processlist, там в колонке host запросы пришедшие от администратора имеют вид localhost:порт. Это тоже рабочий способ. Но насколько я понимаю нельзя сделать один триггер на все таблицы или один тригер на таблицу processlist? Тоесть на 200 таблиц будет х 3 триггеров. Конечно текст самих триггеров можно сгенерировать скриптом, далее подумать об автоматизации при деплои. Но 600 триггеров это как то многовато.
4) Собственный лог на основе processlist. Создаем Daemon который очень часто делает запрос select * from processlist, отделяет нужное и пишет в таблицу лога. Но опять же, ресурсы на такое количество select и главное где гарантия что в промежутке между запросами не проскочит какой нибудь важный запрос. Есть ли способ потоком отслеживать изменения processlist?
Сервер AWS Linux база MySQL.
Отредактированно Settler (07.01.2019 07:19:53)
Неактивен
log-slow-queries
long_query_time=0
log_output="FILE"
slow query log в файл написал написал:
# User@Host: root[root] @ localhost [127.0.0.1]
Неактивен
Скорее всего, честный адрес вы никак не залогируете. В лог MySQL всё равно пишет имя пользователя, а не IP (т.е., если у Вас будет учетная запись вида username@'%', там будет % вместо IP; если нужен честный адрес, то нужно будет делать учетные записи для каждого возможного адреса).
Подозреваю, что ваши администраторы ходят под администраторскими учетными записями, а тогда вам подойдет general log / slow query log / audit log (но записей всё равно будет много, их нужно будет фильтровать).
Неактивен
Спасибо за варианты.
Неактивен