MySQL ERROR 1045 (28000): Accesso negato per l'utente 'bill' @ 'localhost' (utilizzando la password: SÌ)


430

Prima di tutto lasciatemi dire che ho affrontato molte domande suggerite e non ho trovato una risposta pertinente. Ecco cosa sto facendo.

Sono collegato alla mia istanza di Amazon EC2. Posso accedere con il root di MySQL con questo comando:

mysql -u root -p

Quindi ho creato una nuova fattura utente con% host

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

Concessi tutti i privilegi di fatturazione utente:

grant all privileges on *.* to 'bill'@'%' with grant option;

Quindi esco dall'utente root e provo ad accedere con bill:

mysql -u bill -p

inserito la password corretta e ottenuto questo errore:

ERRORE 1045 (28000): Accesso negato per l'utente 'bill' @ 'localhost' (utilizzando la password: SÌ)



6
Ok, l'ho provato senza successo. Qualsiasi altro suggerimento per favore.
Ali,

1
Quale versione del server stai utilizzando? Ho visto 5.1 comportarsi in modo strano su questo.
Poodlehat,

2
Questo è successo a me durante l'installazione di Magento e ho fatto un errore molto più sciocco. Mettere "mysql -u magento -p magento" mi
chiedeva

2
@authentictech sfortunatamente, nessuna delle soluzioni suggerite ha funzionato per me al momento della pubblicazione di questa domanda. Per favore, vedi la mia risposta che mi ha aiutato a uscire da questa situazione. Questo è il motivo per cui non ho segnato nessuno di loro come risposta. Probabilmente posso contrassegnare la risposta classificata più alta come risposta.
Ali,

Risposte:


442

Probabilmente hai un utente anonimo ''@'localhost'o ''@'127.0.0.1'.

Come da manuale :

Quando sono possibili più corrispondenze, il server deve determinare quale di esse utilizzare. Risolve questo problema come segue: (...)

  • Quando un client tenta di connettersi, il server esamina le righe [della tabella mysql.user] in ordine ordinato.
  • Il server utilizza la prima riga che corrisponde al nome host e al nome utente del client.

(...) Il server utilizza regole di ordinamento che ordinano per prime le righe con i valori Host più specifici . I nomi host letterali [come 'localhost'] e gli indirizzi IP sono i più specifici.

Quindi, un utente così anonimo "maschererebbe" qualsiasi altro utente come '[any_username]'@'%'quando si connette localhost.

'bill'@'localhost'corrisponde 'bill'@'%', ma corrisponderebbe (ad esempio) ''@'localhost'prima delle mani.

La soluzione consigliata è eliminare questo utente anonimo (questa è generalmente una buona cosa da fare comunque).


Le modifiche di seguito sono per lo più irrilevanti per la domanda principale. Questi servono solo per rispondere ad alcune domande sollevate in altri commenti all'interno di questa discussione.

Modifica 1

Autenticazione come 'bill'@'%'tramite un socket.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    Benvenuti nel monitor MySQL (...)

    mysql> SELEZIONA utente, host DA mysql.user;
    + ------ + ----------- +
    | utente | host |
    + ------ + ----------- +
    | fattura | % |
    | radice | 127.0.0.1 |
    | radice | :: 1 |
    | radice | localhost |
    + ------ + ----------- +
    4 righe in set (0,00 sec)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | UTENTE () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | fattura @% |
    + ---------------- + ---------------- +
    1 riga in set (0,02 sec)

    mysql> MOSTRA VARIABILI COME 'skip_networking';
    + ----------------- + ------- +
    | Nome variabile | Valore |
    + ----------------- + ------- +
    | skip_networking | ON |
    + ----------------- + ------- +
    1 riga nel set (0,00 sec)

Modifica 2

Stessa configurazione, tranne che ho riattivato la rete e ora creo un utente anonimo ''@'localhost'.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    Benvenuti nel monitor MySQL (...)

    mysql> CREA UTENTE '' @ 'localhost' IDENTIFICATO DA 'anotherpass';
    Query OK, 0 righe interessate (0.00 sec)

    mysql> Ciao

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / tmp / mysql-5.5.sock
    ERRORE 1045 (28000): Accesso negato per l'utente 'bill' @ 'localhost' (utilizzando la password: SÌ)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol = TCP
    ERRORE 1045 (28000): Accesso negato per l'utente 'bill' @ 'localhost' (utilizzando la password: SÌ)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = TCP
    ERRORE 1045 (28000): Accesso negato per l'utente 'bill' @ 'localhost' (utilizzando la password: SÌ)

