Як увімкнути журнал запитів MySQL?


252

Як увімкнути функцію MySQL, яка записує кожне повідомлення запиту SQL, отримане від клієнтів, і час подання заяви запиту? Чи можу я це зробити в phpmyadmin або NaviCat? Як я аналізую журнал?

Відповіді:


301

По-перше, пам’ятайте, що цей лог-файл може зростати дуже багато на зайнятому сервері.

Для mysql <5.1.29:

Щоб включити журнал запитів, помістити це в /etc/my.cnfв [mysqld]розділі

log   = /path/to/query.log  #works for mysql < 5.1.29

Також ввімкнути це з консолі MySQL

SET general_log = 1;

Дивіться http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Для mysql 5.1.29+

У програмі mysql 5.1.29++ ця logопція застаріла. Щоб вказати файл журналу та увімкнути ведення журналу, використовуйте це в my.cnf у [mysqld]розділі:

general_log_file = /path/to/query.log
general_log      = 1

Крім того, щоб увімкнути ведення журналу з консолі MySQL (також потрібно якось вказати розташування файлу журналу або знайти розташування за замовчуванням):

SET global general_log = 1;

Також зауважте, що є додаткові опції для реєстрації лише повільних запитів або тих, які не використовують індекси.


1
Це не працює в MySQL 5.6.19. Вони знову змінили?
Alex R

5
general_log = on general_log_file = / шлях / до / query.log працював на мене
Кірен Сіва

27
Це працювало для мене (MySQL 5.6.12 для Windows):SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
Youen

Переконайтесь, що дозволи доступу користувача mysql до файлу журналу, або він поверне помилку "не знайдено" під час встановлення параметра general_log на консолі MySQL
Буде Р.

За 5.6.22 @youen це зрозуміло правильно. Дякую! Єдине, що потрібно переконатись - це те, що каталог та файл, який записуються, існує та пишеться mysql
NightOwlPrgmr

189

Подивіться на цю відповідь на інше пов’язане питання. Він показує, як увімкнути, вимкнути та побачити журнали на живих серверах без перезавантаження.

Введіть усі запити в mysql


Ось підсумок:

Якщо ви не хочете або не можете перезапустити сервер MySQL, ви можете продовжити так на своєму запущеному сервері:

  • Створіть таблиці журналів (див. Відповідь )

  • Увімкнути ведення журналу запитів у базі даних (зауважте, що рядок 'table' слід ставити буквально, а не замінювати жодним іменем таблиці. Дякую Ніколасу Пікерінгу )

SET global general_log = 1;
SET global log_output = 'table';
  • Переглянути журнал
select * from mysql.general_log;
  • Вимкнути журнал запитів у базі даних
SET global general_log = 0;

18
Слід зазначити, що "таблиця" має бути введена буквально, а не замінена назвою таблиці у вашій базі даних.
Микола Пікерінг

1
У Mac OS X інсталятор програмного забезпечення MySQL, схоже, автоматично створив таблицю General_log з типом CSV. Це означає, що я також можу підписати відповідний файл CSV: sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth

Після установки глобального log_output = 'таблиця'; повільний запит буде записом у файл? Я думаю, що після SET global_log = 0; ви повинні встановити попереднє значення "log_output", воно може бути "FILE"
user2602807

59

Цей метод я використовую для ведення журналу, коли хочу швидко оптимізувати різні завантаження сторінки. Це невелика порада ...

Вхід до таблиці

SET global general_log = 1;
SET global log_output = 'table';

Потім ви можете вибрати з моєї mysql.general_logтаблиці, щоб отримати останні запити.

Тоді я можу зробити щось подібне tail -fна mysql.log, але з більшою доробкою ...

select * from mysql.general_log 
where  event_time  > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> "" 
and argument <> "SET NAMES 'UTF8'"  and argument <> "SHOW STATUS"  
and command_type = "Query"  and argument <> "SET PROFILING=1"

Це дозволяє легко бачити мої запити, які я можу спробувати і скоротити. Я використовую 8-секундний інтервал для отримання запитів, виконаних протягом останніх 8 секунд.


57

Це вже було в коментарі, але заслуговує на власну відповідь: Без редагування файлів конфігурації: в mysql як root виконайте

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;

