Vous pouvez également redémarrer mysqld, par exemplesudo service mysqld restart
philfreo
Réponses:
108
Vous devez les tuer un par un, MySQL n'a pas de commande kill massive. Vous pouvez le script dans n'importe quel langage, par exemple en PHP, vous pouvez utiliser quelque chose comme:
$result = mysql_query("SHOW FULL PROCESSLIST");while($row=mysql_fetch_array($result)){$process_id=$row["Id"];if($row["Time"]>200){$sql="KILL $process_id";
mysql_query($sql);}}
si vous ne souhaitez pas stocker dans un fichier, stockez dans un variable
Exécutez simplement votre invite de commande
> out1=$(mysql -B test -uroot -proot --disable-column-names -e "select concat('KILL ',id,';') from information_schema.processlist where user='root' and time > 200;")> out2=$(mysql -B test -uroot -proot --disable-column-names -e "$out1")
c'est une très mauvaise idée ... en particulier si vous avez le moteur de table en mémoire, car toutes les données seront perdues ... ou si vous utilisez le type de moteur innodb, car il refera tous les index au redémarrage
HellBaby
8
En outre, il tue tous les processus sur toutes les bases de données
Diego Andrés Díaz Espinoza
10
Cela ne devient pas plus simple, exécutez simplement ceci dans l'invite mysql.
killUSER username;
Cela tuera tous les processus sous le nom d'utilisateur fourni. parce que la plupart des gens utilisent le même utilisateur pour tous les usages, cela fonctionne!
Dans quelle version de MySQL existe-t-il? Je ne le vois pas documenté dans la référence MySQL 5.7 ; il n'y a aucune preuve qu'il est possible de tuer par l' utilisateur: KILL [CONNECTION | QUERY] processlist_id. J'ai essayé votre requête dans MySQL 5.6.34 et c'est considéré comme une erreur de syntaxe.
Birchlabs
4
J'ai essayé ceci dans l'invite MySQL 5.6.34: mysql> kill user root; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'root' at line 1 Votre réponse est probablement une fonctionnalité particulière à MariaDB uniquement.
Birchlabs
Cela ne fonctionne pas pour Mysql. Veuillez lire avant de publier des conseils relatifs à d'autres systèmes de base de données ...
RyanH
7
Ce qui suit va créer une procédure stockée simple qui utilise un curseur pour tuer tous les processus un par un à l'exception du processus actuellement utilisé:
DROPPROCEDUREIFEXISTS kill_other_processes;
DELIMITER $$CREATEPROCEDURE kill_other_processes()BEGINDECLARE finished INT DEFAULT0;DECLARE proc_id INT;DECLARE proc_id_cursor CURSORFORSELECT id FROM information_schema.processlist;DECLARECONTINUE HANDLER FORNOT FOUND SET finished =1;OPEN proc_id_cursor;
proc_id_cursor_loop: LOOP
FETCH proc_id_cursor INTO proc_id;IF finished =1THEN
LEAVE proc_id_cursor_loop;ENDIF;IF proc_id <> CONNECTION_ID()THENKILL proc_id;ENDIF;END LOOP proc_id_cursor_loop;CLOSE proc_id_cursor;END$$
DELIMITER ;
Il peut être exécuté avec SELECTs pour afficher les processus avant et après comme suit:
J'ai récemment eu besoin de faire ça et je suis venu avec ça
-- GROUP_CONCAT turns all the rows into 1-- @q:= stores all the kill commands to a variableselect@q:=GROUP_CONCAT(CONCAT('KILL ',ID) SEPARATOR ';')FROM information_schema.processlist
-- If you don't need it, you can remove the WHERE command altogetherWHEREuser='user';-- Creates statement and execute it
PREPARE stmt FROM@q;EXECUTE stmt;DEALLOCATE PREPARE stmt;
De cette façon, vous n'avez pas besoin de stocker dans un fichier et d'exécuter toutes les requêtes avec une seule commande.
ÉTAPE 2: Appelez la procédure stockée en lui donnant le nom d'un utilisateur de base de données dont vous souhaitez supprimer les processus. Vous pouvez réécrire la procédure stockée pour filtrer sur d'autres critères si vous le souhaitez.
Héy. Je ne sais pas si vous êtes un robot, une communauté ou un humain, mais de toute façon, ce serait formidable si vous ajoutiez des mots expliquant ce qui se passe avec cette ligne de code et comment cela résout le problème?
Félix Gagnon-Grenier
1
Ajout des -u et -p pour donner accès à l'utilisateur ... ça marche!
Lord St John
2
Nous pouvons le faire par MySQL Workbench. Exécutez simplement ceci:
Cela semble une meilleure réponse car il n'y avait pas de langage mentionné ci-dessus.
DeshDeep Singh
0
Un moyen simple serait de redémarrer le serveur mysql. Ouvrez "services.msc" dans Windows Run, sélectionnez Mysql dans la liste. Faites un clic droit et arrêtez le service. Puis recommencez et tous les processus auraient été tués sauf celui (la connexion réservée par défaut)
sudo service mysqld restart
Réponses:
Vous devez les tuer un par un, MySQL n'a pas de commande kill massive. Vous pouvez le script dans n'importe quel langage, par exemple en PHP, vous pouvez utiliser quelque chose comme:
la source
for i in {994..1145}; do mysql -uroot -p123456 -e "kill $i" ; done
L' opération de massacre fait gagner du temps. Faites-le dans MySql lui-même:
Exécutez ces commandes
Référence
si vous ne souhaitez pas stocker dans un fichier, stockez dans un
variable
Exécutez simplement votre invite de commande
la source
J'ai également cherché comment analyser via MySQL la commande SHOW PROCESSLIST et je me suis terminé par une ligne unique dans un Shell:
Vous pouvez exécuter grep avant la commande awk pour filtrer un nom de base de données particulier.
la source
Ou ... en coquille ...
Ouais, je sais, je suis paresseux, mais ça peut aussi être pratique.
la source
Cela ne devient pas plus simple, exécutez simplement ceci dans l'invite mysql.
Cela tuera tous les processus sous le nom d'utilisateur fourni. parce que la plupart des gens utilisent le même utilisateur pour tous les usages, cela fonctionne!
J'ai testé ceci sur MariaDB pas sûr de mysql.
la source
KILL [CONNECTION | QUERY] processlist_id
. J'ai essayé votre requête dans MySQL 5.6.34 et c'est considéré comme une erreur de syntaxe.mysql> kill user root; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'root' at line 1
Votre réponse est probablement une fonctionnalité particulière à MariaDB uniquement.Ce qui suit va créer une procédure stockée simple qui utilise un curseur pour tuer tous les processus un par un à l'exception du processus actuellement utilisé:
Il peut être exécuté avec
SELECT
s pour afficher les processus avant et après comme suit:la source
J'ai récemment eu besoin de faire ça et je suis venu avec ça
De cette façon, vous n'avez pas besoin de stocker dans un fichier et d'exécuter toutes les requêtes avec une seule commande.
la source
TUER TOUTES LES QUESTIONS SELECT
la source
Si vous n'avez pas information_schema:
la source
Connectez-vous à Mysql en tant qu'administrateur:
Et puis exécutez la commande:
Vous obtiendrez quelque chose comme ci-dessous:
Vous verrez les détails complets des différentes connexions. Vous pouvez maintenant tuer la connexion en veille comme ci-dessous:
la source
Cette copie a fonctionné pour moi (serveur MySQL 5.5) pour tuer tous les processus MySQL:
la source
Je combinerais bash et mysql:
la source
Voici une solution que vous pouvez exécuter sans vous fier au système d'exploitation:
ÉTAPE 1: créez une procédure stockée.
ÉTAPE 2: Appelez la procédure stockée en lui donnant le nom d'un utilisateur de base de données dont vous souhaitez supprimer les processus. Vous pouvez réécrire la procédure stockée pour filtrer sur d'autres critères si vous le souhaitez.
APPEL
kill_user_processes('devdba');
la source
la source
Nous pouvons le faire par MySQL Workbench. Exécutez simplement ceci:
Exemple:
Cela l'enlèvera.
la source
Un moyen simple serait de redémarrer le serveur mysql. Ouvrez "services.msc" dans Windows Run, sélectionnez Mysql dans la liste. Faites un clic droit et arrêtez le service. Puis recommencez et tous les processus auraient été tués sauf celui (la connexion réservée par défaut)
la source
la source
Parfois, j'ai des processus mysql zombies qui ne peuvent pas être tués (en utilisant MAMP Pro).
Obtenez d'abord une liste de tous les processus mysql:
Ensuite, tuez chacun d'eux avec (remplacez processId par la première colonne du résultat de la commande précédente):
la source
Ce qui suit a très bien fonctionné pour moi:
la source
J'ai utilisé la commande
flush tables
pour tuer toutes les connexions inactives qui étaient en fait le problème de masse.la source
pour le langage python, vous pouvez faire comme ça
la source
Si vous utilisez laravel, c'est pour vous:
Bien sûr, vous devriez l'utiliser
use Illuminate\Support\Facades\DB;
après votre espace de noms.la source
La requête 1 sélectionnez concat ('KILL', id, ';') de information_schema.processlist où user = 'username' dans outfile '/tmp/a.txt';
Requête 2 source a.txt
Cela vous permettra de supprimer toutes les requêtes de show processlist par utilisateur spécifique.
la source