L’errore “too many con­nec­tions” (o “Troppe con­nes­sio­ni”) in MySQL appare quando il numero massimo di con­nes­sio­ni si­mul­ta­nee con­sen­ti­te al server viene superato. Ogni client attivo utilizza una con­nes­sio­ne e, una volta raggiunto il limite, non si possono stabilire nuove con­nes­sio­ni. Le cause frequenti sono molte query in ese­cu­zio­ne parallela, con­nes­sio­ni non cor­ret­ta­men­te chiuse o un valore max_connections impostato troppo basso sul server.

Come si verifica l’errore “too many con­nec­tions” in MySQL/MariaDB?

Un database può gestire solo un numero limitato di richieste con­tem­po­ra­nee. Se questo valore massimo viene superato, MySQL o MariaDB mo­stre­ran­no l’errore “too many con­nec­tions”. Ciò può accadere, per esempio, se uno script PHP cerca di stabilire troppe con­nes­sio­ni si­mul­ta­nee con il database re­la­zio­na­le. Anche se hai un’ap­pli­ca­zio­ne web che utilizza un database MySQL, è possibile che, in caso di elevata richiesta, si verifichi l’errore “too many con­nec­tions” in MySQL.

“Troppe con­nes­sio­ni”: come risolvere l’errore MySQL/MariaDB

Ci sono diversi approcci per risolvere l’errore “too many con­nec­tions”, a seconda di dove si trovi esat­ta­men­te il problema. Di seguito vengono spiegati det­ta­glia­ta­men­te i metodi di ri­so­lu­zio­ne più comuni.

Soluzione 1: se­le­zio­na­re un nuovo numero massimo di con­nes­sio­ni

La variabile di sistema max_connections determina il numero di con­nes­sio­ni che MySQL/MariaDB accetta. Il valore pre­de­fi­ni­to è di 151 con­nes­sio­ni, che consente 150 con­nes­sio­ni normali più una con­nes­sio­ne dall’account SUPER. SUPER è un pri­vi­le­gio MySQL che assegna permessi di am­mi­ni­stra­zio­ne all’utente.

Per prima cosa devi decidere quale nuovo valore massimo vuoi impostare per max_connections. Ci sono diverse con­si­de­ra­zio­ni da fare quando si aumenta il numero di con­nes­sio­ni MySQL/MariaDB. Il numero massimo sup­por­ta­to dal sistema dipende dai seguenti fattori:

  • La quantità di memoria RAM di­spo­ni­bi­le
  • Quantità di RAM ne­ces­sa­ria per ogni con­nes­sio­ne (le query semplici ri­chie­do­no meno RAM rispetto alle con­nes­sio­ni più im­pe­gna­ti­ve)
  • Il tempo di risposta ac­cet­ta­bi­le

Secondo la do­cu­men­ta­zio­ne MySQL, la maggior parte dei sistemi Linux dovrebbe poter sup­por­ta­re fa­cil­men­te 500-1.000 con­nes­sio­ni.

Re­go­la­zio­ne per­ma­nen­te di max_connections

Per mo­di­fi­ca­re per­ma­nen­te­men­te la variabile max_connections, devi ag­gior­na­re il file my.cnf o my.ini.

Apri il file /etc/my.cnf per la modifica con il comando:

sudo nano /etc/my.cnf

Subito sotto la prima riga vedrai la seguente voce:

[mysqld]

Aggiungi una nuova voce:

max_connections=[desired new maximum number]

Re­go­la­zio­ne tem­po­ra­nea di max_connections

Per mo­di­fi­ca­re tem­po­ra­nea­men­te il numero massimo di con­nes­sio­ni solo per la con­nes­sio­ne 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.

Sito web con dominio
Crea il tuo sito web per­so­na­liz­za­to

MyWebsite Now Starter è lo strumento pensato per i prin­ci­pian­ti che vogliono creare un sito web in modo intuitivo. Include dominio e indirizzo e-mail.

Soluzione 2: in­ter­rom­pe­re le con­nes­sio­ni non uti­liz­za­te

Un altro motivo comune per l’errore “too many con­nec­tions” è che le ap­pli­ca­zio­ni non in­ter­rom­po­no cor­ret­ta­men­te le con­nes­sio­ni al database. Ogni con­nes­sio­ne aperta occupa uno slot in MySQL o MariaDB e, se le con­nes­sio­ni non vengono ri­la­scia­te, il server può ra­pi­da­men­te rag­giun­ge­re il numero massimo con­sen­ti­to.

Pertanto, in PHP dovresti sempre chiamare mysqli_close($connection) dopo aver uti­liz­za­to una con­nes­sio­ne, appena le query sono com­ple­ta­te. In Python, si dovrebbe uti­liz­za­re il comando equi­va­len­te connection.close(). Le ap­pli­ca­zio­ni Node.js do­vreb­be­ro usare connection.end().

Un altro approccio col­lau­da­to è l’uso dei con­nec­tion pools. In questo caso, un numero definito di con­nes­sio­ni al database viene gestito cen­tral­men­te e riu­ti­liz­za­to, anziché aprire una nuova con­nes­sio­ne per ogni richiesta. Questo non solo riduce il carico sul server, ma aumenta anche le pre­sta­zio­ni, poiché stabilire e in­ter­rom­pe­re una con­nes­sio­ne richiede tempo.

Soluzione 3: adattare il timeout per le con­nes­sio­ni

Un altro metodo efficace per evitare l’errore “too many con­nec­tions” è limitare la durata massima delle con­nes­sio­ni inattive. Per im­po­sta­zio­ne pre­de­fi­ni­ta, MySQL/MariaDB mantiene aperte le con­nes­sio­ni inattive per un periodo re­la­ti­va­men­te lungo, anche se non eseguono più query. Tuttavia, ognuna di queste con­nes­sio­ni inattive continua a occupare uno slot.

Le variabili di sistema wait_timeout e interactive_timeout de­ter­mi­na­no per quanto tempo le con­nes­sio­ni inattive rimangono attive prima di essere au­to­ma­ti­ca­men­te terminate dal server. wait_timeout si applica alle con­nes­sio­ni normali, mentre interactive_timeout è uti­liz­za­to per le con­nes­sio­ni da client in­te­rat­ti­vi, come la console MySQL. Riducendo questi valori, le con­nes­sio­ni “appese” vengono ri­la­scia­te più ra­pi­da­men­te.

Adat­ta­men­to per­ma­nen­te

L’adat­ta­men­to può essere ef­fet­tua­to in modo per­ma­nen­te nel file di con­fi­gu­ra­zio­ne my.cnf o my.ini. Apri questo file e cerca la seguente voce:

[mysqld]

Inserisci le seguenti righe:

wait_timeout=120
interactive_timeout=120

In questo modo, ti assicuri che le con­nes­sio­ni inattive non blocchino inu­til­men­te le risorse per un periodo pro­lun­ga­to.

Adat­ta­men­to tem­po­ra­neo

Questo adat­ta­men­to può essere ef­fet­tua­to tem­po­ra­nea­men­te anche tramite la console MySQL. In questo caso, la modifica sarà valida solo per la con­nes­sio­ne in corso e i valori verranno reim­po­sta­ti al riavvio del server SQL.

SET GLOBAL wait_timeout=120;
SET GLOBAL interactive_timeout=120;
Vai al menu prin­ci­pa­le