mysql общий журнал запросов для конкретной базы данных или пользователя?
Есть ли способ просто регистрировать запросы для определенного пользователя или базы данных? Я знаю, что вы можете установить общий журнал, но я не хочу регистрировать все запросы по всему экземпляру MySQL. Скорее я хотел бы только регистрировать запросы к определенной базе данных.
SET GLOBAL general_log = 'ON';
Есть ли не GLOBAL параметр, который можно установить?
2 ответа
В MySQL нет способа сделать это, но вы можете создать общий файл журнала для конкретной базы данных. Если вы собираетесь использовать pt-query-digest, вы также можете фильтровать запросы для выбранной базы данных.
Я достиг этого, используя ведение журнала таблицы и задание cron, чтобы скопировать записи из таблицы general_log в мою таблицу журналов для конкретной базы данных, а затем обрезать таблицу general_log. Таким образом, он должен регистрировать каждый запрос, но вы можете изолировать вашу базу данных, и таблица будет только увеличиваться в размере, необходимом для регистрации запросов к вашей базе данных (плюс, тем не менее, многие запросы выполняются между выполнениями задания cron).
Это процедура, которую я использовал (для базы данных с именем db):
set global general_log = 'OFF';
alter table mysql.general_log ENGINE = MyISAM;
show create table mysql.general_log;
-- create a new table mysql.db_log using the above schema
-- i.e. just replace the table name.
set global log_output = 'TABLE';
set global general_log = 'ON';
Работа cron выглядит так:
mysql -e "insert into mysql.db_log select * from mysql.general_log where user_host like '%[db]%"
mysql -e "truncate mysql.general_log"
Настройте условие where так, чтобы оно соответствовало всем журналам, которые вы хотите сохранить: база данных, пользователь, ip, имя таблицы и т. Д.
Вы можете использовать pt-query-digest, где имя базы данных - это имя вашей базы данных.
pt-query-digest --filter '($event->{db} || "") =~ m/databasename/' /var/lib/mysql/mysql-slow.log > /var/tmp/slow-result.log