MySQL ERROR 1045 (28000): Zugriff für Benutzer 'bill' @ 'localhost' verweigert (mit Passwort: YES)

426

Lassen Sie mich zunächst erwähnen, dass ich viele vorgeschlagene Fragen durchgesehen und keine relevante Antwort gefunden habe. Hier ist was ich tue.

Ich bin mit meiner Amazon EC2-Instanz verbunden. Ich kann mich mit MySQL root mit diesem Befehl anmelden:

mysql -u root -p

Dann habe ich eine neue Benutzerrechnung mit Host% erstellt

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

Gewährt alle Berechtigungen für die Benutzerrechnung:

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

Dann verlasse ich den Root-Benutzer und versuche, mich mit Rechnung anzumelden:

mysql -u bill -p

gab das richtige Passwort ein und bekam diesen Fehler:

FEHLER 1045 (28000): Zugriff für Benutzer 'Rechnung' @ 'localhost' verweigert (mit Passwort: JA)

Ali
quelle
34
Hast du FLUSH PRIVILEGES?
Eggyal
6
Okay, ich habe es ohne Erfolg versucht. Jeder andere Vorschlag bitte.
Ali
1
Welche Version des Servers verwenden Sie? Ich habe gesehen, dass sich 5.1 in dieser Hinsicht merkwürdig verhält.
Pudelhut
2
Dies ist mir bei der Installation von Magento passiert und ich habe einen viel dümmeren Fehler gemacht. Das Einfügen von 'mysql -u magento -p magento' forderte mich zur Eingabe eines Passworts auf und anstelle des Standardpassworts gab ich das Root-Passwort ein.
AmirHd
2
@authentictech Leider funktionierte zum Zeitpunkt der Veröffentlichung dieser Frage keine der vorgeschlagenen Lösungen für mich. Bitte sehen Sie meine eigene Antwort, die mir geholfen hat, aus dieser Situation herauszukommen. Aus diesem Grund habe ich keinen von ihnen als Antwort markiert. Wahrscheinlich kann ich die Antwort mit dem höchsten Rang als Antwort markieren.
Ali

Antworten:

441

Sie haben wahrscheinlich einen anonymen Benutzer ''@'localhost'oder ''@'127.0.0.1'.

Gemäß Handbuch :

Wenn mehrere Übereinstimmungen möglich sind, muss der Server bestimmen, welche davon verwendet werden sollen. Dieses Problem wird wie folgt behoben: (...)

  • Wenn ein Client versucht, eine Verbindung herzustellen, durchsucht der Server die Zeilen [der Tabelle mysql.user] in sortierter Reihenfolge.
  • Der Server verwendet die erste Zeile, die dem Client-Hostnamen und dem Benutzernamen entspricht.

(...) Der Server verwendet Sortierregeln, die zuerst Zeilen mit den spezifischsten Hostwerten anordnen . Literale Hostnamen [wie 'localhost'] und IP-Adressen sind die spezifischsten.

Daher würde ein solcher anonymer Benutzer jeden anderen Benutzer "maskieren", '[any_username]'@'%'wenn er eine Verbindung herstellt localhost.

'bill'@'localhost'stimmt überein 'bill'@'%', würde aber (zB) ''@'localhost'vorher übereinstimmen .

Die empfohlene Lösung besteht darin, diesen anonymen Benutzer zu löschen (dies ist normalerweise sowieso eine gute Sache).


Die folgenden Änderungen sind für die Hauptfrage meist irrelevant. Diese sollen nur einige Fragen beantworten, die in anderen Kommentaren in diesem Thread aufgeworfen wurden.

Bearbeiten 1

Authentifizierung wie 'bill'@'%'über einen Socket.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    Willkommen auf dem MySQL-Monitor (...)

    mysql> SELECT Benutzer, Host FROM mysql.user;
    + ------ + ----------- +
    | Benutzer | Host |
    + ------ + ----------- +
    | Rechnung | % |
    | root | 127.0.0.1 |
    | root | :: 1 |
    | root | localhost |
    + ------ + ----------- +
    4 Reihen im Satz (0,00 Sek.)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | USER () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | Rechnung @% |
    + ---------------- + ---------------- +
    1 Reihe im Satz (0,02 Sek.)

    mysql> SHOW VARIABLES LIKE 'skip_networking';
    + ----------------- + ------- +
    | Variablenname | Wert |
    + ----------------- + ------- +
    | skip_networking | EIN |
    + ----------------- + ------- +
    1 Reihe im Satz (0,00 Sek.)

Bearbeiten 2

Genau das gleiche Setup, außer dass ich das Netzwerk wieder aktiviert habe und jetzt einen anonymen Benutzer erstelle ''@'localhost'.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    Willkommen auf dem MySQL-Monitor (...)

    mysql> CREATE USER '' @ 'localhost' IDENTIFIED BY 'anotherpass';
    Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

    mysql> Tschüss

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / tmp / mysql-5.5.sock
    FEHLER 1045 (28000): Zugriff für Benutzer 'Rechnung' @ 'localhost' verweigert (mit Passwort: JA)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol = TCP
    FEHLER 1045 (28000): Zugriff für Benutzer 'Rechnung' @ 'localhost' verweigert (mit Passwort: JA)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = TCP
    FEHLER 1045 (28000): Zugriff für Benutzer 'Rechnung' @ 'localhost' verweigert (mit Passwort: JA)