Не забудьте вимкнути його згодом:

SET global general_log = off;

1
Я виявив, що під Linux systemd, якщо ви спробуєте увійти до файлу /tmp/, це може виявитися десь на зразок/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley

14

Ви можете відключити або включити загальний журнал запитів (який записує всі запити) за допомогою

SET GLOBAL general_log = 1 # (or 0 to disable)

У моєму випадку загальний журнал запитів не може бути включений на спільних хостинг-серверах. У мене може бути увімкнено лише повільний журнал запитів, і системні адміністратори можуть надати запити, пов’язані з моїм обліковим записом, на запит.
Feng-Chun Ting

9

Я також хотів увімкнути файл журналу MySQL для перегляду запитів, і я вирішив це за допомогою наведених нижче інструкцій

  1. Йти до /etc/mysql/mysql.conf.d
  2. відкрити mysqld.cnf

і ввімкніть наступні рядки

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. перезапустіть MySQL за допомогою цієї команди /etc/init.d/mysql restart
  2. перейти /var/log/mysql/і перевірити журнали

Це нормально зберігати ці налаштування у конф-файлі, щоб застосовувати їх щоразу, коли MySQL запускається, але вам не потрібно перезапускати MySQL, щоб застосувати цю конфігурацію. Ви можете встановити його за допомогою "SET global", як казали інші.
Ангел


3

У Windows можна просто перейти

C:\wamp\bin\mysql\mysql5.1.53\my.ini

Вставте цей рядок у my.ini

general_log_file = c:/wamp/logs/mysql_query_log.log

Файл my.ini нарешті виглядає приблизно так

...
...
...    
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.53
log = c:/wamp/logs/mysql_query_log.log        #dump query logs in this file
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.53/data
...
...
...
...

3

У MySQL 5.6 версія є помилка. Навіть mysqld показують як:

    Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf 

Реально налаштування читаються в наступному порядку:

    Default options are read from the following files in the given order:
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf

Перевірте файл: "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini"

Сподіваюся, це допоможе комусь.


Чи є десь звіт про помилку для цієї помилки?
mwfearnley

1

для mysql> = 5,5 лише для повільних запитів (1 секунда і більше) my.cfg

[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes

1
Це невірно - це дозволяє увімкнути повільний журнал запитів, а не журнал запитів.
Сем Дуфель

Я думаю, що ти повинен використовувати тире.
AFA Med

1

Щоб увімкнути журнал запитів у MAC Machine:

Відкрийте такий файл:

vi /private/etc/my.cnf

Встановіть URL журналу запитів у розділі "mysqld" таким чином:

[mysqld]

general_log_file=/Users/kumanan/Documents/mysql_query.log

Мало хто не записує запит належним чином, тож у цьому випадку ви можете ввімкнути його з консолі MySQL

mysql> SET global general_log = 1;

1

Не зовсім відповідь на питання, тому що на питання вже є чудові відповіді. Це побічна інформація. Увімкнення General_log дійсно поставило зубчик для продуктивності MySQL. Я general_log =1випадково залишився на виробничому сервері і витратив години, з'ясовуючи, чому продуктивність не порівнянна з аналогічною установкою на інших серверах. Потім я знайшов це, що пояснює вплив включення загального журналу. http://www.fromdual.com/general_query_log_vs_mysql_performance .

Суть історії, не вкладайте general_log=1у .cnfфайл. Замість цього скористайтеся set global general_log =1ненадовго, щоб просто увійти, щоб дізнатися, що ви намагаєтесь дізнатись, а потім вимкніть це.


0

У phpMyAdmin 4.0 ви переходите до стану> Монітор. Там ви можете увімкнути журнал повільних запитів і загальний журнал, побачити монітор, вибрати частину графіка, побачити відповідні запити та проаналізувати їх.


0

Мені довелося в один момент скинути і відтворити загальний журнал. Під час відпочинку набори персонажів зіпсувались, і я виявив помилку в журналах:

[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'

Тож якщо стандартна відповідь "перевірити, щоб переконатися, що реєстрація увімкнена" не працює для вас, переконайтеся, що для ваших полів встановлено правильний набір символів.

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