Ricerca nel sito web

Suggerimenti utili per risolvere errori comuni in MySQL


MySQL è un sistema di gestione di database relazionali open source ampiamente utilizzato (RDMS) di proprietà di Oracle. Nel corso degli anni è stata la scelta predefinita per le applicazioni basate sul Web e rimane ancora popolare rispetto ad altri motori di database.

Leggi anche: Come installare l'ultimo MySQL su RHEL/CentOS e Fedora

MySQL è stato progettato e ottimizzato per le applicazioni web: costituisce parte integrante delle principali applicazioni basate sul web come Facebook, Twitter, Wikipedia, YouTube e molti altri.

Il tuo sito o la tua applicazione web utilizzano MySQL? In questo articolo dettagliato, spiegheremo come risolvere i problemi e gli errori comuni nel server di database MySQL. Descriveremo come determinare le cause dei problemi e cosa fare per risolverli.

1. Impossibile connettersi al server MySQL locale

Uno degli errori più comuni di connessione da client a server in MySQL è "ERRORE 2002 (HY000): impossibile connettersi al server MySQL locale tramite socket '/var/run/mysqld/mysqld.sock' (2) ”.

Questo errore indica che non c'è alcun server MySQL (mysqld) in esecuzione sul sistema host o che hai specificato un nome file socket Unix o TCP/IP< errato quando si tenta di connettersi al server.

Assicurati che il server sia in esecuzione controllando un processo denominato mysqld sull'host del tuo server database utilizzando il comando ps e il comando grep insieme come mostrato.

ps xa | grep mysqld | grep -v mysqld

Se i comandi precedenti non mostrano alcun output, il server del database non è in esecuzione. Pertanto il client non può connettersi ad esso. Per avviare il server, eseguire il seguente comando systemctl.

sudo systemctl start mysql        #Debian/Ubuntu
sudo systemctl start mysqld       #RHEL/CentOS/Fedora

Per verificare lo stato del servizio MySQL, utilizza il seguente comando.

sudo systemctl status mysql       #Debian/Ubuntu
sudo systemctl status mysqld      #RHEL/CentOS/Fedora

Dall'output del comando precedente, il servizio MySQL non è riuscito. In tal caso, puoi provare a riavviarlo e verificarne nuovamente lo stato.

sudo systemctl restart mysql
sudo systemctl status mysql

Inoltre, se il server è in esecuzione come mostrato dal comando seguente, ma visualizzi ancora l'errore precedente, dovresti anche verificare che la porta TCP/IP sia bloccata da un firewall o da qualsiasi servizio di blocco delle porte .

ps xa | grep mysqld | grep -v mysqld

Per trovare la porta su cui è in ascolto il server, utilizzare il comando netstat come mostrato.

sudo netstat -tlpn | grep "mysql"

2. Impossibile connettersi al server MySQL

Un altro errore di connessione comunemente riscontrato è "(2003) Impossibile connettersi al server MySQL su 'server' (10061)", il che significa che la connessione di rete è stata rifiutata.

Qui, inizia controllando che sul sistema sia in esecuzione un server MySQL come mostrato sopra. Assicurati inoltre che sul server siano abilitate le connessioni di rete e che la porta di rete che stai utilizzando per connetterti sia quella configurata sul server.

Altri errori comuni che potresti riscontrare quando provi a connetterti al server MySQL sono:

ERROR 2003: Can't connect to MySQL server on 'host_name' (111)
ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)

Questi errori indicano che il server potrebbe essere in esecuzione, tuttavia, stai tentando di connetterti utilizzando una porta TCP/IP, una pipe denominata o un file socket Unix diverso da quello su cui è in ascolto il server.

3. Accesso agli errori negati in MySQL

In MySQL, un account utente è definito in termini di un nome utente e dell'host o degli host client da cui l'utente può connettersi al server. Inoltre, un account può anche avere credenziali di autenticazione come una password.

Sebbene esistano molte cause diverse di errori "Accesso negato", una delle cause più comuni è relativa agli account MySQL che il server consente ai programmi client di utilizzare durante la connessione. Indica che il nome utente specificato nella connessione non dispone dei privilegi per accedere al database.

MySQL consente la creazione di account che consentono agli utenti client di connettersi al server e accedere ai dati gestiti dal server. A questo proposito, se riscontri un errore di accesso negato, controlla se l'account utente è autorizzato a connettersi al server tramite il programma client che stai utilizzando, ed eventualmente l'host da cui proviene la connessione .

Puoi vedere quali privilegi ha un determinato account eseguendo il comando SHOW GRANTS come mostrato.

> SHOW GRANTS FOR 'tecmint'@'localhost';

È possibile concedere privilegi a un particolare utente su un database specifico all'indirizzo IP remoto utilizzando i seguenti comandi nella shell MySQL.

> grant all privileges on *.test_db to 'tecmint'@'192.168.0.100';
> flush privileges;

Inoltre, gli errori di accesso negato possono anche derivare da problemi di connessione a MySQL, fare riferimento agli errori spiegati in precedenza.

4. Connessione persa al server MySQL

Potresti riscontrare questo errore a causa di uno dei seguenti motivi: connettività di rete scarsa, timeout della connessione o un problema con valori BLOB maggiori di pacchetto_max_consentito. In caso di problemi di connessione di rete, assicurati di avere una buona connessione di rete, soprattutto se stai accedendo a un server di database remoto.

Se si tratta di un problema di timeout della connessione, in particolare quando MySQL sta tentando di utilizzare una connessione iniziale al server, aumentare il valore del parametro connect_timeout . Ma in caso di valori BLOB maggiori di max_allowed_packet, devi impostare un valore più alto per max_allowed_packet nel tuo /etc /my.cnf nella sezione [mysqld] o [client] come mostrato.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Se il file di configurazione MySQL non è accessibile per te, puoi impostare questo valore utilizzando il seguente comando nella shell MySQL.

