Se você tem o MySQL 5.1 onde a lista de processos está no INFORMATION_SCHEMA, você pode fazer isso para gerar os comandos KILL QUERY em massa a partir do cliente mysql para consultas que duram mais de 20 minutos (1200 segundos):
SELECT GROUP_CONCAT(CONCAT('KILL QUERY ',id,';') SEPARATOR ' ') KillQuery
FROM information_schema.processlist WHERE user<>'system user'
AND time >= 1200\G
Você pode fazer cláusulas WHERE no campo INFO para procurar uma consulta específica, o campo TIME em consultas longas ou o campo DB em um banco de dados específico.
Se você é root @ localhost, você deve ter privilégios totais para executar isso da seguinte forma
SECONDS_TOO_LONG=1200
KILLPROC_SQLSTMT="SELECT GROUP_CONCAT(CONCAT('KILL QUERY ',id,';') SEPARATOR ' ') KillQuery FROM information_schema.processlist WHERE user<>'system user' AND time >= ${SECONDS_TOO_LONG}"
mysql -uroot -ppassword -ANe"${KILLPROC_SQLSTMT}" | mysql -uroot -ppassword
Você pode crontab da seguinte forma:
SECONDS_TOO_LONG=1200
QUERIES_RUNNING_TOO_LONG='mysql -uroot -ppassword -ANe"SELECT COUNT(1) FROM information_schema.processlist WHERE user<>'system user' AND time >= ${SECONDS_TOO_LONG}"'
if [ ${QUERIES_RUNNING_TOO_LONG} -gt 0 ]
then
KILLPROC_SQLSTMT="SELECT GROUP_CONCAT(CONCAT('KILL QUERY ',id,';') SEPARATOR ' ') KillQuery FROM information_schema.processlist WHERE user<>'system user' AND time >= ${SECONDS_TOO_LONG}"
mysql -uroot -ppassword -ANe"${KILLPROC_SQLSTMT}" | mysql -uroot -ppassword
fi
Aqui está outra variação:
SECONDS_TOO_LONG=1200
QUERIES_RUNNING_TOO_LONG='mysql -uroot -ppassword -ANe"SELECT COUNT(1) FROM information_schema.processlist WHERE user<>'system user' AND time >= ${SECONDS_TOO_LONG}"'
if [ ${QUERIES_RUNNING_TOO_LONG} -gt 0 ]
then
KILLPROC_SQLSTMT="SELECT CONCAT('KILL QUERY ',id,';') KillQuery FROM information_schema.processlist WHERE user<>'system user' AND time >= ${SECONDS_TOO_LONG}"
mysql -uroot -ppassword -ANe"${KILLPROC_SQLSTMT}" > /tmp/kill_log_queries.sql
mysql -uroot -ppassword < /tmp/kill_log_queries.sql
fi
BTW Você não tem que especificar um myDB, pois eu leio explicitamente a partir de information_schema.processlist como um nome de tabela totalmente qualificado.
Aqui está uma demonstração do que você deve ver. Para este exemplo, irei ecoar o comando KILL de todos os processos cujo tempo > 20000 segundos:
[root@***** ~]# mysql 'lwdba_connect' -ANe"SELECT GROUP_CONCAT('KILL ',id,'; ' SEPARATOR ' ') FROM information_schema.processlist WHERE time > 25000 AND user<>'system user';"
+----------------------------------------------------+
| KILL 180186; KILL 180141; KILL 176419; KILL 3; |
+----------------------------------------------------+
[root@***** ~]#
Eu tenho feito essa técnica nos últimos 5 anos. De fato, enviei esta resposta para o DBA StackExchange no ano passado e foi aceita .