На наших хостинговых серверах установлена утилита pt-kill, с помощью которой можно принудительно завершать медленные запросы MySQL и логировать их.
Основные опции
kill
- завершить запросы, подходящие под заданные параметры;
print
- вывести запросы, подходящие под заданные параметры;
busy-time
- длительность запроса;
interval
- как часто проверять наличие запросов, подходящих под заданные параметры (если interval не задан, значением по умолчанию будет половина busy-time);
run-time
- как долго работать pt-kill (если run-time не задан, pt-kill после запуска будет работать постоянно).
Примеры использования
- Завершить все запросы к базе с длительностью более 60 секунд:
pt-kill --busy-time 60 --kill --print --user 'база_данных' --password 'пароль_базы_данных'
- Вывести все запросы длительностью более 60 секунд (не завершая их):
pt-kill --busy-time 60 --print --user 'база_данных' --password 'пароль_базы_данных'
- Проверять наличие запросов, находящихся в состоянии ожидания, каждые 10 секунд и завершать их:
pt-kill --match-command Sleep --kill --victims all --interval 10 --user 'база_данных' --password 'пароль_базы_данных'
- Логировать все запросы длительностью более 60 секунд в файл logs.txt:
pt-kill --busy-time 60 --print --user 'база_данных' --password 'пароль_базы_данных' >> /путь/к/файлу/logs.txt
- Запустить pt-kill на 300 секунд и каждые 10 секунд завершать запросы длительностью более 60 секунд:
pt-kill --busy-time 60 --kill --interval 10 --run-time 300 --user 'база_данных' --password 'пароль_базы_данных'
Запуск pt-kill по cron
Утилиту pt-kill можно также запускать по расписанию с помощью cron.
Для этого необходимо:
- Создать файл скрипта с произвольным именем (например, pt-kill.sh) и сохранить его в необходимой директории аккаунта.
Добавить в файл нужную команду, например:
pt-kill --busy-time 300 --kill --interval 5 --run-time 30 --user 'база_данных' --password 'пароль_базы_данных' >> /путь/к/файлу/killed_queries.log
Добавить задачу cron, указав периодичность выполнения и путь до файла:
*/10 * * * * /bin/bash /home/u/user/pt-kill.sh # вместо u и user укажите первую букву логина и сам логин
Таким образом, pt-kill будет запускаться каждые 10 минут на 30 секунд, в течение этого времени каждые 5 секунд будет проверять и завершать запросы длительностью более 300 секунд, а также вести лог "убитых" запросов в файл killed_queries.log.
Задание также можно добавить через планировщик Crontab в ПУ:
Завершать процессы MySQL можно также с помощью mysqladmin.