Bearbeiten 3

Gleiche Situation wie in Bearbeitung 2, jetzt mit dem Passwort des anonymen Benutzers.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    Willkommen auf dem MySQL-Monitor (...)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | USER () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | @localhost |
    + ---------------- + ---------------- +
    1 Reihe im Satz (0,01 Sek.)

Schlussfolgerung 1 aus Bearbeitung 1: Man kann sich wie 'bill'@'%'über einen Socket authentifizieren .

Schlussfolgerung 2 aus Bearbeitung 2: Ob eine Verbindung über TCP oder über einen Socket hergestellt wird, hat keinen Einfluss auf den Authentifizierungsprozess (außer, dass eine Verbindung nur 'something'@'localhost'über einen Socket hergestellt werden kann).

Schlussfolgerung 3 aus Bearbeitung 3: Obwohl ich angegeben habe -ubill, wurde mir als anonymer Benutzer Zugriff gewährt. Dies liegt an den oben empfohlenen "Sortierregeln". Beachten Sie, dass in den meisten Standardinstallationen ein anonymer Benutzer ohne Kennwort vorhanden ist (und gesichert / entfernt werden sollte).

RandomSeed
quelle
9
Für alle, die neugierig sind, warum 'bill' @ 'localhost' mit '' @ 'localhost' übereinstimmt, wie ich es war, fungiert eine leere Zeichenfolge effektiv als Platzhalter im Authentifizierungsalgorithmus von MySQL.
Dean oder
2
@ Sanja Seien Sie bei dieser Problemumgehung besonders vorsichtig. Möglicherweise erlauben Sie von jedem Ort aus anonymen Zugriff auf Ihre Datenbank. Im Zweifelsfall möchte ich den Benutzer lieber löschen.
RandomSeed
7
@RandomSeed Danke für diesen Kommentar! Wahrscheinlich sollte ich nur anonymen Benutzer löschen. PS Ich habe dev.mysql.com/doc/refman/5.1/en/default-privileges.html gefunden , das besagt, dass diese Benutzer sicher gelöscht werden können : DROP USER ''@'localhost';. Sie werden nicht für einen bestimmten Zweck benötigt.
Alex
1
Ich habe den anonymen Benutzer gelöscht, aber es hat immer noch nicht funktioniert. Dann stellte ich fest, dass ich auch "FLUSH PRIVILEGES" ausgeben musste. Es wäre hilfreich, das auch zu erwähnen.
Neeme Praks
2
Das ist die Antwort! Warum kommt dies nicht in jedem MySQL-Handbuch in fetten Großbuchstaben vor? LÖSCHEN SIE DEN ANONYMEN BENUTZER ODER ES TÖTET ALLE IHRE VERSUCHE, SICH BEI LOCALHOST ZU LOGINIEREN!
Sergei
140

Versuchen:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
Edgar Aviles
quelle
10
Dies ist ziemlich gefährlich. Wenn jemand Ihr bill @ localhost-MySQL-Konto hackt, hat er unendlichen Zugriff auf alle Datenbanken Ihres MySQL-Servers.
Adonis K. Kakoulidis
2
Whehey. Ich musste ein Zitat um meinen Benutzer 'myusername'@'myhost.static.myip.com' setzen, dann funktionierte es.
Bendecko
Das funktioniert für mich, aber ich fürchte, ich habe dem Benutzer zu viele Privilegien gegeben
Csaba Toth
1
@CsabaToth Sie haben, reduzieren Sie die Berechtigungen wieder, bis Ihr Benutzer hat, was er braucht und nicht mehr.
Jwenting
... und was tun Sie, wenn Sie dann "Zugriff für Benutzer 'root' @ 'localhost' verweigert (mit Passwort: YES)"?
Grunion Shaftoe
76

Als du gerannt bist

mysql -u bill -p

und habe diesen Fehler bekommen

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

mysqld erwartet, dass Sie sich als verbinden bill@localhost

Versuchen Sie zu erstellen bill@localhost

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

Wenn Sie eine Remoteverbindung herstellen möchten, müssen Sie entweder den DNS-Namen, die öffentliche IP oder 127.0.0.1 mithilfe von TCP / IP angeben:

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

Sobald Sie sich angemeldet haben, führen Sie dies bitte aus

SELECT USER(),CURRENT_USER();

USER () berichtet, wie Sie versucht haben, sich in MySQL zu authentifizieren

CURRENT_USER () gibt an , wie Sie sich in MySQL aus der Tabelle mysql.user authentifizieren durften

Auf diese Weise erhalten Sie einen besseren Überblick darüber, wie und warum Sie sich bei MySQL anmelden durften. Warum ist es wichtig, diese Ansicht zu kennen? Dies hat mit dem Bestellprotokoll für die Benutzerauthentifizierung zu tun.

Hier ein Beispiel: Ich werde einen anonymen Benutzer auf meinem Desktop MySQL erstellen

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, schau mir zu, wie ich mich als anonymer Benutzer anmelde:

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>

