Comment puis-je arrêter une requête MySQL en cours d'exécution?

258

Je me connecte à mysqlpartir de mon shell Linux. De temps en temps, j'exécute une SELECTrequête trop volumineuse. Il imprime et imprime et je sais déjà que ce n'est pas ce que je voulais dire. Je voudrais arrêter la requête.

Frapper Ctrl+C(quelques fois) tue mysqlcomplètement et me ramène au shell, donc je dois me reconnecter.

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

David B
la source
1
Il convient de mentionner que MySQL 5.7 prend en charge un délai d'expiration de l'instruction SELECT côté serveur. Plus d'informations à ce sujet ici: mysqlserverteam.com/server-side-select-statement-timeouts
Morgan Tocker

Réponses:

462
mysql>show processlist;

mysql> kill "number from first col";
baklarz2048
la source
1
Merci, je ne savais que le faire en phpmyadmin!
Zilverdistel
5
mais mysqlimprime ... Je ne vois pas l'invite
David B
34
Je suis d'accord avec cette approche de base, mais je pense que l'utilisation KILL QUERYest légèrement préférable à KILLce cas. De cette façon, la requête est supprimée, mais pas la connexion.
Ike Walker
3
une astuce utile si votre liste de processus défile devant votre tampon est de définir le pager. Entrez simplement «\ P plus» à l'invite. En savoir plus sur cette astuce ici dbasquare.com/2012/03/28/…
Scott
1
Si vous utilisez MySQL sur AWS RDS, vous ne serez pas autorisé à exécuter KILL, mais vous pouvez exécuter:CALL mysql.rds_kill(12345)
Kip
70

Juste pour ajouter

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

est plus préférable si vous ne voulez généralement pas couper la connexion lors de l'exécution à partir d'une application.

Pour plus de détails, vous pouvez lire la doc mysql ici

maaz
la source
Une question que j'avais posée à ce sujet, est-ce que la connexion réapparaît juste, ou est-ce que la suppression des connexions finit par entraîner une taille de pool trop petite pour que l'application s'exécute?
Oncle Iroh
48

Connectez-vous à mysql

mysql -uusername -p  -hhostname

afficher 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 autorisation refusée, essayez ce SQL:

CALL mysql.rds_kill(9255451)
minhas23
la source
13
Remarque: Cette dernière requête est requise si vous utilisez une instance AWS RDS.
Kip
13

Utilisez mysqladminpour tuer la requête d'emballement:

Exécutez les commandes suivantes:

mysqladmin -uusername -ppassword pr

Notez ensuite l'ID du processus.

mysqladmin -uusername -ppassword kill pid

La requête galopante ne devrait plus consommer de ressources.

minhas23
la source
9

Si vous en avez mysqladmin, 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 longue:

> mysqladmin -uUSERNAME -pPASSWORD kill 137
Rudy Lattae
la source
6

Vous devez exécuter la commande suivante pour tuer le processus.

> show processlist;  
> kill query processId;

Le paramètre de requête spécifie que nous devons tuer le processus de commande de requête.

La syntaxe du processus d'élimination comme suit

KILL [CONNEXION | QUERY] processlist_id

Veuillez consulter ce lien pour plus d'informations.

Shivam Kubde
la source
1

L'auteur de cette question mentionne que ce n'est généralement qu'après que MySQL a imprimé sa sortie qu'il se rend compte que la mauvaise requête a été exécutée. Comme indiqué, dans ce cas, Ctrl-Cn'aide pas. Cependant, j'ai remarqué que cela annulerait la requête en cours - si vous l'attrapez avant qu'une sortie ne soit imprimée. Par exemple:

mysql> select * from jos_users, jos_comprofiler;

MySQL est occupé à générer le produit cartésien des deux tables ci-dessus et vous remarquez rapidement que MySQL n'a imprimé aucune sortie à l'écran (l'état du processus est l' envoi de données ), vous tapez donc Ctrl-C:

Ctrl-C -- sending "KILL QUERY 113240" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted

Ctrl-Cpeut également être utilisé pour arrêter une UPDATErequête.

Anthony Geoghegan
la source