Как включить MySQL Query Log?

252

Как включить функцию MySQL, которая регистрирует каждый оператор SQL-запроса, полученный от клиентов, и время отправки этого запроса? Могу ли я сделать это в phpmyadmin или NaviCat? Как мне проанализировать журнал?

Фен-Чун Тин
источник

Ответы:

302

Во-первых, помните, что этот файл журнала может быть очень большим на занятом сервере.

Для 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. Они изменили это снова?
Алекс Р
5
general_log = на 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 есть права доступа к файлу журнала или он вернет ошибку «not found» при установке параметра general_log в консоли MySQL
Will R.
Для 5.6.22 @ ты правильно понял. Спасибо! Единственное, что нужно сделать, это убедиться, что каталог и файл, в которые производится запись, существуют и доступны для записи в mysql.
NightOwlPrgmr
190

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

Войти все запросы в MySQL


Вот резюме:

Если вы не хотите или не можете перезапустить сервер MySQL, вы можете продолжить на своем работающем сервере следующим образом:

  • Создайте свои журнальные таблицы (см. Ответ )

  • Включите ведение журнала запросов в базе данных (обратите внимание, что строка 'таблица' должна быть помещена буквально, а не заменена каким-либо именем таблицы. Спасибо Николас Пикеринг )

SET global general_log = 1;
SET global log_output = 'table';
  • Посмотреть журнал
select * from mysql.general_log;
  • Отключить ведение журнала запросов в базе данных
SET global general_log = 0;
Александр Маркондес
источник
19
Следует отметить, что «таблица» должна вводиться буквально, а не заменяться именем таблицы в вашей базе данных.
Николас Пикеринг
1
В Mac OS X установщик программного обеспечения MySQL, похоже, автоматически создал таблицу general_log с типом CSV. Это означает, что я также могу привязать соответствующий CSV-файл: sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Джей Шет,
После установки глобального log_output = 'table'; медленный запрос будет записывать в файл? Я думаю после SET global general_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 секунд.

Layke
источник
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;
commonpike
источник
1
Я обнаружил, что под Linux systemd, если вы попытаетесь войти в файл /tmp/, он может оказаться где-то вроде/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley
15

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

SET GLOBAL general_log = 1 # (or 0 to disable)
Джон
источник
В моем случае общий журнал запросов нельзя включить на серверах общего хостинга. Я могу включить только медленный журнал запросов, и системные администраторы могут предоставить записи, связанные с моей учетной записью, по запросу.
Фэн-Чун Тинг
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/и проверить журналы
Shrikant
источник
Можно сохранить эти настройки в файле conf, чтобы применять их каждый раз при запуске MySQL, но вам не нужно перезапускать MySQL, чтобы применить эту конфигурацию. Вы можете установить его, используя «SET global», как говорили другие.
Ангел
6
// To see global variable is enabled or not and location of query log    
SHOW VARIABLES like 'general%';
// Set query log on 
SET GLOBAL general_log = ON; 
Самир Кумар Чоудхари
источник
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
...
...
...
...
HimalayanCoder
источник
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»

Надеюсь, это поможет кому-нибудь.

croonx
источник
Есть ли где-нибудь отчет об ошибке для этой ошибки?
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
lptn
источник
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;
Kumanan
источник
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'

Так что, если стандартный ответ «проверить, чтобы убедиться, что регистрация включена» не работает, проверьте, чтобы убедиться, что ваши поля имеют правильный набор символов.

Уильям Нили
источник