Wenn Sie MySQL 5.1 haben, dessen Prozessliste sich in der INFORMATION_SCHEMA befindet, können Sie dies tun, um die KILL QUERY-Befehle in großen Mengen aus dem mysql-Client für Abfragen zu generieren, die länger als 20 Minuten (1200 Sekunden) ausgeführt werden:
SELECT GROUP_CONCAT(CONCAT('KILL QUERY ',id,';') SEPARATOR ' ') KillQuery
FROM information_schema.processlist WHERE user<>'system user'
AND time >= 1200\G
Sie können WHERE-Klauseln für das INFO-Feld verwenden, um nach einer bestimmten Abfrage zu suchen, das TIME-Feld für lang laufende Abfragen oder das DB-Feld für eine bestimmte Datenbank.
Wenn Sie root @ localhost sind, sollten Sie über die folgenden Berechtigungen verfügen, um dies auszuführen
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
Sie können dies wie folgt überprüfen:
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
Hier ist eine andere Variante:
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
Übrigens: Sie haben keine myDB angegeben, da ich explizit aus information_schema.processlist als vollständig qualifizierten Tabellennamen gelesen habe.
Hier ist eine Demonstration dessen, was Sie sehen sollten. In diesem Beispiel werde ich den KILL-Befehl aller Prozesse wiederholen, deren Zeit> 20000 Sekunden ist:
[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@***** ~]#
Ich mache diese Technik seit 5 Jahren. Tatsächlich habe ich diese Antwort letztes Jahr beim DBA StackExchange eingereicht und sie wurde akzeptiert .