> SET GLOBAL connect_timeout=100;
> SET GLOBAL max_allowed_packet=524288000;

5. Troppe connessioni MySQL

Nel caso in cui un client MySQL riscontri l'errore "troppe connessioni", significa che tutte le connessioni disponibili sono utilizzate da altri client. Il numero di connessioni (il valore predefinito è 151) è controllato dalla variabile di sistema max_connections; puoi rimediare al problema aumentandone il valore per consentire più connessioni nel tuo file di configurazione /etc/my.cnf.

[mysqld]
max_connections=1000

6. Memoria esaurita MySQL

Se esegui una query utilizzando il programma client MySQL e riscontri l'errore in questione, significa che MySQL non dispone di memoria sufficiente per archiviare l'intero risultato della query.

Il primo passo è assicurarsi che la query sia corretta, se lo è, procedere come segue:

  • se stai utilizzando direttamente il client MySQL, avvialo con --quick switch, per disabilitare i risultati memorizzati nella cache o
  • se utilizzi il driver MyODBC, l'interfaccia utente di configurazione (UI) dispone di una scheda avanzata per i flag. Seleziona "Non memorizzare nella cache i risultati".

Un altro ottimo strumento è MySQL Tuner: uno script utile che si connetterà a un server MySQL in esecuzione e fornirà suggerimenti su come configurarlo per ottenere prestazioni più elevate.

sudo apt-get install mysqltuner     #Debian/Ubuntu
sudo yum install mysqltuner         #RHEL/CentOS/Fedora
mysqltuner

Per suggerimenti sull'ottimizzazione e l'ottimizzazione delle prestazioni di MySQL, leggi il nostro articolo: 15 suggerimenti utili sull'ottimizzazione e l'ottimizzazione delle prestazioni di MySQL/MariaDB.

7. MySQL continua a bloccarsi

Se riscontri questo problema, dovresti provare a scoprire se il problema è che il server MySQL muore o se è il client ad avere un problema. Tieni presente che molti arresti anomali del server sono causati da file di dati o file di indice danneggiati.

Puoi controllare lo stato del server per stabilire da quanto tempo è attivo e funzionante.

sudo systemctl status mysql       #Debian/Ubuntu
sudo systemctl status mysqld      #RHEL/CentOS/Fedora

In alternativa, esegui il seguente comando mysqladmin per trovare il tempo di attività del server MySQL.

sudo mysqladmin version -p 

Altre soluzioni includono, a titolo esemplificativo, l'arresto del server MySQL e l'abilitazione del debug, quindi il riavvio del servizio. Puoi provare a creare un caso di prova che possa essere utilizzato per ripetere il problema. Inoltre, apri una finestra di terminale aggiuntiva ed esegui il comando seguente per visualizzare le statistiche del processo MySQL mentre esegui le altre query:

sudo mysqladmin -i 5 status
OR
sudo mysqladmin -i 5 -r status 

Il punto: determinare cosa sta causando un problema o un errore

Anche se abbiamo esaminato alcuni problemi ed errori comuni di MySQL e abbiamo anche fornito modi per individuarli e risolverli, la cosa più importante nella diagnosi di un errore è capire cosa significa (in termini di cosa lo sta causando) .

Allora come puoi determinarlo? I seguenti punti ti guideranno su come accertare cosa sta esattamente causando un problema:

  1. Il primo e più importante passo è esaminare i log di MySQL che sono archiviati nella directory /var/log/mysql/. È possibile utilizzare utilità della riga di comando come tail per leggere i file di registro.
  2. Se il servizio MySQL non si avvia, controlla il suo stato usando systemctl o usa il comando journetctl (con il flag -xe) sotto systemd per esaminare il problema.
  3. Puoi anche esaminare il file di registro del sistema come /var/log/messages o simile per individuare le ragioni del tuo problema.
  4. Prova a utilizzare strumenti come Mytop, views, top, ps o htop per verificare quale programma sta occupando tutta la CPU o sta bloccando la macchina o per verificare se stai esaurendo la memoria, lo spazio su disco, i descrittori di file o qualche altra risorsa importante .
  5. Supponendo che il problema sia un processo fuori controllo, puoi sempre provare a terminarlo (usando l'utilità pkill o kill) in modo che MySQL funzioni normalmente.
  6. Supponendo che il server mysqld stia causando problemi, puoi eseguire il comando: mysqladmin -u root ping o mysqladmin -u root processlist per ottenere qualsiasi risposta da esso.
  7. Se il problema riguarda il tuo programma client mentre provi a connetterti al server MySQL, controlla perché non funziona correttamente, prova a ottenere qualsiasi output da esso a scopo di risoluzione dei problemi.

Potrebbe interessarti anche leggere i seguenti articoli relativi a MySQL:

  1. Impara MySQL/MariaDB per principianti – Parte 1
  2. Come monitorare i database MySQL/MariaDB utilizzando Netdata su CentOS 7
  3. Come trasferire tutti i database MySQL dal vecchio al nuovo server
  4. Mytop – Uno strumento utile per monitorare le prestazioni di MySQL/MariaDB in Linux
  5. 12 Best practice per la sicurezza MySQL/MariaDB per Linux

Per ulteriori informazioni, consulta il manuale di riferimento MySQL relativo a problemi ed errori comuni, che elenca in modo completo i problemi comuni e i messaggi di errore che potresti incontrare durante l'utilizzo di MySQL, inclusi quelli di cui abbiamo discusso sopra e altro ancora.