Як показати останні запити, виконані на 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.