Die Reihenfolge der Authentifizierung ist sehr streng. Es prüft von den spezifischsten bis zu den geringsten. Ich habe über diesen Authentifizierungsstil im DBA StackExchange geschrieben .

Vergessen Sie nicht, bei Bedarf explizit TCP als Protokoll für den MySQL-Client aufzurufen.

RolandoMySQLDBA
quelle
1
'bill'@'localhost'sollte passen 'bill@%', nicht wahr?
RandomSeed
@Yak Die Sortierreihenfolge basiert nicht nur auf der Benutzerspalte von mysql.user. MySQL führt per se keine Zeichenübereinstimmung durch. Ich schrieb über das Bestellprotokoll für die Benutzerauthentifizierung im DBA StackExchange: dba.stackexchange.com/a/10897/877
RolandoMySQLDBA
@YaK Deshalb habe ich ausdrücklich erwähnt SELECT USER(),CURRENT_USER();. In diesen beiden Funktionen werden fast nie anonyme Benutzer angezeigt, außer in wirklich schlechten Setups.
RolandoMySQLDBA
1
Ich habe nie angenommen, dass die Sortierreihenfolge ausschließlich auf basiert mysql.user. Wenn Sie meine Antwort noch einmal lesen, werden Sie feststellen, dass ich gesagt habe (tatsächlich heißt es im Handbuch), dass die Sortierreihenfolge hostzuerst auf der Spalte basiert . Sie haben viel darüber geschrieben, wie Sie Ihre aktuellen Anmeldeinformationen überprüfen können, aber ich sehe nur wenige Informationen darüber, warum Sie 'bill'@'localhost'sich nicht als anmelden können. Dies 'bill'@'%'ist die heutige Frage von AFAIK. Das OP hat wahrscheinlich ein schlechtes Setup, deshalb bekommt er diese Fehler.
RandomSeed
2
--protocol=TCPwar der Schlüssel. Vielen Dank!
lfx
22

Super spät dazu

Ich habe all diese anderen Antworten ausprobiert und viele verschiedene Versionen von ausgeführt, mysql -u root -paber nie nur ausgeführt


mysql -u root -p

Und drücken Sie einfach [ENTER]auf das Passwort.


Sobald ich das getan habe, hat es funktioniert. Hoffe das hilft jemandem.

Garrettmac
quelle
18

Ein verwandtes Problem in meinem Fall war der Versuch, eine Verbindung herzustellen mit:

mysql -u mike -p mypass

Leerzeichen sind anscheinend zwischen -u # uname # erlaubt, aber NICHT zwischen -p und # password #

Daher benötigt:

mysql -u mike -pmypass

Ansonsten mit white-space zwischen -p mypass mysql nimmt 'mypass' als db Name

mstram
quelle
1
oder: mysql -u usrname -p - Dies verhindert, dass jemand das Passwort sieht, da eine neue Zeile
tolle Antwort @mstram
Arpit Solanki
1
Diese Lösung ist komfortabel, es ist jedoch unsicher, das Kennwort offensichtlich einzugeben, aber es ist nicht erforderlich, Berechtigungen einzugeben und andere Dinge zu definieren. Wenn Ihr Mac-Buch also gesichert ist - dieser Ansatz ist sehr komfortabel. Noch mehr habe ich ihn zum Importieren von Daten aus dem Docker-MySQL-Treiber in aws verwendet.
Dimpiax
17

Wenn Sie tippen mysql -u root -p , Sie eine Verbindung herstellen den MySQL - Server über einen lokalen Unix - Socket.

Der von Ihnen gewährte Zuschuss 'bill'@'%'stimmt jedoch seltsamerweise nur mit TCP / IP-Verbindungen überein.

Wenn Sie Zugriff auf den lokalen Unix-Socket gewähren möchten, müssen Sie 'bill' @ 'localhost' Berechtigungen erteilen, was seltsamerweise nicht mit 'bill'@'127.0.0.1' identisch ist.

Sie können auch eine Verbindung über TCP / IP mit dem MySQL-Befehlszeilenclient herstellen, um den bereits gewährten Berechtigungen zu entsprechen, z. B. Ausführen mysql -u root -p -h 192.168.1.123oder der lokalen IP-Adresse Ihrer Box.

