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

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

16 ответов

Решение

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

Для 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;

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

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

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


Вот резюме:

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

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

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

SET global general_log = 1;
SET global log_output = 'table';
  • Посмотреть журнал
select * from mysql.general_log;
  • Отключить ведение журнала запросов в базе данных
SET global general_log = 0;

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

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

Не забудьте потом выключить его.

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

Вход в СТОЛ

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 секунд.

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

SET GLOBAL general_log = 1 # (or 0 to disable)
// 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; 

Я также хотел включить файл журнала 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/ и проверьте логи

В 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
...
...
...
...

В версии 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"

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

Для 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

Чтобы включить журнал запросов в 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;

Вы можете встретить набор шестнадцатеричных значений, например этот (столбец аргументов):

      mysql> select * from mysql.general_log LIMIT 1\G
*************************** 1. row ***************************
  event_time: 2023-01-27 13:37:20.950778
   user_host: root[root] @ localhost []
   thread_id: 1434
   server_id: 1
command_type: Query
    argument: 0x73656C656374202A2066726F6D207573657273
1 row in set (0.00 sec)

поэтому, чтобы сделать его читаемым, просто используйте:

      select a.*, convert(a.argument using utf8) from mysql.general_log a;

И возврат примерно такой:

      mysql> select a.*, convert(a.argument using utf8) from mysql.general_log a LIMIT 1\G
*************************** 1. row ***************************
                    event_time: 2023-01-27 13:37:20.950778
                     user_host: root[root] @ localhost []
                     thread_id: 1434
                     server_id: 1
                  command_type: Query
                      argument: 0x73656C656374202A2066726F6D207573657273
convert(a.argument using utf8): select * from users
1 row in set, 1 warning (0.00 sec)

пс: я использовалLIMIT 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 на короткое время просто войти в систему достаточно, чтобы выяснить, что вы пытаетесь выяснить, а затем выключите его.

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

[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'

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

Моя ОС Win10, версия сервера MySQL - 5.7

Путь к my.ini

      C:\ProgramData\MySQL\MySQL Server 5.7\my.ini

Просто добавьте в файл my.ini

      general_log_file        = C:/ProgramData/MySQL/MySQL Server 5.7/mysql.log
general_log             = 1

В phpMyAdmin 4.0 вы идете в Статус> Монитор. Там вы можете включить медленный журнал запросов и общий журнал, посмотреть текущий монитор, выбрать часть графика, посмотреть связанные запросы и проанализировать их.

Другие вопросы по тегам