Uno dei killer silenziosi di MySQL Connections è il pacchetto MySQL. Anche il thread I / O di MySQL Replication può essere vittima di questo.
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 utilizzano 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.
Per lo meno, è necessario assicurarsi che le dimensioni dei pacchetti sia per la macchina da cui si è verificato il mysqldump sia per la macchina che si sta caricando siano identiche.
È possibile adottare due (2) approcci:
APPROCCIO # 1: esegui mysqldump usando --skip-extended-insert
Ciò assicurerà che il pacchetto MySQL non sia inondato da più BLOB, campi TEXT. In questo modo gli INSERTI SQL vengono eseguiti uno alla volta. I principali svantaggi sono
- il mysqldump è molto più grande
- ricaricare una tale discarica richiede molto più tempo.
APPROCCIO # 2: Aumenta max_allowed_packet
Questo potrebbe essere l'approccio preferito perché l'implementazione di questo è solo un riavvio mysql. Comprendere che cos'è il pacchetto MySQL può chiarire questo.
Secondo la pagina 99 di "Comprensione di MySQL Internals" (ISBN 0-596-00957-7) , ecco i paragrafi 1-3 che lo spiegano:
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.
Data questa spiegazione, la creazione di INSERT in blocco caricherà / scaricherà un pacchetto MySQL piuttosto rapidamente. Ciò è particolarmente vero quando max_allowed_packet è troppo piccolo per il dato carico di dati che lo arrivano.
CONCLUSIONE
Nella maggior parte delle installazioni di MySQL, di solito lo imposto su 256M o 512M. Dovresti sperimentare valori più grandi quando i carichi di dati generano errori "MySQL è andato via".
max_allowed_packet
a 900M e stavo usando--skip-extended-insert
(e hai ragione - questo rende huuuge db-dump), ma continua a fallire. Sto sospettando una particolare linea nella discarica ora che probabilmente posso aggirare. Ma è ancora strano: il dump può essere importato bene sul mio server CentOS.