Modifica 3

Stessa situazione della modifica 2, fornendo ora la password dell'utente anonimo.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    Benvenuti nel monitor MySQL (...)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | UTENTE () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | @localhost |
    + ---------------- + ---------------- +
    1 riga in set (0,01 sec)

Conclusione 1, dalla modifica 1: è possibile autenticarsi come 'bill'@'%'tramite un socket.

Conclusione 2, dalla modifica 2: se uno si connette tramite TCP o tramite un socket non ha alcun impatto sul processo di autenticazione (tranne uno non può connettersi come chiunque altro ma 'something'@'localhost'tramite un socket, ovviamente).

Conclusione 3, dalla modifica 3: Anche se ho specificato -ubill, mi è stato concesso l'accesso come utente anonimo. Ciò è dovuto alle "regole di ordinamento" sopra indicate. Si noti che nella maggior parte delle installazioni predefinite esiste un utente anonimo senza password (che deve essere protetto / rimosso).


9
Per chiunque sia curioso di sapere perché 'bill' @ 'localhost' corrisponde '' @ 'localhost' come ero io, una stringa vuota agisce effettivamente un jolly nell'algoritmo di autenticazione di MySQL.
Decano o

2
@Sanja Fai molta attenzione con questa soluzione alternativa. È possibile consentire l'accesso anonimo al database da qualsiasi posizione. In caso di dubbio, preferirei eliminare l'utente.
RandomSeed

7
@RandomSeed Grazie per questo commento! Probabilmente dovrei semplicemente eliminare l'utente anonimo. PS Ho trovato dev.mysql.com/doc/refman/5.1/en/default-privileges.html che dice che questi utenti sicuramente possono essere eliminati: DROP USER ''@'localhost';. Non sono necessari per alcuno scopo speciale.
Alex,

1
Ho lasciato cadere l'utente anonimo, ma le cose non funzionavano ancora. Poi ho scoperto che dovevo pubblicare anche "FLUSH PRIVILEGES". Sarebbe utile menzionare anche questo.
Neeme Praks,

2
Questa è la risposta! Perché questo non arriva in grassetto maiuscolo in ogni manuale di mysql. ELIMINA L'UTILIZZATORE ANONIMO O UCCIDERÀ TUTTI I TUOI TENTATIVI PER ACCEDERE DA LOCALHOST!
Sergei,

140

Provare:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;

10
Questo è piuttosto pericoloso, se qualcuno hackera il tuo account mysql bill @ localhost, avrà un accesso infinito a tutti i database del tuo server mysql.
Adonis K. Kakoulidis,

2
Whehey. Ho dovuto mettere un preventivo intorno al mio utente 'myusername'@'myhost.static.myip.com', quindi ha funzionato.
bendecko,

Funziona per me, ma temo di aver dato troppi privilegi per l'utente
Csaba Toth,

1
@CsabaToth hai fatto, riduci nuovamente i privilegi fino a quando il tuo utente non ha ciò di cui ha bisogno e non di più.
jwenting,

... e cosa fai se questo ti dà "Accesso negato per l'utente 'root' @ 'localhost' (usando la password: SÌ)" allora?
Grunion Shaftoe,

75

Quando hai corso

mysql -u bill -p

e ho ottenuto questo errore

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

mysqld si aspetta che tu ti connetta come bill@localhost

Prova a creare bill@localhost

CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;

Se si desidera connettersi in remoto, è necessario specificare il nome DNS, l'IP pubblico o 127.0.0.1 utilizzando TCP / IP:

mysql -u bill -p -hmydb@mydomain.com
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP

Una volta effettuato l'accesso, esegui questo

SELECT USER(),CURRENT_USER();

USER () riporta come hai tentato di autenticarti in MySQL

CURRENT_USER () riporta come ti è stato permesso di autenticarti in MySQL dalla tabella mysql.user

Questo ti darà una visione migliore di come e perché ti è stato permesso di accedere a mysql. Perché è importante sapere questo punto di vista? Ha a che fare con il protocollo di ordinazione dell'autenticazione utente.

Ecco un esempio: creerò un utente anonimo sul mio desktop MySQL

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)

mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| x       | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
|         | %         |
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql>

OK guardami accedere come utente anonimo:

C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select user(),current_user();
+---------------+----------------+
| user()        | current_user() |
+---------------+----------------+
| rol@localhost | @%             |
+---------------+----------------+
1 row in set (0.00 sec)

