Bulk ou matando em massa as consultas do MySQL

6

Como você mata uma massa de consultas do MySQL? Aqui está uma boa abordagem :

mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root' INTO OUTFILE '/tmp/a.txt';
mysql> source /tmp/a.txt;

Quaisquer outras, além de clicar nelas na GUI do MySQL Administrator?

    
por deadprogrammer 22.05.2009 / 18:56

4 respostas

6

Para crib os melhores comentários de a opinião de Percona sobre isso :

Comentário 4: Robert Wultsch

Eu prefiro o seguinte, uma vez que irá matá-los de uma forma multi-threaded ... (às vezes matando uma única consulta pode demorar um pouco)

for i in $(mysql -uroot -pPASS -e ’show processlist’ | grep ’search_term’ | awk ‘{print $1}’); do

mysql -uroot -pPASS -e “kill $i” &

done

Comentário 8: Shlomi Noach

Um procedimento armazenado INFORMATION_SCHEMA.PROCESSLIST que é um pouco detalhado para copiar.

Comentário 16: Bryan

Se a lista information_schema.processlist não existir na sua versão do MySQL, isso funcionará em um script linux:

#!/bin/bash

for each in 'mysqladmin -u root -prootpwd processlist | awk 
‘{print $2, $4, $8}’ | grep $dbname | grep $dbuser | awk ‘{print $1}’';

do mysqladmin -u root -prootpwd kill $each;

done

Comentário 21: Andrew Watson

Eu faço isso:

mysqladmin proc | grep Sleep | sort -r -n -k6 | awk {’print $1; ‘} | xargs mysqladmin kill

ou algo nesse sentido…

Como Dan C menciona em sua resposta a essa pergunta , a remoção de SELECTS é significativamente mais segura do que matar comandos de gravação no meio do fluxo, já que você pode perder integridade de dados e / ou chaves estrangeiras.

    
por 06.06.2009 / 20:49
2

Uma solução alternativa é usar uma abordagem que Digg descreve , que é a de remover automaticamente as consultas SELECT que levam mais do que um período de tempo para completar. De um modo geral, você só quer limpar as consultas SELECT porque elas são somente leitura e não devem afetar a integridade dos dados do seu aplicativo.

Dois desses utilitários que você pode usar para automatizar isso são dbmon.pl e o mkill, que faz parte de um pacote chamado mtop .

    
por 06.06.2009 / 21:47
0

Eu usei-o para matar todas as consultas de sono no servidor de banco de dados MySQL 5.5:

mysql -e "show full processlist;" -ss | grep Sleep | awk '{print "KILL "$1";"}' | mysql
    
por 01.06.2016 / 19:25
0

O mais fácil é matá-los da casca, por exemplo

mysqladmin proc | grep Sleep | awk '{print $2}' | xargs -L1 mysqladmin kill 

Se ainda houver um problema, verifique os detalhes pela seguinte consulta:

mysql -e "SHOW engine innodb status\G"

De MySQL, tente o seguinte código baseado no post por @ Shlomi , você pode criar um procedimento armazenado usando o cursor do servidor, por exemplo:

DELIMITER $$

DROP PROCEDURE IF EXISTS test.kill_user_queries$$
CREATE PROCEDURE test.kill_user_queries (kill_user_name VARCHAR(16) CHARSET utf8)
SQL SECURITY INVOKER
BEGIN
DECLARE query_id INT;
DECLARE iteration_complete INT DEFAULT 0;
DECLARE select_cursor CURSOR FOR SELECT id FROM INFORMATION_SCHEMA.PROCESSLIST WHERE user=kill_user_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET iteration_complete=1;

OPEN select_cursor;
cursor_loop: LOOP
FETCH select_cursor INTO query_id;
IF iteration_complete THEN
LEAVE cursor_loop;
END IF;
KILL QUERY query_id;
END LOOP;
CLOSE select_cursor;

END$$

DELIMITER ;

Há também um script antigo chamado mypgrep.py do Google.

    
por 02.08.2016 / 13:32