L'errore 2006 chiamato MySQL Sever è sparito significa che il server ha rifiutato di connettersi anche se è in funzione. Ci sono solo tre ragioni note per cui l'errore appare. Il primo motivo è che il server è sovraccarico. Il tempo di attesa è scaduto. Il secondo motivo è che il client ha inviato un pacchetto troppo doloroso. Il terzo motivo è che il server non è stato completamente inizializzato. Di seguito esamineremo in dettaglio i motivi per cui l'errore viene visualizzato e come risolverlo.
Di solito l'errore compare quando si cerca di connettersi al database utilizzando PHP, il client della console o in caso di utilizzo di PhpMyAdmin:
Esaminiamo separatamente ogni situazione.
Come accennato all'inizio di questo articolo, una delle possibili cause è il tempo di attesa scaduto. Può darsi che il server sia sovraccarico e non riesca a far fronte al carico - elaborando tutte le connessioni. Per capire quanto tempo impiegano le richieste del server, è possibile utilizzare un qualsiasi client di console e connettersi al server. Se si riesce a farlo, eseguire qualsiasi richiesta. Se l'elaborazione delle query richiede troppo tempo, è possibile ottimizzare MySQL utilizzando uno speciale script MySQLTuner. Di solito si aumenta la dimensione del pool del motore InnoDB impostando il parametro innodb_buffer_pool_size
. Il valore ottimale viene determinato con lo script di cui sopra.
Se è 800 megabyte (può essere qualsiasi altra dimensione), impostatelo:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Esiste un altro modo per risolvere il problema. A questo scopo, si aumenta il tempo di risposta del server. Per eseguire questa operazione, è necessario modificare il parametro wait_timeout
. Si tratta del tempo in secondi durante il quale si deve attendere una risposta dal server.
Ad esempio:
wait_timeout=500
Quando si apportano modifiche, non dimenticare di riavviare il server:
$ sudo systemctl restart mysql
Oppure:
$ sudo systemctl restart mariadb
Quando il client di un utente crea troppi pacchetti, il server genera questo errore. La dimensione del pacchetto disponibile (valore massimo) può essere aumentata utilizzando il parametro max_allowed_packet
.
Ad esempio:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Prestare particolare attenzione al client, perché se invia molte richieste, è evidente che si sta facendo qualcosa di sbagliato. Perlomeno, non generate query a MySQL utilizzando cicli for
.
Se decidete di distribuire MySQL o MariaDB in Docker, preparatevi a incontrare un errore simile. L'inizializzazione del contenitore richiede un po' più di tempo libero. Se non si lascia che il contenitore completi l'inizializzazione fermandolo e avviandolo prima, il database restituirà sempre questo errore. La soluzione è rimuovere completamente i dati del contenitore dal database.
Si procede in questo modo:
$ docker-compose down
oppure:
$ docker rm mysql-container
Successivamente, è necessario eliminare lo storage (volume) con il database inizializzato in modo errato. All'inizio, però, si deve scorrere l'elenco di tutti gli archivi:
$ docker volume ls
Dopo l'eliminazione:
$ docker volume rm volume_name
Ora si può iniziare a inizializzare l'applicazione, aspettando che il server di database dica che è pronto e che ci si può connettere.