mysql>

L'ordine di autenticazione è molto severo. Controlla dal più specifico al minimo. Ho scritto di questo stile di autenticazione in DBA StackExchange .

Non dimenticare di chiamare esplicitamente TCP come protocollo per il client mysql quando necessario.


1
'bill'@'localhost'dovrebbe corrispondere 'bill@%', no?
RandomSeed,

@Yak l'ordinamento non si basa esclusivamente sulla colonna utente di mysql.user. MySQL non esegue alcuna corrispondenza di carattere di per sé. Ho scritto del protocollo di ordinazione dell'autenticazione utente in DBA StackExchange: dba.stackexchange.com/a/10897/877
RolandoMySQLDBA il

@YaK Questo è il motivo per cui ho menzionato in modo specifico SELECT USER(),CURRENT_USER();. Non si vede quasi mai apparire utenti anonimi da queste due funzioni se non in configurazioni davvero scadenti.
RolandoMySQLDBA,

1
Non ho mai pensato che l'ordinamento fosse basato esclusivamente su mysql.user. In effetti, se leggi di nuovo la mia risposta, vedrai che ho detto (in realtà, il manuale dice) che l'ordinamento si basa prima sulla hostcolonna. Hai scritto molto su come controllare le tue credenziali attuali, ma vedo poche informazioni sul perché 'bill'@'localhost'non riesco ad accedere come 'bill'@'%', che è la domanda di oggi AFAIK. L'OP probabilmente ha una configurazione scadente, è per questo che riceve questi errori.
RandomSeed,

2
--protocol=TCPera la chiave. Grazie mille!
lfx,

22

Super tardi a questo

Ho provato tutte queste altre risposte e ho eseguito molte versioni diverse mysql -u root -pma non ho mai funzionato


mysql -u root -p

E basta premere [ENTER]per la password.


Una volta che l'ho fatto ha funzionato. Spero che questo aiuti qualcuno.


18

Un problema correlato nel mio caso stava provando a connettersi utilizzando:

mysql -u mike -p mypass

Lo spazio bianco è apparentemente consentito tra -u # uname # ma NON tra -p e # password #

Pertanto necessario:

mysql -u mike -pmypass

Altrimenti con uno spazio tra -p mypass mysql prende 'mypass' come nome del db


1
oppure: mysql -u usrname -p - questo impedisce a chiunque di vedere la password in quanto lascerà cadere una nuova riga e chiederà la password senza visualizzarla

ottima risposta @mstram
Arpit Solanki,

1
questa soluzione è comoda, tuttavia non è sicuro digitare la password ovviamente, ma non è necessario concedere i privilegi e definire altre cose. Quindi, se il tuo Mac Book è sicuro - questo approccio è molto comodo, ancora di più l'ho usato per importare dati in aws dal driver mysql docker.
dimpiax,

17

Durante la digitazione mysql -u root -p, ci si connette al server mysql tramite un socket unix locale.

Tuttavia, la concessione che hai concesso 'bill'@'%'corrisponde solo alle connessioni TCP / IP in modo abbastanza curioso.

Se si desidera concedere l'accesso al socket unix locale, è necessario concedere i privilegi a 'bill' @ 'localhost', che curiosamente non è lo stesso di 'bill'@'127.0.0.1'

È inoltre possibile connettersi tramite TCP / IP con il client della riga di comando mysql, in modo da corrispondere ai privilegi già concessi, ad esempio eseguire mysql -u root -p -h 192.168.1.123o l'indirizzo IP locale presente nella propria casella.


"'bill' @ '%' corrisponde solo alle connessioni TCP / IP" Questo è sbagliato. Provalo su un'istanza pulita (vergine, skip-networking
pronta all'uso

@YaK Non riesco a far funzionare 'user' @ '%' in una configurazione del genere, cosa vuoi dire che dovrebbe succedere?
nn.

Potrei collegarmi come 'bill' @ '%' su una v5.0 senza rete (quindi, attraverso un socket). Quale versione stai usando? Lo proverò su una v5.5.
RandomSeed,

Si prega di vedere la mia risposta aggiornata. Sono stato in grado di accedere come 'bill'@'%'tramite un socket su una v5.5.
RandomSeed,

17

Se hai dimenticato la password o desideri modificarla, puoi seguire questi passaggi:

1: ferma il tuo mysql

[root @ maomao ~] # service mysqld stop
Arresto di MySQL: [OK]

