Бег:
Сервер Ubuntu 10.04
MySQL 5.1.41
У меня в /etc/mysql/my.cnf следующее
slow_query_log = 1
slow_query_log_file = /var/log/mysqld/log-slow-queries.log
long_query_time = 1
файл журнала должен быть доступен для записи
drwxrwxrwx 2 mysql mysql 4096 2010-10-20 13:41 mysqld
-rwxrwxrwx 1 mysql mysql 0 2010-10-20 13:41 log-slow-queries.log
Ничего не отображается в журнале или в таблице mysql.slow_log. Похоже, он включен
mysql> show variables like '%SLOW%';
+---------------------+--------------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------------+
| log_slow_queries | ON |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /var/log/mysqld/log-slow-queries.log |
+---------------------+--------------------------------------+
4 rows in set (0.00 sec)
Означает ли это, что у меня нет медленных запросов? Я пробовал бежать select sleep(3);
но этого не видно.
Могу ли я выполнить запрос, который отобразится в журнале, если все настроено правильно?
Возможно, mysql ведет журнал в таблице. Попробуйте бежать
select * from mysql.slow_log;
Журнал медленных запросов состоит из всех операторов SQL, выполнение которых заняло более long_query_time секунд и (начиная с MySQL 5.1.21) требовало проверки не менее min_examined_row_limit строк.
http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html
Какой ваш min_examined_row_limit
установлен в?
Самый простой способ создать длительный запрос - использовать декартово соединение для достаточного количества таблиц, чтобы создать большой беспорядок. Создайте тестовую таблицу (или найдите существующую), содержащую около 50 записей. Тогда беги
SELECT t4.* FROM testtable t1, testtable t2, testtable t3, testtable t4, testtable t5 limit 312499999,1;
который будет сидеть в течение долгого времени, затем распечатайте запись из testtable и сообщение типа «1 строка в наборе (1 мин 31,45 сек)». Предел / смещение заключается в том, чтобы заставить сервер вычислить первые 312499999 строк, но показать вам только одну строку, а не все 312500000 строк (50 ^ 5), потому что, вероятно, потребуется несколько дней, чтобы распечатать такое количество строк данных.
Если у вас нет ровно 50 строк, установите смещение на count (*) ^ (количество объединений) -1. Не делайте этого с активно используемым сервером (или используйте меньшее количество строк, чтобы все закончилось за несколько секунд, вместо того, чтобы перегружать сервер на полторы минуты)
У меня такая же проблема. Решил, прочитав это: https://stackoverflow.com/a/11861305/686304
Чтобы включить ведение журнала медленных запросов, сначала необходимо включить общее ведение журнала.
Просто установите для 'general_log' значение 'ON' (в my.cnf)
general_log = 1
@David, он регистрирует в реальном времени, но не включает время для захвата блокировок таблицы.
Как указал @Bryan, запрос должен проверить определенное количество строк, чтобы быть зарегистрированным. Я предполагаю, что поэтому sleep (3) не был зарегистрирован.
Конфигурация выглядит правильной. Вы выбрали нужный файл? Я видел, что у вас есть «mysqld» в том же каталоге, что и «/var/log/mysqld/log-slow-queries.log». Кстати, лог-файл не должен иметь разрешения как «777» :)
Мне интересно посмотреть, как будет решена проблема.
Недавно я столкнулся с подобной проблемой - MySQL 5.6 на RDS. Покопавшись на некоторое время в конфиге, чтобы убедиться, что он попадает в нужное место, я заметил в журналах ошибок следующую ошибку:
23780 [ERROR] Could not open /rdsdbdata/log/slowquery/mysql-slowquery.log for logging (error 2). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.
Поэтому, если ничего не отображается, убедитесь, что MySQL может записывать в медленный журнал и не обнаружил ошибку, которая заставила его полностью отключить ведение журнала.