6 votes

Suppression en masse ou en vrac des requêtes MySQL qui se comportent mal

Comment tuer une masse de requêtes MySQL ? Voici une bonne approche :

mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root' INTO OUTFILE '/tmp/a.txt';
mysql> source /tmp/a.txt;

Y a-t-il d'autres solutions que de les cliquer à mort dans l'interface graphique de l'administrateur MySQL ?

6voto

Jared Points 762

Pour reprendre les meilleurs commentaires de L'avis de Percona à ce sujet :

Commentaire 4 : Robert Wultsch

Je préfère ce qui suit car cela les tuera de manière multi-filière (parfois tuer une seule requête peut prendre un certain temps).

for i in $(mysql -uroot -pPASS -e 'show processlist' | grep 'search_term' | awk '{print $1}') ; do

mysql -uroot -pPASS -e "kill $i" &

fait

Commentaire 8 : Shlomi Noach

Un site Procédure stockée INFORMATION_SCHEMA.PROCESSLIST qui est un peu verbeux à copier.

Commentaire 16 : Bryan

Si information_schema.processlist n'existe pas sur votre version de MySQL, cela fonctionne dans un script 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

Commentaire 21 : Andrew Watson

Je fais ça :

mysqladmin proc | grep Sleep | sort -r -n -k6 | awk {'print $1;'} | xargs mysqladmin kill

ou quelque chose dans ce sens


Comme Dan C mentionne dans sa réponse à cette question En effet, l'élagage des SELECTS est nettement plus sûr que la suppression des commandes d'écriture au milieu du flux, car vous risquez de perdre l'intégrité des données et/ou les clés étrangères.

2voto

Dan Carley Points 24959

Une solution alternative consiste à utiliser une approche qui Digg décrit Il s'agit d'élaguer automatiquement toutes les requêtes SELECT dont le temps de traitement est supérieur à une période donnée. En règle générale, vous ne souhaitez élaguer que les requêtes SELECT, car elles sont en lecture seule et ne devraient pas affecter l'intégrité des données de votre application.

Deux utilitaires de ce type peuvent être utilisés pour automatiser cette opération. dbmon.pl et mkill qui fait partie d'un paquet appelé mtop .

0voto

Fedir RYKHTIK Points 577

Je l'ai utilisé pour tuer toutes les requêtes dormantes sur le serveur de base de données MySQL 5.5 :

mysql -e "show full processlist;" -ss | grep Sleep | awk '{print "KILL "$1";"}' | mysql

0voto

Zafar Points 241

Le plus simple est de les tuer depuis le Shell, e.g.

mysqladmin proc | grep Sleep | awk '{print $2}' | xargs -L1 mysqladmin kill 

Si le problème persiste, vérifiez les détails en effectuant la requête suivante :

mysql -e "SHOW engine innodb status\G"

A partir de MySQL, essayez le code suivant basé sur le post de @Shlomi vous pouvez créer une procédure stockée en utilisant le curseur du serveur, par exemple :

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 ;

Il y a aussi un vieux script appelé mypgrep.py par Google.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X