2: usa "--skip-grant-tables" per riavviare mysql

[root @ mcy400 ~] # mysqld_safe --skip-grant-tables
[root @ cy400 ~] # Avvio del demone mysqld con database da / var / lib / mysql

3: apri una nuova finestra e inserisci mysql -u root

[root @ cy400 ~] # mysql -u root
Benvenuti nel monitor MySQL. I comandi finiscono con; o \ g.

4: modifica il database utente

mysql> usa mysql
Lettura delle informazioni sulla tabella per il completamento dei nomi di tabelle e colonne È possibile disattivare questa funzione per ottenere un avvio più rapido con -A Database modificato

5: modifica la tua password, la nuova password deve essere inserita in "()"

mysql> aggiorna user set password = password ('root123') dove user = 'root';
Query OK, 3 righe interessate (0,00 sec)
Righe associate: 3 Modificato: 3 Avvisi: 0

6: flush

mysql> privilegi flush;

7: esci

mysql> esci
Ciao

8: riavvia mysql

[root @ cy400 ~] # service mysqld restart;
Arresto di MySQL: [OK]
Avvio di MySQL: [OK]

Bingo! Puoi collegare il tuo database con il tuo nome utente e la nuova password:

[root@cy400 ~]# mysql -u root -p <br>
Enter password: admin123 <br>
Welcome to the MySQL monitor.  Commands end with ; or \g. <br>
Your MySQL connection id is 2 <br>
Server version: 5.0.77 Source distribution <br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br>
mysql> quit <br>
Bye

1
Questo mi ha aiutato, ma su Mac se lo installi con homebrew lo è mysql.server stop. Nel mio caso, non ho potuto aggiornare la colonna dell'utente perché non ce n'è una; inoltre non è stato possibile crearne uno perché è in modalità provvisoria. Per quello che sto facendo in questo momento non mi interessa, ma apprezzo molto questa risposta in formato con input e output esatti mostrati. Grazie!
szeitlin,

Mi dispiace, non ho mai usato Mac prima, quindi non posso aiutarti.
Li Yingjun,

15

Salva te stesso da un mal di testa MAJOR ... Il tuo problema potrebbe essere che ti mancano le virgolette attorno alla password. Almeno questo è stato il mio caso che mi ha deviato per 3 ore.

[client]
user = myusername
password = "mypassword"   # <----------------------- VERY IMPORTANT (quotes)
host = localhost

http://dev.mysql.com/doc/refman/5.7/en/option-files.html

Cerca "Ecco un tipico file di opzioni utente:" e vedi l'esempio che contengono. Buona fortuna e spero di salvare qualcun altro un po 'di tempo.


1
Grazie per questo. Ho sprecato mezza giornata in questo e le stupide citazioni sulla password hanno funzionato!
guyfromfl,

Haha. Ho perso praticamente lo stesso quando è successo a me. Felice di essere di aiuto.
mimoralea,

12

La soluzione è eliminare l'utente (qualsiasi) anonimo!

Ho anche riscontrato lo stesso problema su un server configurato da qualcun altro. Normalmente non ho scelto di creare un utente anonimo durante l'installazione di MySQL, quindi non l'avevo notato. Inizialmente ho effettuato l'accesso come utente "root" e ho creato un paio di utenti "normali" (ovvero utenti con privilegi solo su dbs con il loro nome utente come prefisso), quindi ho effettuato il logout, quindi ho verificato il primo utente normale. Non riesco ad accedere. Né tramite phpMyAdmin, né tramite shell. Si scopre che il colpevole è questo utente "Qualsiasi".


11

Ho avuto un problema un po 'simile: al mio primo tentativo di entrare in MySQL, poiché rootmi ha detto che l'accesso è stato negato. Ho scoperto che ho dimenticato di usare il sudo...

Quindi, se fallisci al rootprimo tentativo, prova:

sudo mysql -u root -p

e quindi inserisci la password, dovrebbe funzionare.


6

La migliore soluzione che ho trovato per me è.

il mio utente è sonar e ogni volta che sto provando a connettermi al mio database da una macchina esterna o di altro tipo, ricevo un errore come

ERROR 1045 (28000): Access denied for user 'sonar'@'localhost' (using password: YES)

Anche mentre sto provando questo da un'altra macchina e attraverso il lavoro di Jenkins il mio URL per l'accesso è

alm-lt-test.xyz.com

se si desidera connettersi in remoto, è possibile specificarlo in diversi modi come segue:

