Как показать последние запросы, выполненные на MySQL?


471

Есть ли какой-либо запрос / способ показать последние запросы, выполненные на ВСЕХ серверах?

Ответы:


793

Для тех, кто благословлен MySQL> = 5.1.12, вы можете управлять этой опцией глобально во время выполнения:

  1. казнить SET GLOBAL log_output = 'TABLE';
  2. казнить SET GLOBAL general_log = 'ON';
  3. Посмотрите на стол mysql.general_log

Если вы предпочитаете выводить в файл вместо таблицы:

  1. SET GLOBAL log_output = "FILE"; по умолчанию .
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

Я предпочитаю этот метод для редактирования файлов .cnf, потому что:

  1. вы не редактируете my.cnfфайл и, возможно, постоянно включаете ведение журнала
  2. вы не ловите рыбу в файловой системе, ища журнал запросов - или, что еще хуже, отвлекаетесь на необходимость идеального места назначения. /var/log /var/data/log /opt /home/mysql_savior/var
  3. Вам не нужно перезагружать сервер и прерывать любые текущие соединения с ним.
  4. перезапуск сервера оставляет вас там, где вы начали (по умолчанию журнал все еще выключен)

Для получения дополнительной информации см. Справочное руководство по MySQL 5.1 - Системные переменные сервера - general_log


4
Отличный дизайн интерфейса. В любом случае, таблицы журналов MySQL на самом деле используют движок CSV, поэтому вы можете делать все, что FlipMcF сказал в ответе о включении входа в таблицу general_log, и иметь tail -f из general_log, например: tail -f / var / lib / mysql / mysql / general_log.CSV

2
черт возьми, документ MySQL для этого даже не стрелял в параметр таблицы. большое спасибо.
Абхишек Дуджари


6
не забудьте очистить свою общую таблицу журналов, когда вы закончите: "таблица усечений mysql.general_log"
pdwalker

1
Я получил результат таким образом, но параметры представлены знаком вопроса, например, выберите foo из бара, где x = ?. Как я могу получить полный запрос?
Okwap

43

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

Отредактируйте конфигурацию MySQL, например /etc/mysql/my.cnf - найдите или добавьте строку, подобную этой

[mysqld]
log = /var/log/mysql/mysql.log

Перезапустите mysql, чтобы получить это изменение, теперь вы можете

tail -f /var/log/mysql/mysql.log

Эй, Presto, вы можете наблюдать за запросами по мере их поступления.


4
general_log_file и general_log в моем my.cnf
Мартин Тома

Это работает, если вы хотите знать, перезапустите mysql askubuntu.com/questions/82374/how-do-i-start-stop-mysql-server
Kumar

1
В новых версиях Mac OS X (по крайней мере, в Mac OS X) требуются параметры general_log_file и general_log вместо просто «log =». В противном случае вы получите ошибку, подобную этой: ОШИБКА / usr / local / mysql / bin / mysqld: неоднозначная опция '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Джей Шет,

@JaySheth, я получил эту ошибку на Mariadb 10.2, поэтому я не уверен, что это связано только с Mac OS.
user10089632

16

Вы можете сделать текущую вещь для мониторинга журналов запросов MySQL.

Откройте файл конфигурации mysql my.cnf

sudo nano /etc/mysql/my.cnf

Найдите следующие строки под [mysqld]заголовком и раскомментируйте эти строки, чтобы включить журнал

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

Перезапустите сервер MySQL для отражения изменений

sudo service mysql start

Мониторинг лога сервера mysql с помощью следующей команды в терминале

tail -f /var/log/mysql/mysql.log


9

1) Если включено общее ведение журнала mysql, то мы можем проверить запросы в файле журнала или таблице на основе того, что мы упомянули в конфигурации. Проверьте, что включено с помощью следующей команды

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

Если нам нужна история запросов в таблице, то

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

Взгляните на таблицу mysql.general_log

Если вы предпочитаете выводить в файл:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) Мы также можем проверить запросы в файле .mysql_history cat ~ / .mysql_history



4

Если mysql binlog включен, вы можете проверить команды, запущенные пользователем, выполнив следующую команду в консоли Linux, перейдя в каталог mysql binlog

mysqlbinlog binlog.000001 >  /tmp/statements.sql

что позволяет

[mysqld]
log = /var/log/mysql/mysql.log

или общий журнал будет влиять на производительность MySQL


возможно, но больно. более полезно, если вы хотите посмотреть, что произошло в прошлом.
pdwalker

2

Если вы не хотите менять конфигурацию MySQL, вы можете использовать профилировщик SQL, например «Neor Profile SQL» http://www.profilesql.com .


2

Прочитав ответ Пола, я продолжал копать для получения дополнительной информации на https://dev.mysql.com/doc/refman/5.7/en/query-log.html

Я нашел действительно полезный код от человека. Вот краткое изложение контекста.

(Примечание: следующий код не мой)

Этот скрипт является примером для поддержания чистоты таблицы, который поможет вам уменьшить размер таблицы. Как и после дня, будет около 180 тыс. Запросов журнала. (в файле это будет 30 МБ в день)

Вам нужно добавить дополнительный столбец (event_unix), а затем вы можете использовать этот скрипт для поддержания чистоты журнала ... он обновит временную метку в Unix-timestamp, удалит журналы старше 1 дня и затем обновит event_time в Timestamp из event_unix ... звучит немного запутанно, но работает отлично.

Команды для нового столбца:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Скрипт очистки:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Кредит идет к Себастьяну Кайзеру (Оригинальный автор кода).

Надеюсь, кто-то найдет это полезным, как и я.


Интересно. Вы пропустите запросы во время очистки, если не заблокируете сначала все базы данных. Есть и другие проблемы, которые могут возникнуть здесь. Если мы находимся в точке «непрерывного» ведения журнала, я бы использовал ведение журнала файлов или журнал bin и готовый ротатор журнала.
FlipMcF

1

Вы можете посмотреть на следующее в Linux

cd /root

ls -al

vi .mysql_history Может помочь


6
Похоже, это будет работать только для официального клиента командной строки mysql и только для запросов, выполняемых пользователем root
golimar

Вопрос говорит «весь сервер», что делает этот ответ неверным. Это покажет все запросы, выполненные одним клиентом.
FlipMcF

Если mysql binlog включен, вы можете проверить команды, запущенные пользователем, выполнив следующую команду в консоли linux, перейдя в каталог mysql binlog mysqlbinlog binlog.000001> /tmp/statements.sql, включив [mysqld] log = / var / log / mysql / mysql.log или genral log будут влиять на производительность mysql
Avinash Singh

Некоторые записи в этом случае по умолчанию подавляются, например, строки, содержащие «пароль».
mckenzm
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.