Como posso parar uma consulta MySQL em execução?

258

Eu me conecto a mysql partir do meu shell Linux. De vez em quando eu executo uma SELECTconsulta muito grande. Ele imprime e imprime e eu já sei que não foi isso que eu quis dizer. Eu gostaria de parar a consulta.

Bater Ctrl+C(algumas vezes) matamysql completamente e me leva de volta ao shell, então eu tenho que me reconectar.

É possível parar uma consulta sem se matar mysql?

David B
fonte
1
Vale ressaltar que o MySQL 5.7 suporta um tempo limite da instrução SELECT do lado do servidor. Mais informações sobre isso aqui: mysqlserverteam.com/server-side-select-statement-timeouts
Morgan Tocker

Respostas:

462
mysql>show processlist;

mysql> kill "number from first col";
baklarz2048
fonte
1
Thanx, eu só sabia como fazê-lo no phpmyadmin!
Zilverdistel
5
mas mysqlestá a imprimir ... Eu não posso ver o prompt
David B
34
Concordo com essa abordagem básica, mas acho que usar KILL QUERYé um pouco preferível KILLpara este caso. Dessa forma, a consulta é eliminada, mas não a conexão.
Ike Walker
3
uma dica útil se sua lista de processos estiver passando do seu buffer é definir o pager. Basta digitar '\ P more' no prompt. Veja mais informações sobre essa dica aqui dbasquare.com/2012/03/28/…
Scott
1
Se estiver usando o MySQL no AWS RDS, você não terá permissão para executar KILL, mas poderá executar:CALL mysql.rds_kill(12345)
Kip
70

Apenas para adicionar

KILL QUERY **Id** onde Id é o ID de conexão show processlist

é mais preferível se você não deseja interromper a conexão normalmente ao executar a partir de algum aplicativo.

Para mais detalhes, você pode ler o documento mysql aqui

maaz
fonte
Uma pergunta que eu tinha relacionado a isso: a conexão apenas reaparece ou a interrupção de conexões acaba resultando no tamanho do pool ser muito pequeno para a execução do aplicativo?
Tio Iroh
48

Conecte-se ao mysql

mysql -uusername -p  -hhostname

mostre a lista de processos completa:

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

Mate a consulta específica. Aqui id = 9255451

mysql> kill 9255451;

Se você receber permissão negada, tente este SQL:

CALL mysql.rds_kill(9255451)
minhas23
fonte
13
Nota: Essa última consulta é necessária se você estiver usando a instância do AWS RDS.
Kip
13

Use mysqladminpara matar a consulta descontrolada:

Execute os seguintes comandos:

mysqladmin -uusername -ppassword pr

Em seguida, anote a identificação do processo.

mysqladmin -uusername -ppassword kill pid

A consulta descontrolada não deve mais consumir recursos.

minhas23
fonte
9

Se você tiver mysqladmindisponível, poderá obter a lista de consultas com:

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

Então você pode parar o processo mysql que hospeda a consulta de execução longa:

> mysqladmin -uUSERNAME -pPASSWORD kill 137
Rudy Lattae
fonte
6

Você precisa executar o seguinte comando para interromper o processo.

> show processlist;  
> kill query processId;

O parâmetro Query especifica que precisamos matar o processo do comando query.

A sintaxe para o processo de interrupção da seguinte maneira

MATAR [CONEXÃO | QUERY] processlist_id

Por favor, consulte este link para obter mais informações.

Shivam Kubde
fonte
1

O autor desta pergunta menciona que geralmente somente após o MySQL imprimir sua saída é que ele percebe que a consulta incorreta foi executada. Como observado, neste caso, Ctrl-Cnão ajuda. No entanto, notei que ela abortará a consulta atual - se você a capturar antes de qualquer saída ser impressa. Por exemplo:

mysql> select * from jos_users, jos_comprofiler;

O MySQL fica ocupado gerando o Produto Cartesiano das duas tabelas acima e você logo percebe que o MySQL não imprimiu nenhuma saída na tela (o estado do processo é Enviando dados ); assim, você digita Ctrl-C:

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

Ctrl-CDa mesma forma, pode ser usado para interromper uma UPDATEconsulta.

Anthony Geoghegan
fonte