Vous devez d'abord exécuter cette requête:
SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
Ceci listera tous les utilisateurs qui ont le privilège SUPER . La plupart des utilisateurs qui effectuent un traitement de base de données lié à l'application n'ont pas besoin de ce privilège. Selon la documentation MySQL , ceux qui ont le privilège SUPER peuvent faire ce qui suit:
- Exécutez CHANGE MASTER TO pour contrôler les coordonnées de réplication
- KILL ou
mysqladmin kill
pour tuer les threads appartenant à d'autres comptes
- PURGER LES JOURNAUX BINAIRES pour supprimer systématiquement les journaux binaires
- Apportez des modifications de configuration à l'aide de SET GLOBAL pour modifier les variables système globales
- commande de débogage mysqladmin
- activation ou désactivation de la journalisation
- effectuer des mises à jour même si la variable système * read_only * est activée
- démarrage et arrêt de la réplication sur des serveurs esclaves
- spécification de tout compte dans l'attribut DEFINER des programmes et vues stockés
- VOICI LE PLUS IMPORTANT POUR VOTRE PROBLÈME:: vous permet de vous connecter (une fois) même si la limite de connexion contrôlée par la variable système max_connections est atteinte.
Vous devrez vous connecter en tant que root @ localhost et révoquer le privilège SUPER comme suit:
UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;
Une fois que vous faites cela, chaque fois que tous les utilisateurs inondent les connexions mysql, seuls root@localhost
peuvent se connecter. Après tout, si tout le monde et sa grand-mère avaient un privilège SUPER, cela empêcherait root@localhost
de se connecter avant tout le monde. Si max_connections est à 200 et que vous devez le porter à 300 sans avoir à redémarrer mysqld, vous pouvez augmenter dynamiquement max_connections avec cette commande:
mysql> SET GLOBAL max_connections = 300;
Cela permettra plus de connexions efficaces immédiatement, mais n'augmentez pas simplement arbitrairement le nombre sur un coup de tête. Vous devez vous assurer que mysql a suffisamment de RAM pour s'adapter à l'augmentation.
CAVEAT: Si vous changez dynamiquement max_connections à 300, veuillez le mettre dans /etc/my.cnf
[mysqld]
max_connections=300
Vous pouvez exécuter mysqltuner.pl sur votre serveur de base de données MySQL. Si vous ne l'avez pas, exécutez ce qui suit:
cd
wget mysqltuner.pl
perl mysqltuner.pl
La troisième ligne sous Performance Metrics a ceci
-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)
Voir les 5,4 millions par thread? Cela est multiplié par max_connections. Dans cet exemple, ce serait un maximum d'environ 10,8 G de RAM. Par conséquent, chaque fois que vous augmentez max_connections, vous devez exécuter mysqltuner.pl et vérifier si vous appuyez sur le système d'exploitation pour trop de mémoire.
Dans tous les cas, limiter les privilèges SUPER donne à ces utilisateurs la possibilité d'atténuer l'inondation de mysqld avec DB Connections.