Mysql
 sql >> Database >  >> RDS >> Mysql

L'errore comune di MySQL:"Ho ricevuto un errore durante la lettura del pacchetto di comunicazione"

MySQL è il secondo database famoso al mondo secondo il sito Web di DB Engine dietro Oracle. Ciò che rende famoso MySQL è probabilmente il fatto che è un sistema di gestione dei database molto veloce, affidabile e flessibile. MySQL è anche uno dei database supportati in ClusterControl. Puoi facilmente distribuire, scalare, monitorare e fare molte cose con ClusterControl.

Oggi non parleremo di nessuno di questi, ma discuteremo uno degli errori comuni per MySQL e possibili suggerimenti per la risoluzione dei problemi. Quando si lavora con i ticket, molte volte quando controlliamo i rapporti di errore o i registri, abbiamo visto questa riga "Si è verificato un errore durante la lettura del pacchetto di comunicazione" abbastanza frequentemente. Pensiamo che sarebbe utile se scrivessimo un blog relativo a questo errore non solo per i nostri clienti ma anche per altri lettori. Non aspettiamo oltre, è ora di immergersi di più!

Protocollo client/server MySQL

Prima di tutto, dobbiamo capire il modo in cui MySQL comunica tra client e server. Sia il client che il server utilizzano il protocollo MySQL implementato da Connectors, MySQL Proxy e anche la comunicazione tra i server di replica master e slave. Il protocollo MySQL supporta funzionalità come la crittografia trasparente tramite SSL, la compressione trasparente, una fase di connessione e una fase di comando.

Sia gli interi che le stringhe sono i tipi di dati di base utilizzati nel protocollo MySQL. Ogni volta che il client e il server MySQL desiderano comunicare tra loro o inviare i dati, dividerà i dati in pacchetti con una dimensione massima di 16 MB e anteporrà anche un'intestazione di pacchetto a ogni blocco. All'interno di ogni pacchetto, ci sarà un carico utile in cui i tipi di dati (interi/stringhe) giocano la loro parte.

Considerando che CLIENT_PROTOCOL_41 è abilitato, per quasi tutti i comandi che il client invia al server, il server risponderà a uno qualsiasi dei seguenti pacchetti come risposta:

OK_Packet

Questo è il segnale per ogni comando riuscito.

ERR_Packet

Il segnale indica un errore per il pacchetto.

Pacchetto_EOF

Questo pacchetto contiene un avviso o un flag di stato.

Come diagnosticare i problemi

In genere, ci sono due tipi di problemi di connessione che sono errori di comunicazione o connessioni interrotte. Ogni volta che si verifica uno di questi problemi di connessione, le seguenti fonti di informazioni sono un buon punto di partenza per la risoluzione dei problemi e l'analisi:

  • Il registro degli errori

  • Il registro generale delle query

  • Le variabili di stato Aborted_xxx e Connection_errors_xxx

  • La cache dell'host

Errori di connessione e possibili motivi

Se si verificano errori di connessione ea seconda degli errori, aumenterà il contatore di stato per Aborted_clients o Aborted_connects nelle variabili di stato. Come tratto dalla documentazione di MySQL, Aborted_clients indica il numero di connessioni che sono state interrotte perché il client è morto senza chiudere correttamente la connessione. Per quanto riguarda Aborted_connects, indica il numero di tentativi falliti di connessione al server MySQL.

Se avvii il server MySQL con l'opzione --log-warnings, è probabile che vedrai l'esempio del seguente messaggio nel tuo log degli errori. Come hai notato, il messaggio dice chiaramente che si riferisce alla connessione interrotta, quindi il contatore di stato Aborted_connects verrà incrementato nella variabile di stato:

[Avviso] Connessione interrotta 154669 a db:'wordpress' utente:'wpuser' host:'hostname' (si è verificato un errore durante la lettura dei pacchetti di comunicazione)

Normalmente, potrebbero verificarsi tentativi di connessione non riusciti per i seguenti motivi. Quando l'hai notato, probabilmente indica che una persona non autorizzata sta per violare il database e potresti voler dare un'occhiata il prima possibile:

  • Un client non ha privilegi per accedere al database.

  • È stata utilizzata una credenziale errata.

  • Un pacchetto di connessione che contiene informazioni errate.

  • A causa del limite raggiunto per connect_timeout per la connessione.

