Як показати останні запити, виконані на 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, і мати хвіст -f загального_log на зразок цього: tail -f / var / lib / mysql / mysql / general_log.CSV

2
чорт забирай, mysql doc для цього навіть не знімає параметр таблиці. дуже дякую.
Абхішек Дюджарі


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

1
Я отримав результат таким чином, але параметри представлені знаком питання, наприклад, виберіть foo з bar, де x = ?. Як я можу отримати повний запит?
okwap

43

Ви можете ввімкнути загальний журнал запитів для такої діагностики. Як правило, ви не реєструєте всі запити SELECT на виробничому сервері, але це вбивця продуктивності.

Відредагуйте конфігурацію MySQL, наприклад /etc/mysql/my.cnf - шукайте або додайте такий рядок

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

Перезапустіть mysql, щоб отримати цю зміну, тепер ви можете

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

Гей престо, ви можете дивитися запити, як вони надходять.


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.
користувач10089632

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

Якщо увімкнено binlog mysql , ви можете перевірити команди, виконані користувачем, виконавши наступну команду в консолі Linux, переглянувши каталог mysql binlog

mysqlbinlog binlog.000001 >  /tmp/statements.sql

сприяння

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

або загальний журнал матиме вплив на продуктивність mysql


можливо, але болісно. корисніше, якщо ви хочете подивитися, що сталося в минулому.
pdwalker


2

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

Я знайшов дійсно корисний код людиною. Ось підсумок контексту.

(Примітка. Наступний код не мій)

Цей сценарій є прикладом для збереження чистоти таблиці, що допоможе вам зменшити розмір таблиці. Як і через день, буде близько 180 тис. Запитів журналу. (у файлі це буде 30 Мб на день)

Вам потрібно додати додатковий стовпець (event_unix), і тоді ви можете використовувати цей скрипт, щоб журнал був чистим ... він оновить часову позначку в часову позначку Unix, видалить журнали, старші ніж на 1 день, а потім оновить подію_часу в 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';

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

Сподіваюся, хтось знайде це корисним, як і я.


Цікаво. Ви пропустите запити під час очищення, якщо ви не заблокували перший перший db. Тут можуть виникнути й інші питання. Якщо ми знаходимося в цій точці "безперервного" ведення журналу, я б використовував журнал файлів або журнал бін та ротатор журналу, що не знаходиться на полиці.
FlipMcF

1

Ви можете подивитися наступне в Linux

cd /root

ls -al

vi .mysql_history Це може допомогти


6
Схоже, це буде працювати лише для офіційного клієнта командного рядка mysql, і лише для запитів, виконаних кореневим користувачем
golimar

Питання говорить "весь сервер", що робить цю відповідь неправильною. Це показало б усі запити, виконані одним клієнтом.
FlipMcF

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

Деякі записи в цьому випадку за замовчуванням придушуються, наприклад, рядками, що містять "пароль".
mckenzm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.