313 votes

Comment arrêter une requête MySQL en cours ?

Je me connecte à mysql à partir de mon shell Linux. De temps en temps, je lance un SELECT query qui est trop grande. Elle s'imprime et s'imprime et je sais déjà que ce n'est pas ce que je voulais. Je voudrais arrêter la requête.

Frapper Ctrl+C (plusieurs fois) tue mysql complètement et me ramène à la coquille, donc je dois me reconnecter.

Est-il possible d'arrêter une requête sans tuer mysql elle-même ?

3 votes

Il convient de mentionner que MySQL 5.7 prend en charge un délai d'attente pour les instructions SELECT côté serveur. Plus d'informations à ce sujet ici : mysqlserverteam.com/serveur-side-select-statement-timeouts

547voto

iddqd Points 3047
mysql>show processlist;

mysql> kill "number from first col";

1 votes

Merci, je savais seulement comment le faire dans phpmyadmin !

10 votes

Mais mysql s'imprime... Je ne vois pas l'invite

42 votes

Je suis d'accord avec cette approche de base, mais je pense qu'utiliser KILL QUERY est légèrement préférable à KILL pour ce cas. De cette façon, la requête est tuée, mais pas la connexion.

83voto

mtariq Points 1194

Juste pour ajouter

KILL QUERY **Id** où Id est l'identifiant de connexion de show processlist

est préférable si vous ne voulez pas interrompre la connexion, généralement à partir d'une application.

Pour plus de détails, vous pouvez lire la doc mysql. aquí

0 votes

J'ai une question à ce sujet : la connexion se rétablit-elle simplement, ou le fait de tuer les connexions a-t-il pour conséquence que la taille du pool est trop faible pour que l'application puisse fonctionner ?

52voto

minhas23 Points 365

Connectez-vous à mysql

mysql -uusername -p  -hhostname

montrer la liste complète des processus :

mysql> show full processlist;
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| Id      | User   | Host              | db      | Command | Time | State | Info             |
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| 9255451 | logreg | dmin001.ops:37651 | logdata | Query   |    0 | NULL  | show processlist |
+---------+--------+-------------------+---------+---------+------+-------+------------------+

Tuez la requête spécifique. Ici id=9255451

mysql> kill 9255451;

Si vous obtenez une permission refusée, essayez ce SQL :

CALL mysql.rds_kill(9255451)

14 votes

Note : Cette dernière requête est nécessaire si vous utilisez une instance AWS RDS.

16voto

minhas23 Points 365

Utilisez mysqladmin pour tuer la requête en fuite :

Exécutez les commandes suivantes :

mysqladmin -uusername -ppassword pr

Puis notez l'identifiant du processus.

mysqladmin -uusername -ppassword kill pid

La requête en fuite ne devrait plus consommer de ressources.

9voto

Rudy Lattae Points 674

Si tiene mysqladmin disponible, vous pouvez obtenir la liste des requêtes avec :

> mysqladmin -uUSERNAME -pPASSWORD pr

+-----+------+-----------------+--------+---------+------+--------------+------------------+
| Id  | User | Host            | db     | Command | Time | State        | Info             |
+-----+------+-----------------+--------+---------+------+--------------+------------------+
| 137 | beet | localhost:53535 | people | Query   | 292  | Sending data | DELETE FROM      |
| 145 | root | localhost:55745 |        | Query   | 0    |              | show processlist |
+-----+------+-----------------+--------+---------+------+--------------+------------------+

Ensuite, vous pouvez arrêter le processus mysql qui héberge la requête en cours :

> mysqladmin -uUSERNAME -pPASSWORD kill 137

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