La variabile di stato per Aborted_clients verrà incrementata dal server se un client riesce a connettersi ma viene disconnesso o terminato in modo improprio. In aggiunta a ciò, il server registrerà anche un messaggio di connessione interrotta nel registro degli errori. Per questo tipo di errore, comunemente potrebbe essere dovuto al seguente motivo:

  • Il client non chiude correttamente la connessione prima di uscire (non chiama mysql_close()).

  • Il client ha superato i secondi wait_timeout o interactive_timeout.

  • Il programma client o l'applicazione è terminata improvvisamente durante il trasferimento dei dati.

Oltre ai motivi precedenti, altri probabili motivi sia per le connessioni interrotte che per i problemi dei client interrotti potrebbero essere correlati a uno dei seguenti:

  • Configurazione TCP/IP incasinata.

  • Il valore della variabile è troppo piccolo per max_allowed_packet.

  • allocazione di memoria insufficiente per le query.

  • Hardware difettoso come ethernet, switch, cavi, ecc.

  • Problemi con la libreria dei thread.

  • Problema della sindrome duplex per cui il trasferimento va in modalità burst-pause-burst-pause (se si utilizza il protocollo ethernet con Linux, sia half che full duplex).

Come correggere gli errori di comunicazione MySQL

Ora che abbiamo appreso molte potenzialità che hanno causato errori di connessione a MySQL. In base alla nostra esperienza, il più delle volte questo problema è correlato al firewall oa problemi di rete. È anche giusto dire che non è facile diagnosticare questo tipo di problema. Tuttavia, la seguente soluzione potrebbe essere utile per risolvere questo errore:

  • Se la tua applicazione si basa su wait_timeout per chiudere la connessione, vale la pena modificare la logica dell'applicazione in modo che sia correttamente chiuso al termine di ogni operazione.

  • Assicurarsi che il valore per max_allowed_packet rientri nell'intervallo accettabile in modo che il client non riceva alcun errore relativo a il “pacchetto troppo grande”.

  • Per problemi di ritardo di connessione che potrebbero essere dovuti al DNS, vale la pena controllare se hai skip-name- risoluzione abilitata.

  • Se stai usando un'applicazione PHP o qualsiasi altra programmazione, la cosa migliore è assicurarti che non si interrompa le connessioni che sono tipicamente impostate a max_execution_time.

  • Se hai notato molte notifiche TIME_WAIT da netstat, vale la pena confermare che le connessioni sono ben gestite sul fine dell'applicazione.

  • Se stai usando Linux e sospetti che il problema sia dovuto alla rete, è meglio controllare l'interfaccia di rete utilizzando il comando ifconfig-a ed esamina l'output sul server MySQL per eventuali errori.

  • Per gli utenti ClusterControl, è possibile abilitare Audit Log dal Cluster -> Sicurezza -> Audit Log. Abilitando questa funzione, potrebbe aiutarti a restringere il campo per trovare quale query è il colpevole.

  • Strumenti di rete come tcpdump e Wireshark potrebbero essere utili per identificare potenziali problemi di rete, timeout e problemi di risorse per MySQL.

  • Controlla regolarmente l'hardware assicurandoti che non ci siano dispositivi difettosi soprattutto per ethernet, hub, switch, cavi ecc. Vale la pena sostituire l'apparecchio difettoso per assicurarsi che la connessione sia sempre buona.

Conclusione

Ci sono molte ragioni che potrebbero portare a problemi con il pacchetto di connessione MySQL. Ogni volta che si verifica questo problema, influenzerà sicuramente l'attività e le operazioni quotidiane. Anche se questo tipo di problema non è facile da diagnosticare e il più delle volte è dovuto alla rete o al firewall, vale la pena prendere in considerazione tutti i passaggi suggeriti in precedenza per risolvere il problema. Speriamo davvero che questo post sul blog possa aiutarti in qualche modo, specialmente quando affronti questo problema.