141 votes

Comment puis-je tuer tous les processus dans Mysql "show processlist" ?

Parce que je vois beaucoup de processus ici, et la colonne "temps" montre de grandes valeurs pour chacun d'entre eux.

0 votes

Vous pouvez également redémarrer mysqld, par exemple, sudo service mysqld restart

241voto

Angelin Nadar Points 2289

Massacre de masse L'opération permet de gagner du temps. Faites-le dans MySql même :

Exécutez ces commandes

mysql> select concat('KILL ',id,';') from information_schema.processlist
where user='root' and time > 200 into outfile '/tmp/a.txt';

mysql> source /tmp/a.txt;

Référence

---------edit------------

si vous ne voulez pas stocker dans un fichier, stockez dans une variable

Il suffit d'exécuter dans votre invite de commande

> out1=$(mysql -B test -uroot -proot --disable-column-names  -e "select concat('KILL ',id,';') from information_schema.processlist where user='root' and time > 200;")

> out2= $(mysql -B test -uroot -proot --disable-column-names  -e "$out1")

13 votes

N'oubliez pas de vous référer à la source : mysqlperformanceblog.com/2009/05/21/

2 votes

@ArtemGoutsoul mais je ne me souviens pas avoir fait référence à ce site. C'est ma propre tendance à faire ça.

0 votes

@JanusTroelsen mais ma réponse est après 3 ans '12

113voto

Michal Čihař Points 3981

Vous devez les tuer un par un, MySQL n'a pas de commande kill massive. Vous pouvez script cela dans n'importe quel langage, par exemple en PHP vous pouvez utiliser quelque chose comme :

$result = mysql_query("SHOW FULL PROCESSLIST");
while ($row=mysql_fetch_array($result)) {
  $process_id=$row["Id"];
  if ($row["Time"] > 200 ) {
    $sql="KILL $process_id";
    mysql_query($sql);
  }
}

0 votes

C'est une bonne idée. Je vais essayer de convertir ça en un shell script sur un cron... !

5 votes

Shell for i in {994..1145}; do mysql -uroot -p123456 -e "kill $i" ; done

0 votes

Mysql -u -p -e "show processlist ;" | grep Sleep | awk '{print $1}' | while read LINE ; do mysql -u -p -e "kill $LINE" ; done

16voto

m8t Points 129

J'ai également cherché comment analyser la commande SHOW PROCESSLIST dans MySQL et j'ai abouti à une ligne unique dans un shell :

mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
  • mysqladmin processlist imprimera un tableau avec les identifiants des threads ;
  • awk n'analysera de la deuxième colonne que les numéros (identifiants des threads) et générera les commandes MySQL KILL ;
  • et enfin le dernier appel à mysql exécutera les commandes passées.

Vous pouvez exécuter grep avant le awk pour filtrer un nom de base de données particulier.

6voto

mikesl Points 983

Si vous n'avez pas d'information_schema :

mysql -e "show full processlist" | cut -f1 | sed -e 's/^/kill /' | sed -e 's/$/;/' ;  > /tmp/kill.txt
mysql> . /tmp/kill.txt

0 votes

Je crois que la deuxième ligne devrait être mysql < /tmp/kill.txt . Et je pense que dans la plupart des cas, vous trouverez que vous devez spécifier l'utilisateur et le mot de passe pour exécuter la commande mysql, donc ce sera mysql -u root -p < /tmp/kill.txt

1voto

Suresh Kamrushi Points 4371

Connectez-vous à Mysql en tant qu'administrateur :

 mysql -uroot -ppassword;

Et ensuite lancer la commande :

mysql> show processlist;

Vous obtiendrez quelque chose comme ci-dessous :

+----+-------------+--------------------+----------+---------+------+-------+------------------+
| Id | User        | Host               | db       | Command | Time | State | Info             |
+----+-------------+--------------------+----------+---------+------+-------+------------------+
| 49 | application | 192.168.44.1:51718 | XXXXXXXX | Sleep   |  183 |       | NULL             ||
| 55 | application | 192.168.44.1:51769 | XXXXXXXX | Sleep   |  148 |       | NULL             |
| 56 | application | 192.168.44.1:51770 | XXXXXXXX | Sleep   |  148 |       | NULL             |
| 57 | application | 192.168.44.1:51771 | XXXXXXXX | Sleep   |  148 |       | NULL             |
| 58 | application | 192.168.44.1:51968 | XXXXXXXX | Sleep   |   11 |       | NULL             |
| 59 | root        | localhost          | NULL     | Query   |    0 | NULL  | show processlist |
+----+-------------+--------------------+----------+---------+------+-------+------------------+

Vous verrez les détails complets des différentes connexions. Maintenant vous pouvez tuer la connexion en sommeil comme ci-dessous :

mysql> kill 52;
Query OK, 0 rows affected (0.00 sec)

24 votes

Ce n'est pas la réponse à la question. Ici, vous tuez un seul processus alors que la question est de savoir comment tuer un processus en une seule fois.

0 votes

@badbod99 J'ai atterri ici en cherchant comment tuer un processus mysql et cette réponse m'a aidé donc je l'ai upvoted.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X