Порой при работе приложений, работающих с бд, возникает падение производительности, в качестве одного из вариантов может быть убогий неоптимизированый запрос, выполняемый дольше чем планировалось. Для отслеживания данных запросов придумали Slow Query Log, состоит журнал из SQL выражений, времени начала запроса, общего времени выполнения, времени блокировки и прочей полезной информации.
Включать данный лог можно на ходу, не перезапуская сервер, единственное что необходимо – доступ на запись для процесса от имени которого будет создан лог-файл.
Логинимся... mysql -u root -p Устанавливаем месторасположение лог-файла mysql> SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log'; Определям что считать медленным запросом, по-умлочанию 10 секунд, с версии 5.1.21 можно выставить 0, что позволяет собирать все запросы mysql> SET GLOBAL long_query_time = 5; Ну и осталось включить mysql> SET GLOBAL slow_query_log = 'ON'; Еще можно включить логирование запросов неимеющих индексов mysql> SET GLOBAL log_queries_not_using_indexes = 'ON';
Данные значения будут сохранены до следующей перезагрузки mysql, если необходимо чтобы оно сохрянялось следует добавить в my.cnf
[mysqld] … slow_query_log = ON slow_query_log = /var/log/mysql/slow.log long_query_time = 5 log_queries_not_using_indexes = ON
Для того что бы узнать текущие значения:
mysql> SHOW GLOBAL VARIABLES LIKE 'slow\_%'; +------------------------------------+-------------------------+ | Variable_name | Value | +------------------------------------+-------------------------+ | slow_launch_time | 2 | | slow_query_log | ON | | slow_query_log_file | /var/log/mysql/slow.log | | slow_query_log_timestamp_always | OFF | | slow_query_log_timestamp_precision | second | | slow_query_log_use_global_control | | +------------------------------------+-------------------------+ mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 5.000000 | +-----------------+-----------+ mysql> SHOW GLOBAL VARIABLES LIKE 'log_queries_not_using_indexes'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | ON | +-------------------------------+-------+
Для более детального анализа лучше собирать все запросы, указывая long_query_time = 0, и желательно хотя бы за сутки, а после прогнать их через pt-query-digest из percona-toolkit, который приведет логи к более читаемому виду.
Источник: https://h1d3.org/posts/vkliuchenie-slow-query-log-bez-perezapuska-mysql.html
Leave a Reply