Come appare il messaggio
ERROR 1040 (08004): Too many connections
SQLSTATE[HY000] [1040] Too many connectionsCause frequenti
- Un'applicazione apre connessioni e non le chiude né le riusa, ad esempio senza pool o con troppi worker.
- Query lente o lock tengono occupate le connessioni e le nuove richieste si accumulano.
- Un picco di traffico o un'ondata di bot fa aprire a un'app web molte connessioni insieme.
- Le connessioni inattive restano aperte troppo a lungo perché
wait_timeoutè alto. max_connectionsè semplicemente troppo basso per il carico reale.
Verifica
- Limite attuale
mysql -e "SHOW VARIABLES LIKE 'max_connections'" - Quanto è salito dall'avvio?
mysql -e "SHOW GLOBAL STATUS LIKE 'Max_used_connections'" - Cosa stanno facendo le connessioni?
mysql -e 'SHOW FULL PROCESSLIST' - Quale utente e host ne tiene di più?
mysql -e 'SELECT user, host, COUNT(*) AS n FROM information_schema.processlist GROUP BY user, host ORDER BY n DESC'
Soluzione
- Accedi con un account admin. Il server tiene una connessione in più per gli utenti con il privilegio necessario, quindi l'account root di solito riesce ancora a entrare.
- Cerca la causa nella lista dei processi: molte voci
Sleepindicano client che perdono o inattivi, molte query lunghe indicano query lente o lock. - Se serve, termina le sessioni bloccate con
KILL id;. Interrompe ciò che stanno facendo. - Correggi l'applicazione: usa un connection pool, chiudi le connessioni, limita il numero di worker.
- Solo allora alza il limite, ad esempio
SET GLOBAL max_connections = 300;, e tienilo nella sezione[mysqld]della configurazione. Ogni connessione usa memoria, non andare oltre ciò che la RAM consente. Valuta anche unwait_timeoutpiù basso.
Domande frequenti
È sicuro alzare semplicemente max_connections?
Nasconde la causa e può portare a pressione sulla memoria e all'OOM killer. Alzalo con moderazione e osserva la memoria, dopo aver risolto perdite e query lente.
Non riesco più a entrare, nemmeno come root.
Connettiti come root dal socket locale, che usa lo slot extra. Se anche questo fallisce, riavvia il servizio e correggi l'applicazione prima che si riconnetta.