nr
quelle
"'bill' @ '%' stimmt nur mit TCP / IP-Verbindungen überein" Dies ist falsch. Versuchen Sie es auf einer sauberen (jungfräulichen, skip-networking
sofort einsatzbereiten
@YaK Ich kann 'user' @ '%' nicht dazu bringen, in einem solchen Setup zu funktionieren. Was meinst du damit, was passieren sollte?
Nr.
Ich könnte eine Verbindung als 'bill' @ '%' auf einer Version 5.0 ohne Netzwerk herstellen (daher über einen Socket). Welche Version verwenden Sie? Ich werde es auf einer v5.5 versuchen.
RandomSeed
Bitte beachten Sie meine aktualisierte Antwort. Ich konnte mich wie 'bill'@'%'über einen Socket auf einer v5.5 anmelden .
RandomSeed
17

Wenn Sie Ihr Passwort vergessen haben oder Ihr Passwort ändern möchten, können Sie folgende Schritte ausführen:

1: Stoppen Sie Ihre MySQL

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

2: Verwenden Sie "--skip-grant-tables", um MySQL neu zu starten

[root @ mcy400 ~] # mysqld_safe --skip-grant-tables
[root @ cy400 ~] # Starten des mysqld-Daemons mit Datenbanken aus / var / lib / mysql

3: öffne ein neues Fenster und gib mysql -u root ein

[root @ cy400 ~] # mysql -u root
Willkommen beim MySQL-Monitor. Befehle enden mit; oder \ g.

4: Ändern Sie die Benutzerdatenbank

mysql> use mysql
Lesen von Tabelleninformationen zum Vervollständigen von Tabellen- und Spaltennamen Sie können diese Funktion deaktivieren, um einen schnelleren Start mit geänderter -A-Datenbank zu erhalten

5: Ändern Sie Ihr Passwort Ihr neues Passwort sollte in "((" eingegeben werden.

mysql> Benutzer aktualisieren set password = password ('root123') wobei user = 'root';
Abfrage OK, 3 Zeilen betroffen (0,00 Sek.)
Übereinstimmende Zeilen: 3 Geändert: 3 Warnungen: 0

6: spülen

mysql> Flush-Berechtigungen;

7: Beenden

mysql> beende
Tschüss

8: Starten Sie MySQL neu

[root @ cy400 ~] # service mysqld restart;
Stoppen von MySQL: [OK]
Starten von MySQL: [OK]

Bingo! Sie können Ihre Datenbank mit Ihrem Benutzernamen und Ihrem neuen Passwort verbinden:

[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
Li Yingjun
quelle
1
Das hat mir geholfen, aber auf einem Mac, wenn Sie mit Homebrew installieren, ist es mysql.server stop. In meinem Fall konnte ich die Benutzerspalte nicht aktualisieren, da es keine gibt. konnte auch keine erstellen, da sie sich im abgesicherten Modus befindet. Für das, was ich gerade mache, ist es mir egal, aber ich schätze diese Formatantwort mit den genauen angezeigten Ein- und Ausgängen sehr. Vielen Dank!
szeitlin
Es tut mir leid, ich habe noch nie einen Mac benutzt. Also kann ich dir nicht helfen.
Li Yingjun
15

Sparen Sie sich große Kopfschmerzen ... Ihr Problem könnte sein, dass Ihnen die Anführungszeichen um das Passwort fehlen. Zumindest war das mein Fall, der mich 3 Stunden lang umging.

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

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

Suchen Sie nach "Hier ist eine typische Benutzeroptionsdatei:" und sehen Sie sich das dort angegebene Beispiel an. Viel Glück und ich hoffe, jemand anderem etwas Zeit zu sparen.

mimoralea
quelle
1
Danke dafür. Ich habe einen halben Tag damit verschwendet und die dummen Zitate um das Passwort haben es geschafft!
guyfromfl
Haha. Ich habe so ziemlich dasselbe verschwendet, als es mir passiert ist. Ich bin froh, Ihnen helfen zu können.
Mimoralea
12

Die Lösung besteht darin, den anonymen (beliebigen) Benutzer zu löschen!

Ich hatte das gleiche Problem auch bei einem Server-Setup von jemand anderem. Normalerweise erstelle ich bei der Installation von MySQL keinen anonymen Benutzer, habe dies also nicht bemerkt. Anfangs habe ich mich als "Root" -Benutzer angemeldet und ein paar "normale" Benutzer erstellt (auch bekannt als Benutzer mit Berechtigungen nur für Datenbankanbieter mit ihrem Benutzernamen als Präfix), mich dann abgemeldet und anschließend den ersten normalen Benutzer überprüft. Ich konnte mich nicht anmelden. Weder über phpMyAdmin noch über die Shell. Es stellt sich heraus, dass der Schuldige dieser "beliebige" Benutzer ist.

Fevangelou
quelle
11

Ich hatte ein ähnliches Problem - bei meinem ersten Versuch, MySQL aufzurufen, rootwurde mir mitgeteilt, dass der Zugriff verweigert wurde. Es stellte sich heraus, dass ich vergessen habe, die sudo...

Wenn Sie also beim rootersten Versuch versagen , versuchen Sie:

sudo mysql -u root -p

und geben Sie dann Ihr Passwort ein, dies sollte funktionieren.

David Refaeli
quelle
6

Die beste Lösung, die ich für mich gefunden habe, ist.

Mein Benutzer ist Sonar und wenn ich versuche, von einem externen oder anderen Computer aus eine Verbindung zu meiner Datenbank herzustellen, wird eine Fehlermeldung als angezeigt

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

Auch wenn ich dies von einem anderen Computer aus und über Jenkins Job versuche, ist meine URL für den Zugriff

alm-lt-test.xyz.com

Wenn Sie eine Remoteverbindung herstellen möchten, können Sie diese auf verschiedene Arten angeben:

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

Um mit einer URL darauf zuzugreifen, müssen Sie nur die folgende Abfrage ausführen.

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';
Abhijeet Kamble
quelle
4

Okay, ich bin mir nicht sicher, aber wahrscheinlich ist dies die Datei my.cnf im MySQL-Installationsverzeichnis. Wenn Sie diese Zeile auskommentieren, ist das Problem möglicherweise behoben.

bind-address = 127.0.0.1
Ali
quelle
1
Für weitere Details können Sie dies auch anzeigen wiki.bitnami.org/Components/MySQL
Ali
1
Ich bin mir ziemlich sicher, dass dies nicht das Problem ist. In diesem Fall lehnt MySQL Verbindungen von einem anderen Host als 127.0.0.1 ab, und Sie erhalten keinen SQL-Fehler "Zugriff verweigert".
Der Pellmeister
3

Ich wollte Sie nur über einen ungewöhnlichen Umstand informieren, bei dem ich den gleichen Fehler erhalten habe. Vielleicht hilft das jemandem in der Zukunft.

Ich hatte einige Basisansichten entwickelt, am Entwicklungsstandort erstellt und auf den Produktionsstandort übertragen. Später in dieser Woche änderte ich ein PHP-Skript und plötzlich trat der Fehler auf, dass der Zugriff für den Benutzer 'local-web-user' @ 'localhost' verweigert wurde. Das Datenquellenobjekt hatte sich nicht geändert, daher konzentrierte ich mich auf den Datenbankbenutzer in MySQL und machte mir Sorgen, dass in der Zwischenzeit jemand meine Website gehackt hat. Zum Glück schien der Rest der Seite unversehrt zu sein.

Es stellte sich später heraus, dass die Ansichten die Schuldigen waren. Unsere Objektübertragungen werden mit einem anderen Benutzer (und remote: admin @ ip-address) als dem Benutzer der lokalen Website durchgeführt. Daher wurden die Ansichten mit 'admin' @ 'IP-Adresse' als Definierer erstellt. Die Standardeinstellung für die Erstellung von Ansichten ist SICHERHEIT

SQL SECURITY DEFINER

Wenn ein lokaler Webbenutzer versucht, die Ansicht zu verwenden, stößt er auf die fehlenden Berechtigungen des Definierers zur Verwendung der Tabellen. Sobald die Sicherheit geändert wurde in:

SQL SECURITY INVOKER

Das Problem wurde behoben. Das eigentliche Problem war aufgrund der Fehlermeldung völlig anders als erwartet.

Erik
quelle
1
Dies war auch die Quelle meines Problems - eine Ansicht mit einem fehlenden "Definierer". Eine schnelle Möglichkeit, um herauszufinden, ob dies mit Ihnen geschieht, besteht darin, dieselbe Tabelle oder Ansicht wie root abzufragen. Wenn Sie dies tun, ändert sich die Fehlermeldung in den viel aussagekräftigeren "FEHLER 1449 (HY000): Der als a angegebene Benutzer Definer existiert nicht ".
Joshua Davies
3

Es ist ein Unterschied zwischen:

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

und

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

Prüfen Sie:

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
+---------------+----------------------------+

Der Befehl

mysql -u bill -p

Zugriff implizit auf 'bill' @ 'localhost' und NICHT auf 'bill' @ '%'.

Es gibt keine Berechtigungen für 'bill' @ 'localhost'.

Sie erhalten den Fehler:

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

Lösung des Problems:

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

grant all privileges on . to 'bill'@'localhost' with grant option;
Gerd
quelle
Die Grant-Anweisung hat einen Fehler zurückgegeben. Ich musste eine Datenbank wie folgt angeben: Gewähren Sie alle Berechtigungen für newdb. *
Bis
3

Dies passiert auch, wenn Ihr Passwort einige Sonderzeichen wie @, $ usw. Enthält. Um diese Situation zu vermeiden, können Sie das Passwort in einfache Anführungszeichen setzen:

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

Oder verwenden Sie stattdessen kein Passwort bei der Eingabe. Lassen Sie es leer und geben Sie es ein, wenn das Terminal Sie dazu auffordert. Dies ist der empfohlene Weg.

$ 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>
Pranit Mehr
quelle
3
Dies kann in der Tat ein Problem sein (wie es für mich war). Alle meine Passwörter für eines meiner Konten werden mit generiert pwgen. Heute habe ich eine neue für eine MySQL-Datenbank und deren Benutzer generiert. Leider enthielt das Passwort einen Backslash "\", den ich nicht als Fehlerursprung identifizierte (daran habe ich nicht einmal gedacht). Also suchte ich stundenlang nach einer Lösung. Nachdem das Passwort verzweifelt auf "123" gesetzt wurde, funktionierte die Anmeldung endlich. … Benutzer sollten sich bewusst sein, dass einige Sonderzeichen Probleme verursachen können, da MySQL keine Warnungen bei der Verwendung von Kennwörtern wie beispielsweise "daiy4ha4in7chooshuiphie \ Th * aew" anzeigt.
Arvid
1
Ich wollte dies als Antwort posten, wenn es noch nicht aufgetaucht war. Es war einfach zu weit unten auf der Liste, als dass ich es hätte bemerken können (also stoße ich es auf +1)
Assimilater
3

Für mich wurde dieses Problem durch eine neue Funktion von MySQL 5.7.2 verursacht: userEinträge werden ignoriert, wenn ihreplugin Feld leer ist.

mysql_native_passwordStellen Sie es zB ein , um sie wieder zu aktivieren:

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

Siehe die Versionshinweise zu MySQL 5.7.2 unter «Authentifizierungshinweise».

Aus irgendeinem Grund (vielleicht weil meine Passwort-Hashes vor 4.1 entfernt wurden), die mysql_upgrade Skript keinen Standard-Plugin-Wert festgelegt.

Ich fand es heraus, indem ich die folgende Warnmeldung in bemerkte /var/log/mysql/error.log:

[Warnung] Der Benutzereintrag 'foo' @ '%' hat einen leeren Plugin-Wert. Der Benutzer wird ignoriert und niemand kann sich mehr mit diesem Benutzer anmelden.

Ich poste diese Antwort hier, um vielleicht jemanden davon abzuhalten, die gleiche lächerliche Zeit dafür zu verwenden wie ich.

maxelost
quelle
2

Ich bin mir nicht sicher, ob dies jemand anderes hilfreich finden wird, aber ich bin auf denselben Fehler gestoßen und habe überall nach anonymen Benutzern gesucht ... und es gab keine. Das Problem bestand schließlich darin, dass das Benutzerkonto auf "SSL erforderlich" eingestellt war - was ich in PHPMyAdmin gefunden habe, indem ich zu Benutzerkonten gegangen bin und auf Berechtigungen für den Benutzer bearbeiten geklickt habe. Sobald ich diese Option deaktiviert hatte, funktionierte alles wie erwartet!

Alan
quelle
2

Debugging-Zusammenfassung

  • Auf Tippfehler prüfen: Benutzername oder Passwort.
  • Überprüfen Sie den Hostnamen und vergleichen Sie ihn mit dem Hostnamen der Tabelle mysql.user.
  • Überprüfen Sie, ob der Benutzer vorhanden ist oder nicht.
  • Überprüfen Sie, ob der Host die IP-Adresse oder den Hostnamen enthält.

Es besteht die große Wahrscheinlichkeit, dass Sie bei Ihrer Arbeit mehrmals auf dieses Problem gestoßen sind. Dieses Problem trat mir meistens aufgrund der falschen Eingabe von Benutzername oder Passwort auf. Obwohl dies einer der Gründe ist, gibt es viele andere Möglichkeiten, dass Sie dieses Problem bekommen. Manchmal sieht es sehr ähnlich aus, aber wenn Sie tiefer graben, werden Sie mehrere Faktoren erkennen, die zu diesem Fehler beitragen. In diesem Beitrag werden die meisten häufigen Gründe ausführlich erläutert und umgangen, um dieses Problem zu beheben.

Mögliche Gründe:

  • Fall 1: Tippfehler: Benutzername oder Passwort.

Dies ist der häufigste Grund für diesen Fehler. Wenn Sie den Benutzernamen oder das Passwort falsch eingegeben haben, wird dieser Fehler sicherlich angezeigt.

Lösung:

Die Lösung für diese Art von Fehler ist sehr einfach. Geben Sie einfach den richtigen Benutzernamen und das richtige Passwort ein. Dieser Fehler wird behoben. Falls Sie das Passwort vergessen haben, können Sie den Benutzernamen / das Passwort zurücksetzen. Wenn Sie das Kennwort für das Administrator- / Root-Konto vergessen haben, gibt es viele Möglichkeiten, das Root-Kennwort zurückzusetzen / erneut zu erfassen. Ich werde einen weiteren Beitrag darüber veröffentlichen, wie Sie das Root-Passwort zurücksetzen können, falls Sie das Root-Passwort vergessen.

  • Fall 2: Zugriff vom falschen Host.

MySQL bietet als Sicherheitsfunktion eine hostbasierte Einschränkung für den Benutzerzugriff. In unserer Produktionsumgebung haben wir die Zugriffsanforderung nur auf die Anwendungsserver beschränkt. Diese Funktion ist in vielen Produktionsszenarien sehr hilfreich.

Lösung:

Wenn Sie mit dieser Art von Problem konfrontiert sind, überprüfen Sie zunächst, ob Ihr Host zulässig ist oder nicht, indem Sie die Tabelle mysql.user überprüfen. Wenn es nicht definiert ist, können Sie einen neuen Datensatz aktualisieren oder in die Tabelle mysql.user einfügen. Im Allgemeinen ist der Zugriff als Root-Benutzer von einem Remotecomputer aus deaktiviert und aus Sicherheitsgründen keine bewährte Methode. Wenn Sie von mehreren Computern aus auf Ihren Server zugreifen müssen, geben Sie nur Zugriff auf diese Computer. Es ist besser, keine Platzhalter (%) zu verwenden und universelle Zugriffe zu ermöglichen. Lassen Sie mich die Tabelle mysql.user aktualisieren. Jetzt kann der Demouser von jedem Host aus auf den MySQL-Server zugreifen.

  • Fall 3: Benutzer existiert nicht auf dem Server.

Diese Art von Fehler tritt auf, wenn der Benutzer, auf den Sie zugreifen möchten, nicht auf dem MySQL-Server vorhanden ist.

Lösungen:

Wenn Sie auf diese Art von Problem stoßen, überprüfen Sie einfach, ob der Benutzer in der Tabelle mysql.user vorhanden ist oder nicht. Wenn der Datensatz nicht vorhanden ist, kann der Benutzer nicht darauf zugreifen. Wenn für diesen Benutzer Zugriff erforderlich ist, erstellen Sie einen neuen Benutzer mit diesem Benutzernamen.

  • Fall 4: Mischung aus numerischen und namenbasierten Hosts.

Wichtige Punkte

  • Es ist nicht ratsam, beim Definieren des Benutzerhosts Platzhalter zu verwenden. Versuchen Sie, den genauen Hostnamen zu verwenden.

  • Deaktivieren Sie die Root-Anmeldung vom Remotecomputer.

  • Verwenden Sie das Proxy-Benutzerkonzept.

Es gibt nur wenige andere Konzepte, die sich auf dieses Thema beziehen, und es ist ein ganz anderer Umfang dieses Artikels, auf Details dieser Themen einzugehen. Wir werden uns in den kommenden Artikeln mit den folgenden verwandten Themen befassen.

  • Was tun, wenn Sie das Root-Passwort auf dem MySQL-Server vergessen haben?
  • Probleme mit MySQL Access-Berechtigungen und benutzerbezogene Tabellen.
  • MySQL-Sicherheitsfunktionen mit Best Practices.

Ich hoffe, dieser Beitrag hilft Ihnen dabei, den MySQL-Fehlercode 1045 zu beheben. Zugriff für Benutzer in MySQL verweigert.

Abhijit Jagtap
quelle
2

Ich hoffe, Sie haben nicht mehr Schaden angerichtet, indem Sie auch den Benutzer debian-sys-wart in mysql gelöscht haben

Lassen Sie Ihren MySQL-Daemon normal laufen. Starten Sie Ihren MySQL-Client wie unten gezeigt

mysql -u debian-sys-maint -p

In einem anderen Terminal catdie Datei/etc/mysql/debian.cnf . Diese Datei enthält ein Passwort. Fügen Sie dieses Passwort ein, wenn Sie dazu aufgefordert werden.

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

ysk
quelle
2

Ich entdeckte einen weiteren Fall, der an der Oberfläche als Randfall erscheint. Ich kann über SELECT INTO .. ​​OUTFILE als root in das Dateisystem exportieren, aber nicht als regulärer Benutzer. Dies ist zwar eine Frage der Berechtigungen, aber ich habe mir das angesehen und sehe nichts besonders offensichtliches. Ich kann nur sagen, dass das Ausführen der Abfrage als normaler Benutzer, der über alle Berechtigungen für die betreffende Datenbank verfügt, den Fehler "Zugriff verweigert" zurückgibt, der mich zu diesem Thema geführt hat. Als ich das Transkript einer erfolgreichen Verwendung von SELECT INTO… OUTFILE in einem alten Projekt fand, bemerkte ich, dass ich als root angemeldet war. Sicher genug, als ich mich als root angemeldet habe, wurde die Abfrage wie erwartet ausgeführt.

David A. Gray
quelle
1

Update: Auf v8.0.15 (möglicherweise diese Version) diePASSWORD() funktioniert Funktion nicht.

Sie müssen:

  1. Stellen Sie sicher, dass Sie MySQL zuerst gestoppt haben.
  2. Führen Sie den Server im abgesicherten Modus mit Berechtigungsumgehung aus: sudo mysqld_safe --skip-grant-tables
  3. Anmeldung: mysql -u root
  4. mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. mysql> FLUSH PRIVILEGES;
  6. mysql> exit;
  7. Nochmal anmelden: mysql -u root
  8. mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
Mohamed Jaleel Nazir
quelle
0

Wenn Sie ausführen mysql -u bill -p, localhostwird in Ihre IP aufgelöst, da es 127.0.0.1 ist und in Ihrer /etc/hostsDatei als Standard 127.0.0.1 localhostvorhanden ist. MySQL interpretiert Sie also als bill@localhostdas, was nicht gewährt wird bill@'%'. Aus diesem Grund gibt es 2 verschiedene Datensätze für den rootBenutzer als Ergebnis vonselect host, user from mysql.user; Abfrage .

Es gibt zwei Möglichkeiten, um dieses Problem zu beheben.

Eine davon ist die Angabe einer IP-Adresse, die /etc/hostsbeim Versuch, sich anzumelden, nicht umgekehrt nach Dateien aufgelöst wird . Zum Beispiel ist die IP des Servers 10.0.0.2. Wenn Sie den Befehl ausführen mysql -u bill -p -h 10.0.0.2, können Sie sich anmelden. Wenn Sie tippen select user();, erhalten Sie [email protected]. Natürlich sollte kein Domainname in diese IP in Ihrer /etc/hostsDatei aufgelöst werden.

Zweitens müssen Sie für diesen bestimmten Domainnamen Zugriff gewähren. Für bill@localhostsollten Sie Befehl aufrufen grant all privileges on *.* to bill@localhost identified by 'billpass';. In diesem Fall können Sie sich mit dem Befehl anmelden mysql -u bill -p. Nach der Anmeldung select user();kehrt der Befehl zurück bill@localhost.

Dies ist jedoch nur der Fall, wenn Sie versuchen, einen MySQL-Server auf demselben Host anzumelden. Von Remote-Hosts verhält sich MySQL erwartungsgemäß. Mit '%' können Sie sich anmelden.

Shnkc
quelle
0

Ich habe dies behoben, indem ich die alten fehlerhaften Benutzer-Rechnungseinträge gelöscht habe (dies ist der wichtige Teil: sowohl aus mysql.user als auch aus mysql.db ) und dann denselben Benutzer wie zuvor traurig erstellt habe:

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

Arbeitete, Benutzer verbindet. Jetzt werde ich einige Vorrechte daraus entfernen :)

dxvargas
quelle
0

Ich habe den gleichen Fehler festgestellt. Das Setup, das nicht funktioniert hat, ist wie folgt:

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

Das bearbeitete Setup unten hat es zum Laufen gebracht. Beachten Sie den Unterschied?

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

Der Unterschied sind die doppelten Anführungszeichen. Sie scheinen in PHP im Gegensatz zu Java von großer Bedeutung zu sein und wirken sich aus, wenn es darum geht, Zeichen zu maskieren, URLs einzurichten und jetzt Parameter an eine Funktion zu übergeben. Sie sind hübscher (ich weiß), verwenden aber immer so viele einfache Anführungszeichen wie möglich, dann können doppelte Anführungszeichen bei Bedarf in diese verschachtelt werden.

Dieser Fehler trat auf, als ich meine Anwendung auf einer Linux-Box im Gegensatz zu einer Windows-Umgebung testete.

Raymond Wachaga
quelle
0

Ich hatte ähnliche Probleme, weil mein Passwort ";" char bricht mein Passwort, wenn ich es im ersten Moment erstelle. Vorsicht dabei, wenn Ihnen helfen kann.

Genaut
quelle
0

Dies mag für sehr wenige Menschen gelten, aber hier geht es weiter. Verwenden Sie kein Ausrufezeichen !in Ihrem Passwort.

Ich habe den obigen Fehler mit MariaDB gemacht und bekommen. Als ich es auf Zahlen und Buchstaben vereinfachte, funktionierte es. Andere Zeichen wie @und $funktionieren einwandfrei - Ich habe diese Zeichen in einem anderen Benutzer in derselben Instanz verwendet.

Die fünfte Antwort an dieser Adresse führte mich zu meinem Fix.

Chiwda
quelle
0

Unter Windows können Sie Folgendes beheben:

FEHLER 1045 (28000): Zugriff für Benutzer 'root' @ 'localhost' verweigert (mit Passwort: NO)

  1. Deinstallieren Sie MySQL über die Systemsteuerung
  2. Löschen Sie den MySQL-Ordner aus C:\Program Files,C:\Program Files (x86)undC:\ProgramData
  3. Installieren Sie MySQL
Sanjay
quelle
Versuchte alle anderen Antworten, entschied sich schließlich, dies zu versuchen und es funktionierte!
Jasonoriordan
0

Dies kann auch passieren, wenn MySQL unter einem Betriebssystem ausgeführt wird, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, z. B. Windows.

Ich habe beispielsweise festgestellt, dass der Versuch, mit diesen Anmeldeinformationen eine Verbindung zu einer Datenbank herzustellen, fehlgeschlagen ist:

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

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

FEHLER 1045 (28000): Zugriff für Benutzer 'specialuser'@'10.0.1.113' verweigert (mit Passwort: JA)

Dies gelang jedoch:

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

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

Passwort eingeben:

kguest
quelle
0

Heutzutage! Lösung für :

MySQL ERROR 1045 (28000): Zugriff für Benutzer 'user' @ 'localhost' verweigert (mit Passwort: YES);

Wampserver 3.2.0 Neuinstallation oder Upgrade

Wahrscheinlich ist die xampVerwendung mariaDBals Standard gut.

WampServer kommt mit mariaDBund MySQL und installiert mariaDBals Standard auf 3306 Port und MySQL auf 3307, Port manchmal 3308.

Verbinden mit mysql!

Bei der Installation wird gefragt , ob mariaDBoder verwendet werden MySqlsoll. Aber mariaDB ist standardmäßig aktiviert und Sie können es nicht ändernmysql Option und installieren.

Wenn die Installation abgeschlossen ist, werden beide mariaDBauf dem Standardport 3306 und ausgeführtmysql auf einem anderen Port 3307 oder 3308 ausgeführt.

Klicken wampserverSie mit der rechten Maustaste auf das Symbol, wo es ausgeführt werden soll, in der rechten unteren Ecke, gehen Sie zu den Werkzeugen und sehen Sie, ob es korrekt istmysql Laufport.

Und fügen Sie es wie folgt in Ihre Datenbankverbindung ein:

$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 : Ich benutze pdo.

Weitere Informationen finden Sie hier: https://sourceforge.net/projects/wampserver/

Dlk
quelle
Bitte verwenden Sie keine Backticks zur Hervorhebung. Sie sollten nur für Code verwendet werden. Wörter wie MySQL oder Wampserver sind kein Code.
Dharman