mysql -u sonar -p -halm-lt-test.xyz.com
mysql -u sonar -p -h101.33.65.94
mysql -u sonar -p -h127.0.0.1 --protocol=TCP
mysql -u sonar -p -h172.27.59.54 --protocol=TCP

Per accedervi con l'URL devi solo eseguire la seguente query.

GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'alm-lt-test.xyz.com' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'172.27.59.54' IDENTIFIED BY 'sonar';

4

Ok, non ne sono sicuro, ma probabilmente questo è il file my.cnf nella directory di installazione di mysql. Commenta questa riga e il problema potrebbe essere risolto.

bind-address = 127.0.0.1

1
Per ulteriori dettagli, è possibile visualizzare anche questo wiki.bitnami.org/Components/MySQL
Ali

1
Sono abbastanza sicuro che non sia questo il problema. In tal caso, MySQL rifiuta le connessioni da qualsiasi host diverso da 127.0.0.1 e non verrà visualizzato l'errore SQL "Accesso negato".
Il Pellmeister il

3

Volevo solo farti sapere una circostanza insolita che ho ricevuto lo stesso errore. Forse questo aiuta qualcuno in futuro.

Avevo sviluppato alcune viste di base, create nel sito di sviluppo e trasferite al sito di produzione. Più tardi quella settimana ho cambiato uno script PHP e all'improvviso sono emersi errori che hanno negato l'accesso all'utente 'local-web-user' @ 'localhost'. L'oggetto dell'origine dati non è cambiato, quindi mi sono concentrato sull'utente del database in MySQL, preoccupandomi nel frattempo che qualcuno abbia violato il mio sito Web. Fortunatamente il resto del sito sembrava illeso.

Successivamente si è scoperto che i punti di vista erano i colpevoli. I nostri trasferimenti di oggetti vengono effettuati utilizzando un altro utente (e remoto: admin @ indirizzo IP) rispetto all'utente del sito Web locale. Quindi le viste sono state create con 'admin' @ 'indirizzo IP' come definitore. La creazione predefinita della vista SICUREZZA è

SQL SECURITY DEFINER

Quando un utente web locale tenta di utilizzare la vista, si imbatte nei privilegi mancanti del definitore per utilizzare le tabelle. Una volta che la sicurezza è stata cambiata in:

SQL SECURITY INVOKER

il problema è stato risolto. Il problema reale era completamente diverso da quello previsto in base al messaggio di errore.


1
Anche questa è stata la fonte del mio problema: una visione con un "definitore" mancante. Un modo rapido per scoprire se questo è ciò che ti sta succedendo è provare a interrogare la stessa tabella o visualizzare come root. In tal caso, il messaggio di errore diventa molto più descrittivo "ERRORE 1449 (HY000): l'utente specificato come il definitore non esiste ".
Joshua Davies,

3

È una differenza tra:

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

e

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

Controllalo:

mysql> select user,host from mysql.user;
+---------------+----------------------------+
| user          | host                       |
+---------------+----------------------------+
| bill          | %                          | <=== created by first
| root          | 127.0.0.1                  |
| root          | ::1                        |
| root          | localhost                  |
| bill          | localhost                  | <=== created by second
+---------------+----------------------------+

Il comando

mysql -u bill -p

accesso implicito a "fattura" @ "localhost" e NON a "fattura" @ "%".

Non ci sono autorizzazioni per 'bill' @ 'localhost'

viene visualizzato l'errore:

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

risolvere il problema:

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

grant all privileges on . to 'bill'@'localhost' with grant option;

La dichiarazione di concessione ha restituito un errore. Avevo bisogno di specificare un database in questo modo: concedi tutti i privilegi su newdb. * A ....
LeBird

3

Questo succede anche quando la tua password contiene alcuni caratteri speciali come @, $, ecc. Per evitare questa situazione, puoi racchiudere la password tra virgolette singole:

$ mysql -usomeuser -p's0mep@$$w0Rd'

O invece non utilizzare la password durante l'immissione. Lascialo vuoto e poi scrivilo quando il terminale chiede. Questo è il modo raccomandato.

$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

