Это, наверное, случалось с каждым — производительность MySQL на сайте внезапно сильно падала и вы не могли понять, по какой же причине это происходило.
Скорее всего, виною этому служат неоптимизированные запросы. Чтобы их увидеть, достаточно включить лог медленных запросов MySQL.
Чтобы включить лог медленных запросов, достаточно открыть конфигурационный файл MySQL my.cnf:
sudo nano /etc/mysql/my.cnf
и раскомменитровать/добавить там строки:
slow-query-log = 1 slow-query-log-file = /var/log/mysql/mysql-slow.log long_query_time = 3 log-queries-not-using-indexes
- в опции
slow_query_logуказывать путь к файлу, в котором будет храниться лог запросов - в опции
long_query_timeуказывать минимальное время выполнения запроса, после которого он считается медленным в секундах
Далее необходимо перезапустить MySQL-сервер:
/etc/init.d/mysql restart
Теперь в файл /var/log/mysql/mysql-slow.log начнут записываться медленные запросы, которые можно наблюдать в режиме реального времени при помощи утилиты tail:
tail -f /var/log/mysql/mysql-slow.log
Ротация логов
Со временем лог медленных запросов увеличиться и забьет собой всё свободное пространство.
Чтобы этого не произошло, необходимо cделать ежесуточную ротацию при помощи утилиты logrotate, которая сгруппирует логи по времени и сожмёт их архиватором, что значительно уменьшит конечный размер файлов журнала.
Для настройки logrotate добавьте в файл конфигурации /etc/logrotate.d/mysql-server следующий код:
/var/log/mysql/mysql-slow.log {
daily
rotate 7
missingok
create 640 mysql adm
compress
sharedscripts
postrotate
test -x /usr/bin/mysqladmin || exit 0
# If this fails, check debian.conf!
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
if [ -z "`$MYADMIN ping 2>/dev/null`" ]; then
# Really no mysqld or rather a missing debian-sys-maint user?
# If this occurs and is not an error please report a bug.
#if ps cax | grep -q mysqld; then
if killall -q -s0 -umysql mysqld; then
exit 1
fi
else
$MYADMIN flush-logs
fi
endscript
}
Анализ логов
Проанализировать полученные логи можно при помощи утилиты pt-query-digest из пакета percona-toolkit.
Устанавливаем пакет percona-toolkit:
sudo apt-get install percona-toolkit
После накопления достаточного для анализа количества запросов, можно использовать утилиту pt-query-digest:
pt-query-digest /var/log/mysql/mysql-slow.log
Можно также результат анализа сохранить в файл для последующего разбора полётов:
pt-query-digest /var/log/mysql/mysql-slow.log > slowlog.txt
Источник: https://www.kobzarev.com/linux/mysql-slow-query-log/