Come appare il messaggio
ERROR 2006 (HY000): MySQL server has gone away
PHP Warning: mysqli::query(): MySQL server has gone away in /var/www/app/db.php on line 42Cause frequenti
- La connessione era inattiva da più di
wait_timeout, il server l'ha chiusa e l'app ha riusato la connessione morta, tipico di script e worker di lunga durata. - Una query o una riga è più grande di
max_allowed_packet, ad esempio con un grande import o un blob. - Il server è andato in crash o è stato riavviato, spesso terminato dall'OOM killer, quindi tutte le connessioni sono perse.
- Un firewall, un load balancer o un proxy taglia le connessioni inattive prima del database.
- La connessione è stata terminata con
KILLo il server ha raggiunto un altro limite.
Verifica
- Timeout di inattività
mysql -e "SHOW VARIABLES LIKE 'wait_timeout'" - Dimensione massima del pacchetto
mysql -e "SHOW VARIABLES LIKE 'max_allowed_packet'" - C'è stato un riavvio? Uptime in secondi
mysql -e "SHOW GLOBAL STATUS LIKE 'Uptime'" - Crash, kill o riavvio nel log
Soluzione
- Se
Uptimeè basso o il log mostra un kill, il server è stato riavviato. Capisci prima perché (memoria, crash). L'errore è solo la conseguenza. - Per le connessioni inattive: fai riconnettere l'app su questo errore, o controlla la connessione prima dell'uso (ping). I pool dovrebbero rinnovare le connessioni prima di
wait_timeout. - Per query e import grandi alza il limite sul server, ad esempio
max_allowed_packet = 64Min[mysqld], e anche sul client (mysql --max-allowed-packeto l'impostazione dimysqldump). Il valore è un esempio, dimensionalo sui tuoi dati. - Allinea il timeout di inattività di firewall o proxy con
wait_timeout, oppure invia keepalive. - Non impostare semplicemente
wait_timeoutmolto alto. Accumula connessioni inattive e porta a Too many connections.
Domande frequenti
Perché succede solo dopo una lunga pausa?
Il server ha chiuso la connessione inattiva dopo wait_timeout e l'app l'ha usata dopo. La soluzione è lato client: riconnettere o rinnovare.
Succede solo con import grandi.
Allora il pacchetto è più grande di max_allowed_packet. Alzalo su server e client, oppure dividi l'import in istruzioni più piccole.