3
Questo può davvero essere un problema (come è stato per me). Tutte le mie password per uno qualsiasi dei miei account vengono generate utilizzando pwgen. Oggi ne ho generato uno nuovo per un database MySQL e il suo utente. Sfortunatamente la password conteneva una barra rovesciata "\" che non avevo identificato come origine degli errori (non ci avevo nemmeno pensato). Quindi, ho cercato per ore una soluzione. Dopo aver impostato la password su "123" nella disperazione, il login ha finalmente funzionato. ... Gli utenti dovrebbero essere consapevoli del fatto che alcuni caratteri speciali possono causare problemi poiché MySQL non mostra alcun avviso sull'uso di password come "daiy4ha4in7chooshuiphie \ Th * aew", ad esempio.
Arvid,

1
Stava per postare questo come risposta se non fosse ancora apparso, era semplicemente troppo in fondo alla lista per me notarlo (quindi lo sto aumentando +1)
Assimilater

3

Per me, questo problema è stato causato da una nuova funzionalità di MySQL 5.7.2: le uservoci vengono ignorate se il loro plugincampo è vuoto.

Impostalo ad es. mysql_native_passwordPer riattivarli:

UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;

Vedi le note di rilascio per MySQL 5.7.2 , in «Note di autenticazione».

Per qualche motivo (forse perché i miei hash della password precedenti alla 4.1 sono stati rimossi), lo mysql_upgradescript non ha impostato un valore predefinito per il plugin.

Ho scoperto notando il seguente messaggio di avviso in /var/log/mysql/error.log:

[Avviso] La voce utente 'pippo' @ '%' ha un valore di plugin vuoto. L'utente verrà ignorato e nessuno potrà più accedere con questo utente.

Pubblico questa risposta qui per forse salvare qualcuno dall'usare la stessa ridicola quantità di tempo che ho fatto su questo.


2

Non sono sicuro se qualcun altro lo troverà utile, ma ho riscontrato lo stesso errore e ho cercato tutti gli utenti anonimi ... e non ce n'erano. Il problema è stato che l'account utente era impostato su "Richiedi SSL", che ho trovato in PHPMyAdmin andando su Account utente e facendo clic su Modifica privilegi per l'utente. Non appena ho deselezionato questa opzione, tutto ha funzionato come previsto!


2

Riepilogo debug

  • Verifica errori di battitura: nome utente o password.
  • Controlla il nome host e confrontalo con il nome host della tabella mysql.user.
  • Verifica che l'utente esista o meno.
  • Controlla se l'host contiene l'indirizzo IP o il nome host.

È molto probabile che tu abbia riscontrato questo problema più volte nel tuo lavoro. Questo problema si è verificato nella maggior parte dei casi a causa di un nome utente o password immessi in modo errato. Anche se questo è uno dei motivi, ci sono molte altre possibilità che potresti riscontrare questo problema. A volte sembra molto simile, ma quando scavi più a fondo, ti renderai conto di più fattori che contribuiscono a questo errore. Questo post spiegherà in dettaglio, la maggior parte dei motivi comuni e aggirare il problema.

Possibili ragioni:

  • Caso 1: errore di battitura: nome utente o password.

Questa è la ragione più comune per questo errore. Se hai inserito il nome utente o la password in modo errato, sicuramente otterrai questo errore.

Soluzione:

La soluzione per questo tipo di errore è molto semplice. Basta inserire il nome utente e la password corretti. Questo errore verrà risolto. Nel caso in cui si dimentichi la password è possibile ripristinare il nome utente / password. Se si dimentica la password per l'account admin / root, ci sono molti modi per ripristinare / ripristinare la password di root. Pubblicherò un altro post su come reimpostare la password di root nel caso in cui dimentichi la password di root.

  • Caso 2: accesso da host errato.

MySQL offre restrizioni basate sull'host per l'accesso degli utenti come funzionalità di sicurezza. Nel nostro ambiente di produzione, eravamo soliti limitare la richiesta di accesso solo ai server delle applicazioni. Questa funzione è davvero utile in molti scenari di produzione.

Soluzione:

Quando si incontra questo tipo di problema, verificare innanzitutto se l'host è autorizzato o meno controllando la tabella mysql.user. Se non è definito, è possibile aggiornare o inserire un nuovo record nella tabella mysql.user. In generale, l'accesso come utente root dalla macchina remota è disabilitato e non è una buona pratica, a causa di problemi di sicurezza. Se hai i requisiti per accedere al tuo server da più macchine, concedi l'accesso solo a quelle macchine. È meglio non usare i caratteri jolly (%) e fornisce accessi universali. Consentitemi di aggiornare la tabella mysql.user, ora il sistema può accedere al server MySQL da qualsiasi host.

  • Caso 3: l'utente non esiste sul server.

