Errore MySQL durante la lettura dei pacchetti di comunicazione


42

Nei log degli errori di MySQL, vedo questi pochi avvisi come questi:

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

Non ho notato alcuna perdita di dati di per sé, quindi mi chiedo cosa significhi questo avviso, o cosa lo causi e se si potrebbe affrontare il problema che li causa. Questo è su RHEL 6.1 e MySQL Enterprise 5.5.

Risposte:


50

Uno dei killer silenziosi di MySQL Connections è il pacchetto MySQL.

Innanzitutto, scopriamo cos'è un pacchetto MySQL.

Secondo la pagina 99 di "Comprensione di MySQL Internals" (ISBN 0-596-00957-7) , ecco i paragrafi 1-3 che spiegano i pacchetti MySQL:

Il codice di comunicazione della rete MySQL è stato scritto partendo dal presupposto che le query sono sempre ragionevolmente brevi e pertanto possono essere inviate ed elaborate dal server in un unico blocco, che viene chiamato pacchetto nella terminologia MySQL. Il server alloca la memoria per un buffer temporaneo per archiviare il pacchetto e richiede abbastanza per adattarlo interamente. Questa architettura richiede una precauzione per evitare che il server esaurisca la memoria, ovvero un limite alla dimensione del pacchetto, che questa opzione consente.

Il codice di interesse in relazione a questa opzione si trova in sql / net_serv.cc . Dai un'occhiata a my_net_read () , quindi segui la chiamata a my_real_read () e presta particolare attenzione a net_realloc () .

Questa variabile limita anche la lunghezza di un risultato di molte funzioni stringa. Vedi sql / field.cc e sql / intem_strfunc.cc per i dettagli.

Sapere questo sui pacchetti MySQL consente a uno sviluppatore / DBA di ridimensionarli per adattarsi a più BLOB all'interno di un pacchetto anche se sono eccessivamente grandi. Sicuramente, un pacchetto troppo piccolo causerà problemi per le connessioni aperte in questo senso.

Secondo la documentazione di MySQL

  • È inoltre possibile ottenere questi errori se si invia una query al server errata o troppo grande. Se mysqld riceve un pacchetto che è troppo grande o fuori servizio, presuppone che qualcosa sia andato storto con il client e chiude la connessione. Se sono necessarie query di grandi dimensioni (ad esempio, se si lavora con colonne BLOB di grandi dimensioni), è possibile aumentare il limite di query impostando la variabile max_allowed_packet del server, che ha un valore predefinito di 1 MB. Potrebbe inoltre essere necessario aumentare la dimensione massima del pacchetto sul lato client. Ulteriori informazioni sull'impostazione della dimensione del pacchetto sono fornite nella Sezione C.5.2.10, "Pacchetto troppo grande".

  • Un'istruzione INSERT o REPLACE che inserisce molte righe può anche causare questo tipo di errori. Una di queste affermazioni invia una singola richiesta al server indipendentemente dal numero di righe da inserire; pertanto, è spesso possibile evitare l'errore riducendo il numero di righe inviate per INSERT o REPLACE.

RACCOMANDAZIONE

Prova ad aumentare il max_allowed_packet a un numero molto più grande, poiché il valore predefinito è 1M. Vorrei suggerire circa 10 volte il più grande campo TEXT o BLOB che hai nel tuo set di dati corrente.

Per impostare max_allowed_packet su 256M, è possibile aggiungerlo a /etc/my.cnf o my.ini

[mysqld]
max_allowed_packet=256M

per coprire i futuri riavvii di mysqld. Per installare il valore ora sul server, eseguire questo:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Provaci !!!


Ottima spiegazione
Vasilis Lourdas,

4

Principalmente per impostazione predefinita max_connections sarà 100. Prova ad aumentare il parametro di configurazione

max_connections = 400, dopo aver impostato in my.cnf riavviare il server o impostarlo dinamicamente:

    set @@global.max_connections = 400;

Prova la raccomandazione sopra per evitare questi messaggi di avviso e assicurati anche che la tua rete non abbia drop di pacchetti.


2

Ho incontrato questo problema da poco dopo il passaggio da MySQL Enterprise 5.1.x alla 5.7.x , senza modifiche al codice significativi per l'applicazione della ' nota ' iniziato a comparire.

Nel mio caso, la causa principale della comparsa della " nota " è stata la chiusura del programma con connessioni ancora aperte. Le circostanze per le connessioni non chiuse erano un po 'più coinvolte e non legate a MySQL ma ACE, thread e TSS.


0

Questa linea my.ini ha risolto il mio problema:

log_error_verbosity=1

Fai riferimento a questo link


16
Non credo che tu abbia risolto il problema di fondo, ma hai semplicemente smesso di registrarlo.
user19292

1
Avevo lo stesso messaggio riportato come "Nota". L'uso di log_error_verbosity = 2 risolve effettivamente il "problema" (ma un "Avvertimento" deve essere affrontato, non ignorato)
xtian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.