Массовое или массовое убийство неправильно работающих запросов MySQL
Как вы убиваете массу запросов MySQL? Вот хороший подход:
mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root' INTO OUTFILE '/tmp/a.txt';
mysql> source /tmp/a.txt;
Любые другие, кроме того, что щелкают ими до смерти в графическом интерфейсе администратора MySQL?
4 ответа
Чтобы получить лучшие комментарии от Перконы, сделайте следующее:
Я предпочитаю следующее, так как это убьет их многопоточным способом... (иногда уничтожение одного запроса может занять некоторое время)
для i in $(mysql -uroot -pPASS -e 'показать список процессов' | grep 'search_term' | awk '{print $1}'); делать
mysql -uroot -pPASS -e "kill $ i" &
сделанный
Хранимая процедура INFORMATION_SCHEMA.PROCESSLIST, которая немного подробна для копирования.
Если information_schema.processlist не существует в вашей версии MySQL, это работает в сценарии Linux:
#! / Bin/ Баш для каждого в `mysqladmin -u root -prootpwd processlist | AWK '{print $2, $4, $8}' | grep $dbname | grep $dbuser | awk '{print $1}' `; do mysqladmin -u root -prootpwd kill $ each; сделанный
Я сделаю это:
mysqladmin proc | grep Sleep | сортировка -r -n -k6 | awk {'print $1; '} | xargs mysqladmin kill
Или что-то в этом роде…
Как упоминает Дэн С. в своем ответе на этот вопрос, удаление SELECTS значительно безопаснее, чем уничтожение команд записи в середине потока, поскольку вы можете потерять целостность данных и / или внешние ключи.
Альтернативное решение заключается в использовании подхода, описанного Digg, который заключается в автоматическом сокращении любых запросов SELECT, выполнение которых занимает больше времени, чем выделенный период времени. Вообще говоря, вы хотите удалять только запросы SELECT, потому что они предназначены только для чтения и не должны влиять на целостность данных вашего приложения.
Двумя такими утилитами, которые вы можете использовать для автоматизации, являются dbmon.pl и mkill, которые являются частью пакета с именем mtop.
Я использовал его, чтобы убить все спящие запросы на сервере базы данных MySQL 5.5:
mysql -e "show full processlist;" -ss | grep Sleep | awk '{print "KILL "$1";"}' | mysql
Самый простой - убить их из скорлупы, например
mysqladmin proc | grep Sleep | awk '{print $2}' | xargs -L1 mysqladmin kill
Если проблема не устранена, проверьте детали по следующему запросу:
mysql -e "SHOW engine innodb status\G"
Из MySQL попробуйте следующий код, основанный на публикации @Shlomi, вы можете создать хранимую процедуру, используя серверный курсор, например:
DELIMITER $$
DROP PROCEDURE IF EXISTS test.kill_user_queries$$
CREATE PROCEDURE test.kill_user_queries (kill_user_name VARCHAR(16) CHARSET utf8)
SQL SECURITY INVOKER
BEGIN
DECLARE query_id INT;
DECLARE iteration_complete INT DEFAULT 0;
DECLARE select_cursor CURSOR FOR SELECT id FROM INFORMATION_SCHEMA.PROCESSLIST WHERE user=kill_user_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET iteration_complete=1;
OPEN select_cursor;
cursor_loop: LOOP
FETCH select_cursor INTO query_id;
IF iteration_complete THEN
LEAVE cursor_loop;
END IF;
KILL QUERY query_id;
END LOOP;
CLOSE select_cursor;
END$$
DELIMITER ;
Существует также старый скрипт mypgrep.py
от Google.