Dans les journaux derreurs MySQL, je vois ces quelques avertissements comme ceux-ci:
120611 16:12:30 [Warning] Aborted connection 2619503 to db: "db_name" user: "user_name" host: "webapp_hostname" (Got an error reading communication packets)
Je nai pas remarqué de perte de données en soi, donc je me demande ce que signifie cet avertissement, ou ce qui le cause, et si on peut résoudre le problème qui en est à lorigine. Ceci est sur RHEL 6.1 et MySQL Entreprise 5.5.
Réponse
Lun des tueurs silencieux de MySQL Connections est le paquet MySQL.
Voyons dabord ce quest un paquet MySQL.
Daprès la page 99 de « Understanding MySQL Internals » (ISBN 0-596-00957 -7) , voici les paragraphes 1 à 3 expliquant les paquets MySQL:
Le code de communication réseau MySQL a été écrit en supposant que les requêtes sont toujours raisonnablement court, et peut donc être envoyé et traité par le serveur en un seul morceau, qui est appelé un paquet dans la terminologie MySQL. Le serveur alloue la mémoire pour un tampon temporaire pour stocker le paquet, et il en demande suffisamment pour ladapter entièrement. Cette architecture nécessite une précaution pour éviter que le serveur ne soit à court de mémoire — un plafond sur la taille du paquet, ce que cette option accomplit.
Le code dintérêt par rapport à cette option se trouve dans sql / net_serv.cc . Jetez un œil à my_net_read () , puis suivez lappel à my_real_read () et portez une attention particulière à net_realloc () .
Cette variable limite également la longueur dun résultat de nombreuses fonctions de chaîne. Voir sql / field.cc et sql / intem_strfunc.cc pour plus de détails.
Connaître les paquets MySQL permet à un développeur / DBA de les dimensionner pour accueillir plusieurs BLOB à lintérieur dun paquet même sils sont extrêmement volumineux. Certainement, un paquet trop petit causera des problèmes pour les connexions ouvertes à cet égard.
Selon le Documentation MySQL
-
Vous pouvez également obtenir ces erreurs si vous envoyez une requête au serveur qui est incorrecte ou trop grande. Si mysqld reçoit un paquet trop volumineux ou dans le désordre, il suppose que quelque chose ne va pas avec le client et ferme la connexion. Si vous avez besoin de requêtes volumineuses (par exemple, si vous travaillez avec de grandes colonnes BLOB), vous pouvez augmenter la limite de requête en définissant la variable max_allowed_packet du serveur, qui a une valeur par défaut de 1 Mo. Vous devrez peut-être également augmenter le maximum taille du paquet côté client. Pour plus dinformations sur la définition de la taille du paquet, reportez-vous à la section Section C.5.2.10, «Paquet trop volumineux».
-
Une instruction INSERT ou REPLACE qui insère un grand nombre de lignes peut également provoquer ce type derreurs. Lune ou lautre de ces instructions envoie une seule requête au serveur quel que soit le nombre de lignes à insérer ; ainsi, vous pouvez souvent éviter lerreur en réduisant le nombre de lignes envoyées par INSERT ou REPLACE.
RECOMMANDATION
Essayez daugmenter le max_allowed_packet à un nombre beaucoup plus grand, car la valeur par défaut est 1M. Je wou ld suggère environ 10 fois le plus grand champ TEXT ou BLOB que vous avez dans votre ensemble de données actuel.
Pour définir max_allowed_packet sur 256M, vous pouvez lajouter à /etc/my.cnf ou my.ini
[mysqld] max_allowed_packet=256M
pour couvrir les futurs redémarrages de mysqld. Pour installer la valeur maintenant sur le serveur, veuillez exécuter ceci:
SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;
Essayez-le !!!
Commentaires
- Très bonne explication.
- @RolandoMySQLDBA Jobtiens toujours une erreur dans 5.7.28 après avoir essayé toutes les solutions mentionnées. Tous les conseils pour résoudre les problèmes supplémentaires
Réponse
La plupart du temps par défaut, max_connections sera de 100. Essayez daugmenter le paramètre de configuration
max_connections = 400, après avoir défini dans my.cnf, redémarrez le serveur ou définissez-le dynamiquement:
set @@global.max_connections = 400;
Essayez simplement la recommandation ci-dessus pour évitez ces messages davertissement et assurez-vous également que votre réseau na pas abandonné de paquets.
Réponse
Jai rencontré ce problème récemment après avoir quitté MySQL Enterprise 5.1.x à 5.7.x , sans aucune modification significative du code de lapplication, la « note » a commencé à apparaître.
Dans mon cas, la cause principale de lapparition de la « note » était que le programme se fermait avec des connexions toujours ouvertes.Les circonstances pour lesquelles les connexions nétaient pas fermées étaient un peu plus complexes et non liées à MySQL mais à ACE, aux threads et à TSS.
Réponse
Non mentionné ici, jinclus donc une autre cause de ce problème. Dans mon cas, lors de lutilisation du client de ligne de commande mysql, lerreur a été causée par une valeur faible de 30 secondes de interactive_timeout
:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_interactive_timeout
Cela persistera dune session à lautre, mais pas lors dun redémarrage du serveur.
SET GLOBAL interactive_timeout=6000;
Réponse
Jai rencontré le même problème avec MariaDB 10.3.24. On dirait que lavertissement peut se produire pour toutes les raisons ci-dessus et plus encore. Dans mon cas, cela était dû à un enregistrement dans lune des tables de la base de données qui avait une valeur de dictionnaire vide pour lun des champs.
+ —- + ——– + | id | config | + —- + ——– + | 3 | {} | + —- + ——– +
Comme test, jai changé le « {} » en « () » et cela a arrêté le message. Juste au cas où cela aiderait quelquun.
Réponse
Cette ligne my.ini a résolu mon problème:
log_error_verbosity=1
Référence ce lien
Commentaires
- Je ne ' Je pense que vous avez résolu le problème sous-jacent mais que vous avez simplement arrêté sa journalisation.
- Javais le même message signalé comme un " Remarque ". Lutilisation de log_error_verbosity = 2 résout en fait le " problème " (mais un " Avertissement " doit être adressé, pas ignoré)