Назад | Перейти на главную страницу

Массовое или массовое уничтожение некорректных запросов 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?

Чтобы собрать лучшие комментарии от Percona понимает это:

Комментарий 4: Роберт Вульч

Я предпочитаю следующее, так как это убьет их в многопоточном режиме… (иногда удаление одного запроса может занять некоторое время)

для i в $ (mysql -uroot -pPASS -e ’show processlist’ | grep ’search_term’ | awk ‘{print $ 1}’); делать

mysql -uroot -pPASS -e «убить $ i» &

сделано

Комментарий 8: Шломи Ноах

An INFORMATION_SCHEMA.PROCESSLIST хранимая процедура что немного многословно для копирования.

Комментарий 16: Брайан

Если information_schema.processlist не существует в вашей версии MySQL, это работает в сценарии linux:

#!/bin/bash

for each in `mysqladmin -u root -prootpwd processlist | awk 
‘{print $2, $4, $8}’ | grep $dbname | grep $dbuser | awk ‘{print $1}’`;

do mysqladmin -u root -prootpwd kill $each;

done

Комментарий 21: Эндрю Ватсон

Я сделаю это:

mysqladmin proc | grep Sleep | sort -r -n -k6 | awk {’print $ 1; ‘} | xargs mysqladmin убить

Или что-то в этом роде…


Так как Дэн Си упоминает в своем ответе на этот вопрос, сокращение 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.