Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

MySQL, cause e rimedi negli errori di accesso

Descrizione e soluzione degli errori di accesso ad un database MySQL: errori di porte, password, host e utenti
Descrizione e soluzione degli errori di accesso ad un database MySQL: errori di porte, password, host e utenti
Link copiato negli appunti

Durante i tentativi di accesso a MySQL possono verificarsi errori di diversa natura, fortunatamente il DBMS mette a disposizione un efficace sistema di gestione delle eccezioni; esso è in grado di segnalare le differenti tipologie di errore con notifiche attraverso cui poter risalire alle cause e individuare le opportune soluzioni. In questo breve tutorial analizzeremo alcuni possibili errori d'accesso, descriveremo in quali modi si possa rimediare ad essi e con quali strumenti.

Problemi con porte e socket files

Una prima causa (la più semplice) di errore durante la fase di accesso al DBMS potrebbe essere correlata al fatto che il server non è stato avviato, in questo caso potremmo ricevere delle notifiche di errore simili alle seguenti:

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

dove "localhost" può essere sostituito con qualsiasi nome di Host si voglia specificare.

Questa tipologia di notifica viene lanciata anche nel caso in cui si cerchi di accedere al DBMS tramite un una porta o un socket diversi da quelli ammessi da MySQL; per ovviare a questo problema sarà quindi opportuno passare in istruzione come parametro anche il numero della porta da cui si desidera accedere (attraverso l'opzione --port) o il nome del socket file da utilizzare (opzione --socket).

I socket files impiegati in ambiente Unix possono non essere noti all'utilizzatore, in questo caso si ha a disposizione un comando specifico in grado di localizzarli:

shell> netstat -ln | grep mysql

Problemi con utenti e privilegi

Un'altra problematica in grado di verificarsi durante l'accesso a MySQL potrebbe essere correlata all'assenza di privilegi (GRANT) definiti. I privilegi sono appunto diritti di accesso al DBMS assegnati ai diversi utenti. L'impossibilità di accedere potrebbe essere dovuta alla completa mancanza di utenti e dei relativi privilegi.

A questo punto sarà opportuno controllare nella directory principale di MySQL e aprire la cartella relativa ai database (generalmente chiamata data); all'interno di essa deve essere contenuto un archivio chiamato user.MYD, se dovesse mancare bisognerà lanciare lo script mysql_install_db che provvederà alla sua creazione.

Una volta eseguito lo script sarà possibile testare l'esistenza di utenti dotati di privilegi attraverso la seguente istruzione dal linea di comando:

shell> mysql -u root test

Se il test da esito positivo, cioè non invia notifiche di errore, sarà possibile accedere come root alla gestione degli users e aggiungerne di nuovi; l'unico utente creato dallo script è infatti quello di root che è però privo di password per default, tanto che sarà possibile accedere al DBMS specificandone unicamente il nome:

mysql -u root mysql 

Il consiglio è naturalmente quello di rimediare immediatamente a questa situazione per evidenti motivi legati alla sicurezza delle basi di dati.

È possibile anche che l'accesso a MySQL sia impedito quando si cerca di autenticarsi come root, la spiegazione più plausibile a questa evenienza è che nella tabella "user" non sia presente un record valorizzato come root, magari perché rimosso inavvertitamente. In questo caso potremmo ricevere in risposta al tentativo di connessione la seguente notifica:

Access denied for user ''@'unknown' to database mysql

La soluzione sta nel "bypassare" il problema: infatti non sarà possibile accedere come root e dovremo sospendere i privilegi concessi per riavviare il DBMS utilizzando l'opzione --skip-grant-tables (letteralmente: "ignora la tabella dei privilegi"). A questo punto sarà necessario modificare il file host (in Linux e Unix generalmente conservato nella cartella /etc) e aggiungere manualmente l'host da cui cercheremo di accedere.

Problemi con le password

La notifica Access denied può essere generata anche da parametri inseriti in file di configurazione o variabili d'ambiente utilizzati dai client per accedere a MySQL. Può quindi accadere che il tentativo di connessione venga effettuato apparentemente tramite dati di accesso corretti, ma la presenza di parole chiave definite in precedenza impediscano l'accesso.

Per ovviare a casi del genere, sarà opportuno controllare che l'autenticazione avvenga senza riferimento a vecchi dati di login; la procedura più efficace consiste nel evitare che questi vengano richiamati, a questo scopo si utilizzerà l'opzione --no-defaults all'interno del comando:

shell> mysqladmin --no-defaults -u root version

Chiaramente è sempre possibile che la password specificata sia scorretta, il DBMS prevede una notifica apposita per segnalare questa evenienza:

shell> mysqladmin -u root -password-sbagliata
Access denied for user 'root'@'localhost' (using password: YES)

"using password: YES" indica infatti che la parola chiave è stata utilizzata, ma anche che non è stata ritenuta valida per consentire l'accesso.

A questo punto le possibilità sono due: o si è verificato il caso descritto in precedenza (risolvibile con l'opzione --no-defaults), oppure.. ci siamo dimenticati la password dell'utente di root! Capita, si tratta di un problema non da poco ma anche a questo c'è rimedio. MySQL ci permette infatti di essere riavviato tramite l'opzione --skip-grant-tables (ne abbiamo parlato in precedenza) e di resettare la password di root definendone una nuova.

Un altro caso che può verificarsi è quello relativo al fatto di tentare l'accesso tramite una password che è esattamente quella che abbiamo definito ma che il DBMS non considera tale. Per esempio: abbiamo associato all'utente di root la parola chiave "pippo" e cerchiamo di loggarci con essa, la password è corretta ma MySQL la ritiene non valida. Perché avviene questo?

Parlando molto semplicemente diremo che il server MySQL non accetta le password definite dagli utenti "così come sono" ma le converte tramite la funzione PASSWORD(); quando un utente cerca di autenticarsi, egli immette una parola chiave che gli consentirà l'accesso soltanto dopo essere stata convertita tramite la funzione di criptaggio e confrontata con il contenuto della tabella "user". Se "pippo" è corretta per l'utente, solo PASSWORD('pippo') è corretta per il DBMS.

Non dovremo per questo mai associare ad un utente una password utilizzando la seguente sintassi:

SET PASSWORD FOR 'utente'@'localhost' = 'pippo';

Piuttosto dovremo utilizzare questo secondo tipo di sintassi:

SET PASSWORD FOR 'utente'@'localhost' = PASSWORD('pippo');

In alternativa, sarà opportuno sfruttare le istruzioni GRANT e CREATE USER, oppure il comando mysqladmin password, grazie ai quali la funzione PASSWORD() verrà utilizzata automaticamente da MySQL.

Problemi di Host

Host nome_host is not allowed to connect to this MySQL server

Questa è la notifica di errore che ci viene restituita dal server MySQL quando durante un tentativo di accesso viene indicato un Host errato. Alcuni client considerano l'hostname locale ("localhost") come Host di default nel caso in cui non ne venga specificato uno diverso dall'utilizzatore. "Localhost" non è però un parametro sempre valido, quindi sarà necessario specificare l'Host di connessione tramite l'opzione --host=nome_host.

L'Host indicato dovrà essere necessariamente definito come valore nella tabella "user" di MySQL, se per caso non si dovesse conoscere alcun nome di Host valido, si potrà tentare un login come root e operare una SELECT sulla tabella "user" dove ad ogni utente sarà generalmente associato un determinato Host. Quando non si conosce il nome di Host (che può essere anche un indirizzo Ip) del terminale da cui si cerca di effettuare la connessione, per definire l'Host nella tabella "user" è possibile utilizzare il carattere speciale % (wildcard che sta per "tutti i caratteri").

Una volta stabilita la connessione col DBMS sarà possibile effettuare una SELECT USER() attraverso cui scoprire l'effettivo nome di Host. Appena rilevato l'Host corretto, sarà opportuno sostituire il simbolo percentuale con esso, % non è infatti un parametro sicuro in quanto permette connessioni da qualsiasi client indipendentemente dall'Host di provenienza.

In alcuni casi, è possibile ricevere una notifica di errore in cui l'Host da cui si sta tentando di accedere non viene visualizzato nonostante sia stato opportunamente specificato; in questi casi è molto probabile che il DBMS non sia stato in grado di risolvere l'Ip dell'Host che gli abbiamo passato come parametro.

Evenienze del genere indicano molto probabilmente un problema a livello di DNS, problema che può essere risolto utilizzando l'istruzione mysqladmin flush-hosts che permetterà di ripulire la cache dei DNS relativa ai nomi di Host.

Conclusioni

In queste pagine abbiamo cercato di analizzare buona parte delle cause di errore nelle procedure di accesso a MySQL. Sono state identificate 4 categorie principali di errori relative a: porte e socket files, utenti e privilegi, password e hostname; per ogni categoria sono state proposte tra le possibili soluzioni quelle più semplici, che sono in molti casi anche le più efficaci.

Ti consigliamo anche