Questo tipo di errore si verifica quando l'utente, a cui si sta tentando di accedere, non esiste sul server MySQL.

soluzioni:

Quando si incontra questo tipo di problema, è sufficiente verificare se l'utente è presente nella tabella mysql.user o meno. Se il record non esiste, l'utente non può accedervi. Se è necessario l'accesso per quell'utente, creare un nuovo utente con tale nome utente.

  • Caso 4: Mix di host numerici e basati sul nome.

Punti importanti

  • Non è consigliabile utilizzare caratteri jolly durante la definizione dell'host utente, provare a utilizzare il nome host esatto.

  • Disabilita l'accesso root dal computer remoto.

  • Usa il concetto di utente proxy.

Esistono pochi altri concetti correlati a questo argomento e entrare nei dettagli di tali argomenti ha una portata molto diversa di questo articolo. Esamineremo i seguenti argomenti correlati nei prossimi articoli.

  • Cosa fare se hai dimenticato la password di root del server MySQL.
  • Problemi relativi ai privilegi di accesso a MySQL e tabelle relative all'utente.
  • Funzionalità di sicurezza MySQL con le migliori pratiche.

Spero che questo post ti aiuti a correggere il codice di errore MySQL 1045 Accesso negato per l'utente in MySQL.


2

Spero che tu non abbia fatto più danni cancellando anche l'utente debian-sys-maint in mysql

Chiedi al tuo demone mysql di funzionare normalmente. Avvia il tuo client mysql come mostrato di seguito

mysql -u debian-sys-maint -p

In un altro terminale, catil file /etc/mysql/debian.cnf. Quel file contiene una password; incolla quella password quando ti viene richiesta.

http://ubuntuforums.org/showthread.php?t=1836919


2

Ho scoperto un altro caso che appare in superficie come un caso limite; Posso esportare nel file system, tramite SELECT INTO .. ​​OUTFILE come root, ma non come utente normale. Anche se questa può essere una questione di autorizzazioni, l'ho esaminata e non ho visto nulla di particolarmente ovvio. Tutto quello che posso dire è che l'esecuzione della query come utente normale che dispone di tutte le autorizzazioni sul database in questione restituisce l'errore di accesso negato che mi ha portato a questo argomento. Quando ho trovato la trascrizione di un uso riuscito di SELECT INTO ... OUTFILE in un vecchio progetto, ho notato che ero loggato come root. Abbastanza sicuro, quando ho effettuato l'accesso come root, la query ha funzionato come previsto.


1

Aggiornamento: su v8.0.15 (forse questa versione) la PASSWORD()funzione non funziona.

Devi:

  1. Assicurati di aver prima arrestato MySQL.
  2. Esegui il server in modalità provvisoria con bypass privilegi: sudo mysqld_safe --skip-grant-tables
  3. Accesso: mysql -u root
  4. mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. mysql> FLUSH PRIVILEGES;
  6. mysql> exit;
  7. Effettua nuovamente l'accesso: mysql -u root
  8. mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';

0

Quando esegui mysql -u bill -p, localhostviene risolto nel tuo IP, poiché è 127.0.0.1 e nel tuo /etc/hostsfile, come predefinito 127.0.0.1 localhostesiste. Quindi, mysql ti interpreta come bill@localhostnon concesso bill@'%'. Questo è il motivo per cui ci sono 2 record diversi per l' rootutente in seguito alla select host, user from mysql.user;query.

Esistono due modi per gestire questo problema.

Uno è specificare un IP che non viene risolto in modo inverso dal /etc/hostsfile quando si tenta di accedere. Ad esempio, l'ip del server è 10.0.0.2. Quando esegui il comando mysql -u bill -p -h 10.0.0.2, sarai in grado di accedere. Se digiti select user();, otterrai bill@10.0.0.2. Naturalmente, qualsiasi nome di dominio non dovrebbe essere risolto in questo ip nel tuo /etc/hostsfile.

In secondo luogo, è necessario concedere l'accesso per questo nome di dominio specifico. Per bill@localhost, dovresti chiamare il comando grant all privileges on *.* to bill@localhost identified by 'billpass';. In questo caso, sarai in grado di accedere con il comando mysql -u bill -p. Una volta effettuato l'accesso, il select user();comando ritornabill@localhost .

Ma questo è solo per il fatto che si tenta di accedere a un server mysql nello stesso host. Dagli host remoti, mysql si comporta in modo prevedibile, '%' ti garantirà l'accesso.


