Risolvere l’errore “too many connections” in MySQL/MariaDB
L’errore “too many connections” (o “Troppe connessioni”) in MySQL appare quando il numero massimo di connessioni simultanee consentite al server viene superato. Ogni client attivo utilizza una connessione e, una volta raggiunto il limite, non si possono stabilire nuove connessioni. Le cause frequenti sono molte query in esecuzione parallela, connessioni non correttamente chiuse o un valore max_connections impostato troppo basso sul server.
Come si verifica l’errore “too many connections” in MySQL/MariaDB?
Un database può gestire solo un numero limitato di richieste contemporanee. Se questo valore massimo viene superato, MySQL o MariaDB mostreranno l’errore “too many connections”. Ciò può accadere, per esempio, se uno script PHP cerca di stabilire troppe connessioni simultanee con il database relazionale. Anche se hai un’applicazione web che utilizza un database MySQL, è possibile che, in caso di elevata richiesta, si verifichi l’errore “too many connections” in MySQL.
“Troppe connessioni”: come risolvere l’errore MySQL/MariaDB
Ci sono diversi approcci per risolvere l’errore “too many connections”, a seconda di dove si trovi esattamente il problema. Di seguito vengono spiegati dettagliatamente i metodi di risoluzione più comuni.
Soluzione 1: selezionare un nuovo numero massimo di connessioni
La variabile di sistema max_connections determina il numero di connessioni che MySQL/MariaDB accetta. Il valore predefinito è di 151 connessioni, che consente 150 connessioni normali più una connessione dall’account SUPER. SUPER è un privilegio MySQL che assegna permessi di amministrazione all’utente.
Per prima cosa devi decidere quale nuovo valore massimo vuoi impostare per max_connections. Ci sono diverse considerazioni da fare quando si aumenta il numero di connessioni MySQL/MariaDB. Il numero massimo supportato dal sistema dipende dai seguenti fattori:
- La quantità di memoria RAM disponibile
- Quantità di RAM necessaria per ogni connessione (le query semplici richiedono meno RAM rispetto alle connessioni più impegnative)
- Il tempo di risposta accettabile
Secondo la documentazione MySQL, la maggior parte dei sistemi Linux dovrebbe poter supportare facilmente 500-1.000 connessioni.
Regolazione permanente di max_connections
Per modificare permanentemente la variabile max_connections, devi aggiornare il file my.cnf o my.ini.
Apri il file /etc/my.cnf per la modifica con il comando:
sudo nano /etc/my.cnfSubito sotto la prima riga vedrai la seguente voce:
[mysqld]Aggiungi una nuova voce:
max_connections=[desired new maximum number]Regolazione temporanea di max_connections
Per modificare temporaneamente il numero massimo di connessioni solo per la connessione in corso, puoi eseguire il seguente comando nella console MySQL:
SET GLOBAL max_connections = [desired new maximum number];La modifica è valida fino al riavvio del server SQL.
MyWebsite Now Starter è lo strumento pensato per i principianti che vogliono creare un sito web in modo intuitivo. Include dominio e indirizzo e-mail.
Soluzione 2: interrompere le connessioni non utilizzate
Un altro motivo comune per l’errore “too many connections” è che le applicazioni non interrompono correttamente le connessioni al database. Ogni connessione aperta occupa uno slot in MySQL o MariaDB e, se le connessioni non vengono rilasciate, il server può rapidamente raggiungere il numero massimo consentito.
Pertanto, in PHP dovresti sempre chiamare mysqli_close($connection) dopo aver utilizzato una connessione, appena le query sono completate. In Python, si dovrebbe utilizzare il comando equivalente connection.close(). Le applicazioni Node.js dovrebbero usare connection.end().
Un altro approccio collaudato è l’uso dei connection pools. In questo caso, un numero definito di connessioni al database viene gestito centralmente e riutilizzato, anziché aprire una nuova connessione per ogni richiesta. Questo non solo riduce il carico sul server, ma aumenta anche le prestazioni, poiché stabilire e interrompere una connessione richiede tempo.
Soluzione 3: adattare il timeout per le connessioni
Un altro metodo efficace per evitare l’errore “too many connections” è limitare la durata massima delle connessioni inattive. Per impostazione predefinita, MySQL/MariaDB mantiene aperte le connessioni inattive per un periodo relativamente lungo, anche se non eseguono più query. Tuttavia, ognuna di queste connessioni inattive continua a occupare uno slot.
Le variabili di sistema wait_timeout e interactive_timeout determinano per quanto tempo le connessioni inattive rimangono attive prima di essere automaticamente terminate dal server. wait_timeout si applica alle connessioni normali, mentre interactive_timeout è utilizzato per le connessioni da client interattivi, come la console MySQL. Riducendo questi valori, le connessioni “appese” vengono rilasciate più rapidamente.
Adattamento permanente
L’adattamento può essere effettuato in modo permanente nel file di configurazione my.cnf o my.ini. Apri questo file e cerca la seguente voce:
[mysqld]Inserisci le seguenti righe:
wait_timeout=120
interactive_timeout=120In questo modo, ti assicuri che le connessioni inattive non blocchino inutilmente le risorse per un periodo prolungato.
Adattamento temporaneo
Questo adattamento può essere effettuato temporaneamente anche tramite la console MySQL. In questo caso, la modifica sarà valida solo per la connessione in corso e i valori verranno reimpostati al riavvio del server SQL.
SET GLOBAL wait_timeout=120;
SET GLOBAL interactive_timeout=120;
