Come posso interrompere una query MySQL in esecuzione?


258

Mi collego mysqldalla mia shell Linux. Ogni tanto corro aSELECT query troppo grande. Stampa e stampa e so già che non intendevo questo. Vorrei interrompere la domanda.

Colpire Ctrl+C(un paio di volte) uccide mysqlcompletamente e mi riporta alla shell, quindi devo riconnettermi.

È possibile interrompere una query senza uccidersi mysql?


1
Vale la pena ricordare che MySQL 5.7 supporta un timeout dell'istruzione SELECT sul lato server. Maggiori informazioni qui: mysqlserverteam.com/server-side-select-statement-timeouts
Morgan Tocker

Risposte:


462
mysql>show processlist;

mysql> kill "number from first col";

1
Grazie, sapevo solo come farlo in phpmyadmin!
Zilverdistel,

5
ma mysqlsta stampando ... Non riesco a vedere il messaggio
David B,

34
Sono d'accordo con questo approccio di base, ma penso che l'utilizzo KILL QUERYsia leggermente preferibile KILLper questo caso. In questo modo la query viene interrotta, ma non la connessione.
Ike Walker,

3
un suggerimento utile se l'elenco dei processi scorre oltre il buffer è impostare il cercapersone. Inserisci '\ P more' al prompt. Vedi di più su questo suggerimento qui dbasquare.com/2012/03/28/…
Scott

1
Se usi MySQL su AWS RDS, non avrai i permessi per eseguire KILL, ma puoi eseguire:CALL mysql.rds_kill(12345)
Kip

70

Solo per aggiungere

KILL QUERY **Id** da dove Id è ID di connessione show processlist

è preferibile se non si desidera interrompere la connessione in genere quando si esegue da qualche applicazione.

Per maggiori dettagli puoi leggere mysql doc qui


Una domanda che avevo posto a riguardo, la connessione si ripresenta o l'uccisione delle connessioni alla fine porta a una dimensione del pool troppo piccola per l'esecuzione dell'applicazione?
Zio Iroh,

48

Connettiti a mysql

mysql -uusername -p  -hhostname

mostra la lista completa dei processi:

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

Uccidi la query specifica. Qui id = 9255451

mysql> kill 9255451;

Se ricevi l'autorizzazione negata, prova questo SQL:

CALL mysql.rds_kill(9255451)

13
Nota: l'ultima query è necessaria se si utilizza l'istanza di AWS RDS.
Kip

13

Utilizzare mysqladminper terminare la query in fuga:

Esegui i seguenti comandi:

mysqladmin -uusername -ppassword pr

Quindi annotare l'id del processo.

mysqladmin -uusername -ppassword kill pid

La query in fuga non dovrebbe più consumare risorse.


9

Se hai a mysqladmindisposizione, potresti ottenere l'elenco delle query con:

> 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 |
+-----+------+-----------------+--------+---------+------+--------------+------------------+

Quindi è possibile interrompere il processo mysql che ospita la query di lunga durata:

> mysqladmin -uUSERNAME -pPASSWORD kill 137

6

È necessario eseguire il comando seguente per terminare il processo.

> show processlist;  
> kill query processId;

Il parametro query specifica che è necessario interrompere il processo del comando query.

La sintassi per il processo kill è la seguente

KILL [CONNECTION | QUERY] processlist_id

Si prega di fare riferimento a questo link per ulteriori informazioni.


1

L'autore di questa domanda afferma che di solito è solo dopo che MySQL ha stampato il suo output che ha realizzato che la query sbagliata è stata eseguita. Come notato, in questo caso, Ctrl-Cnon aiuta. Tuttavia, ho notato che interromperà la query corrente , se la catturi prima che venga stampato qualsiasi output. Per esempio:

mysql> select * from jos_users, jos_comprofiler;

MySQL si impegna a generare il prodotto cartesiano delle due tabelle precedenti e noterai presto che MySQL non ha stampato alcun output sullo schermo (lo stato del processo è Invio dati ) in modo da digitare Ctrl-C:

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

Ctrl-Cpuò essere usato allo stesso modo per interrompere una UPDATEquery.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.