0

Ho risolto questo eliminando le voci "bill" del vecchio utente difettoso (questa è la parte importante: sia da mysql.user che da mysql.db ), quindi ho creato lo stesso utente di sad prima:

FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;

Ha funzionato, l'utente si sta connettendo. Ora rimuoverò alcune anticipazioni da esso :)


0

Ho riscontrato lo stesso errore. L'impostazione che non funzionava è la seguente:

define("HOSTNAME", "localhost");
define("HOSTUSER", "van");
define("HOSTPASS", "helsing");
define("DBNAME", "crossbow");
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

L'impostazione modificata di seguito è quella che l'ha fatto funzionare. Notare la differenza?

define('HOSTNAME', 'localhost');
define('HOSTUSER', 'van');
define('HOSTPASS', 'helsing');
define('DBNAME', 'crossbow');
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

La differenza sono le doppie virgolette. Sembrano essere abbastanza significativi in ​​PHP rispetto a Java e hanno un impatto quando si tratta di sfuggire ai caratteri, impostare URL e ora, passare parametri a una funzione. Sono più carini (lo so) ma usano sempre virgolette singole il più possibile quindi le doppie virgolette possono essere nidificate tra quelle se necessario.

Questo errore è emerso quando ho testato la mia applicazione su un box Linux invece di un ambiente Windows.


0

Ho avuto problemi simili perché la mia password contiene ";" char rompere la mia password quando la creo al primo momento. Attenzione con questo se può aiutarti.


0

Questo può valere per pochissime persone, ma qui va. Non usare un'esclamazione! nella tua password.

Ho fatto e ho ricevuto l'errore sopra usando MariaDB. Quando l'ho semplificato a soli numeri e lettere ha funzionato. Altri personaggi come @e$ funzionano bene - li ho usati in un altro utente nella stessa istanza.

La quinta risposta a questo indirizzo mi ha portato alla mia correzione.


0

Su Windows, ecco come risolvere:

ERRORE 1045 (28000): Accesso negato per l'utente 'root' @ 'localhost' (utilizzando la password: NO)

  1. Disinstallare mysql dal pannello di controllo
  2. Elimina la cartella MySql da C:\Program Files,C:\Program Files (x86)eC:\ProgramData
  3. Installa mysql

Ho provato tutte le altre risposte, finalmente deciso di provare questo e ha funzionato!
jasonoriordan

0

Ciò può accadere anche se MySQL è in esecuzione su un sistema operativo senza distinzione tra maiuscole e minuscole, come Windows.

ad esempio ho scoperto che il tentativo di connettersi a un database utilizzando queste credenziali non è riuscito:

mysql> grant select on databaseV105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -p's3curepa5wrd' -h10.61.130.89 databaseV105

ERRORE 1045 (28000): Accesso negato per l'utente 'specialuser'@'10.0.1.113' (utilizzando la password: SÌ)

Ma questo è riuscito:

mysql> grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -h10.300.300.400 databaseV105 -p

Inserire la password:



0

Al giorno d'oggi! Soluzione per:

MySQL ERROR 1045 (28000): Accesso negato per l'utente 'utente' @ 'localhost' (usando la password: SÌ);

Wampserver 3.2.0 nuova installazione o aggiornamento

Probabilmente l' xamputilizzo mariaDBcome predefinito va bene.

Wampserver viene fornito con mariaDBmysql e installazione mariaDBcome predefinita sulla porta 3306 e mysql sulla 3307, porta a volte 3308.

Connetti a mysql !

Al momento dell'installazione richiede di utilizzare mariaDBo MySql, ma mariaDB è selezionata come impostazione predefinita e non è possibile cambiarla, controllaremysql opzione e installare.

al termine dell'installazione entrambi verranno eseguiti mariaDBsulla porta predefinita 3306 emysql su un'altra porta 3307 o 3308.

Fai clic destro wampserversull'icona dove dovrebbe trovarsi la sua corsa nell'angolo in basso a destra, vai agli strumenti e vedi il tuo correttomysql porta di corsa .

E includilo nella tua connessione al database come in folowng:

$host = 'localhost';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$port = '3308';//Port

$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset"; //Add in connection
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

Note : Sto usando DP.

Vedi qui per maggiori informazioni: https://sourceforge.net/projects/wampserver/


Si prega di non utilizzare i backtick per l'enfasi. Dovrebbero essere usati solo per il codice. Parole come MySQL o Wampserver non sono codice.
Dharman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.