În jurnalele de erori MySQL, văd aceste avertismente destul de puține ca acestea:

120611 16:12:30 [Warning] Aborted connection 2619503 to db: "db_name" user: "user_name" host: "webapp_hostname" (Got an error reading communication packets) 

Nu am observat nicio pierdere de date în sine, așa că mă întreb ce înseamnă acest avertisment sau ce anume îl cauzează și dacă modul în care s-ar putea aborda problema care le cauzează. Acest lucru se află pe RHEL 6.1 și MySQL Enterprise 5.5.

Răspuns

Unul dintre ucigașii silențioși ai conexiunilor MySQL este pachetul MySQL.

Mai întâi, să ne dăm seama ce este un pachet MySQL.

Conform pagina 99 din „Înțelegerea internelor MySQL” (ISBN 0-596-00957 -7) , iată paragrafele 1-3 care explică pachetele MySQL:

Codul de comunicare în rețea MySQL a fost scris în ipoteza că interogările sunt întotdeauna în mod rezonabil scurt și, prin urmare, poate fi trimis și procesat de server într-o singură bucată, numită pachet în terminologia MySQL. Serverul alocă memoria pentru un buffer temporar pentru a stoca pachetul și solicită suficient pentru a se potrivi în întregime. Această arhitectură necesită o precauție pentru a evita ca serverul să rămână fără memorie — o limită de dimensiune a pachetului, pe care această opțiune o realizează.

Codul de interes în legătură cu această opțiune se găsește în sql / net_serv.cc . Aruncați o privire la my_net_read () , apoi urmați apelul către my_real_read () și acordați o atenție deosebită net_realloc () .

Această variabilă limitează, de asemenea, lungimea unui rezultat al mai multor funcții de șir. Consultați sql / field.cc și sql / intem_strfunc.cc pentru detalii.

Cunoașterea acestui lucru despre pachetele MySQL permite unui dezvoltator / DBA să le dimensioneze pentru a găzdui mai multe BLOB-uri în interiorul unui pachet, chiar dacă acestea sunt îngrozitor de mari. Cu siguranță, un pachet prea mic va crea probleme pentru conexiunile deschise în acest sens.

Conform Documentația MySQL

  • Puteți primi și aceste erori dacă trimiteți o interogare către server care este incorectă sau prea mare. Dacă MySQL primește un pachet care este prea mare sau nu funcționează, presupune că ceva nu a funcționat corect cu clientul și închide conexiunea. Dacă aveți nevoie de interogări mari (de exemplu, dacă lucrați cu coloane mari BLOB), puteți crește limita de interogare setând variabila max_allowed_packet a serverului, care are o valoare implicită de 1 MB. Poate fi necesar și să măriți valoarea maximă dimensiunea pachetului la capătul clientului. Mai multe informații despre setarea dimensiunii pachetului sunt furnizate în Secțiunea C.5.2.10, „Pachetul prea mare”.

  • O instrucțiune INSERT sau REPLACE care inserează mai multe rânduri poate provoca, de asemenea, aceste tipuri de erori. Oricare dintre aceste instrucțiuni trimite o singură cerere către server, indiferent de numărul de rânduri care trebuie inserate. ; astfel, puteți evita adesea eroarea prin reducerea numărului de rânduri trimise pe INSERT sau REPLACE.

RECOMANDARE

Încercați să ridicați max_allowed_packet la un număr mult mai mare, deoarece valoarea implicită este 1M. Aș sugera de aproximativ 10 ori cel mai mare câmp TEXT sau BLOB pe care îl aveți în setul de date curent.

Pentru a seta max_allowed_packet la 256M, îl puteți adăuga la /etc/my.cnf sau my.ini

[mysqld] max_allowed_packet=256M 

pentru a acoperi viitoarele reporniri ale MySQL. Pentru a instala valoarea acum pe server, rulați acest lucru:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256; 

Încercați !!!

Comentarii

  • Explicație foarte bună.
  • @RolandoMySQLDBA Încă primesc erori în 5.7.28 după ce am încercat toate soluțiile menționate. Orice sfat pentru depanarea suplimentară

Răspuns

În mod implicit, max_connections va fi 100. Încercați să măriți parametrul de configurare

max_connections = 400, după ce setați în my.cnf reporniți serverul sau setați-l dinamic:

 set @@global.max_connections = 400; 

Încercați recomandarea de mai sus pentru evitați aceste mesaje de avertizare și asigurați-vă, de asemenea, că rețeaua dvs. nu are picături de pachete.

Răspuns

Am întâlnit această problemă recent după ce m-am mutat din MySQL Enterprise 5.1.x la 5.7.x , fără modificări semnificative ale codului în aplicație, „ nota ” a început să apară.

În cazul meu, cauza principală a apariției „ note ” a fost programul care ieșea cu conexiunile încă deschise.Circumstanțele pentru conexiunile care nu au fost închise au fost puțin mai implicate și nu au legătură cu MySQL, ci ACE, fire și TSS.

Răspuns

Nu am menționat aici, așa că includ o altă cauză a acestei probleme. În cazul meu, în timp ce utilizați clientul de linie de comandă mysql, eroarea a fost cauzată de o valoare scăzută de 30 de secunde interactive_timeout:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_interactive_timeout
Acest lucru va persista între sesiuni, dar nu va reporni serverul.

SET GLOBAL interactive_timeout=6000; 

Răspuns

Am întâlnit aceeași problemă cu MariaDB 10.3.24. Se pare că avertismentul poate apărea din toate motivele de mai sus și apoi din unele. În cazul meu s-a datorat unei înregistrări într-una din tabelele bazei de date care avea o valoare de dicționar goală pentru unul dintre câmpuri.

+ —- + ——– + | id | config | + —- + ——– + | 3 | {} | + —- + ——– +

Ca test am schimbat „{}” în „()” și asta a oprit mesajul. Doar în caz că ajută pe cineva.

Răspuns

Această linie my.ini a rezolvat problema mea:

log_error_verbosity=1 

Referință acest link

Comentarii

  • Nu ' nu cred că ați rezolvat problema de bază, ci pur și simplu am oprit înregistrarea acesteia.
  • Aveam același mesaj raportat ca " Notă ". Utilizarea log_error_verbosity = 2 rezolvă de fapt problema " problemă " (dar un " avertisment " trebuie adresat, nu ignorat)

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *