Zugriff für Benutzer 'root' @ 'localhost' verweigert, während versucht wird, Berechtigungen zu erteilen. Wie erteile ich Privilegien?

166

Ich habe mir eine Reihe ähnlicher Fragen angesehen und zeige, dass ich die Grundlagen überprüft habe. Das heißt aber natürlich nicht, dass ich etwas völlig Offensichtliches nicht verpasst habe. :-)

Meine Frage lautet: Warum wird mir der Zugriff auf einen Benutzer verweigert, der die Berechtigung hat, das zu tun, was ich versuche, und wo ich das Kennwort bereits eingegeben und den Zugriff erhalten habe? (Der Vollständigkeit halber habe ich versucht, das falsche Passwort einzugeben, um sicherzustellen, dass der MySQL-Client mir beim Programmstart den Zugriff verweigert.)

Hintergrund:

Angemeldet bei der Shell des Computers, auf dem der MySQL-Server über ssh ausgeführt wird, melde ich mich als root an:

[myname@host ~]$ mysql -u root -p -hlocalhost
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 62396
Server version: 5.5.18-log MySQL Community Server (GPL)

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

mysql> 

Genial. Das Lesen der Antworten auf ähnliche Fragen legt nahe, dass ich sicherstellen sollte, dass die Berechtigungen mit den Angaben in den Gewährungstabellen aktuell sind

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> 

Als nächstes stellen Sie sicher, dass ich der bin, für den ich mich halte:

mysql> SELECT user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

... und wirklich wirklich sicherstellen:

mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> 

So weit, ist es gut. Welche Privilegien habe ich jetzt?

mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                                                                                                                                                                                                                                                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '[OBSCURED]' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Das ist etwas schwer zu lesen, also versuchen wir es auf diese Weise (Sie werden auch feststellen, dass es einen nicht-lokalen Host-Root-Benutzer gibt):

mysql> SELECT * FROM mysql.user WHERE User='root'\G
*************************** 1. row ***************************
                 Host: localhost
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
*************************** 2. row ***************************
                 Host: [HOSTNAME].com
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
 2 rows in set (0.00 sec)

Genial! MySQL glaubt, dass ich root @ localhost bin und root @ localhost all diese Berechtigungen hat. Das heißt, ich sollte tun können, was ich will, oder?

mysql> GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Wie hätte ich etwas so Grundlegendes vermasseln können?

Randnotiz: Für alle, die vorschlagen möchten, dass ich keinen Benutzer namens root mit allen Berechtigungen habe, ist das großartig und etwas, das ich in Betracht ziehen werde, sobald ich einem anderen Benutzer einige Berechtigungen erteilen kann.

Danke dir!

Steven Scotten
quelle
2
Ich erlebe dasselbe aus der Ferne (und wähle * FROM mysql.user aus, wobei user = 'root' und host = '%' die gleichen Berechtigungen wie Sie haben). JEDOCH FUNKTIONIERT ES AUF LOCALHOST, obwohl die Zeile in mysql.user mit host = '%' mit der Zeile mit host = 'localhost' identisch ist, abgesehen von diesem Feld. Ich verwende 5.0.45 unter Windows Server 2003. Alle Antworten werden dankbar angenommen!
Richard Fawcett
3
+1 für eine so organisierte Frage!
Dewsworld
1
Stellen Sie sicher, dass Sie cmd geöffnet haben, indem Sie als Administrator ausgeführt werden
Lijo
1
Ich hatte gerade ein Leerzeichen zwischen -pund dem Passwort. Ich weiß, dass es albern ist, könnte aber jemandem helfen.
Vinay W

Antworten:

57

Beachten Sie, wie die Ausgabe von

SHOW GRANTS FOR 'root'@'localhost';

sagte nicht 'ALLE PRIVILEGIEN', sondern musste darlegen, was root @ localhost hat.

ALLE PRIVILEGIEN GEWÄHRLEISTEN schlagen fehl, weil ein Benutzer nicht gewähren kann, was er nicht hat, und der Server scheint zu glauben, dass etwas nicht hier ist ...

Was fehlt dann?

Auf meinem System bekomme ich Folgendes:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.21-log |
+------------+
1 row in set (0.00 sec)

mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM mysql.user WHERE User='root' and Host='localhost'\G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password: 
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y <----------------------------- new column in 5.5
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: <------------------------------- new column in 5.5
 authentication_string: <------------------------------- new column in 5.5
1 row in set (0.00 sec)

Es gibt auch neue Tabellen in 5.5, wie z. B. mysql.proxies_user: Stellen Sie sicher, dass Sie sie haben.

Bei der Installation einer brandneuen MySQL-Serverinstanz erstellt das Installationsskript alle MySQL. * -Tabellen mit der richtigen Struktur.

Stellen Sie beim Upgrade von einer alten Version sicher, dass das richtige Upgrade-Verfahren (mysql_upgrade) verwendet wird, um die fehlenden Tabellen / Spalten hinzuzufügen.

Es ist nur eine Vermutung, aber es scheint, dass mysql_upgrade für diese Instanz nicht durchgeführt wurde, was das beobachtete Verhalten verursacht.

Marc Alff
quelle
7
Dies sind nützliche Informationen, aber wie behebe ich das Problem?
August
2
@augurar, Führen Sie mysql_upgrade
Marc Alff
Oder überprüfen Sie, ob Sie einen anderen Benutzer mit 'ALL PRIVILEGES' haben, wechseln Sie zu diesem und ändern Sie die Berechtigungen für den lokalen Host. Zum Beispiel hatte ich alle Berechtigungen für [email protected] und root @ localhost nicht.
Carabus Manuel
72

Ich hatte auch das gleiche Problem damit, aber unter Windows nach dem Upgrade auf MySQL 5.5 von MySQL 5.1. Ich habe bereits versucht, das hier , hier , hier und hier erwähnte Passwort zu ändern, zu erstellen und zurückzusetzen , keine Ahnung. Ich bekomme immer noch den gleichen Fehler:

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

Ich kann mich normal verbinden, alle Datenbanken anzeigen, auswählen und einfügen, Benutzer erstellen und hinzufügen, und wenn es um GRANT geht, bin ich durcheinander. Der Fehler "Zugriff verweigert" wird erneut angezeigt.

Ich habe es geschafft, dieses Problem zu lösen, indem ich die Berechtigungen mit dem folgenden Befehl im binS-Verzeichnis des MySQL-Servers behoben habe, wie hier erwähnt :

C:\MySQL Server 5.5\bin> mysql_upgrade

Dann war das Problem verschwunden. Ich hoffe, dass diese Lösung auch unter Linux funktioniert, da MySQL normalerweise den gleichen Befehl sowohl unter Linux als auch unter Windows bereitstellt.

Aryo
quelle
2
Danke .. in Mac OS mit MySQL über Homebrew installiert führen Sie den folgenden Befehlcd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
Zoras
30
Wenn Sie auf einem CentO sind oder MySQL über einen Paketmanager installiert haben, ist dies wahrscheinlich der Befehl, den Sie ausführen sollten: Geben Sie das /usr/bin/mysql_upgrade -u root -pPasswort ein und Bob ist Ihr Onkel!
Zjoia
Nachdem ich hier und da mit so vielen Kommentaren gekämpft hatte, half mir dieser. Vielen Dank
siddhusingh
Ich weiß, dass dies älter ist, aber das hat mir sehr geholfen und ich wollte noch einen Kommentar für zukünftige Besucher hinzufügen: Wenn Sie beim Versuch, mysql_upgrade auszuführen, den Zugriff verweigert bekommen, versuchen Sie es stattdessen so: mysql_upgrade -p
blizz
2
Ich habe festgestellt, dass mysqldump ... --all-databasesIhre Benutzer (natürlich) ersetzt wurden , wenn Sie Datenbanken aus MySQL <= 5.1 über exportiert und diese dann in MySQL> = 5.5 importiert haben, aber Sie roothaben das gleiche Problem wie OP. Und mysql_upgradewird nicht funktionieren - Sie müssen --forceFlag hinzufügen , dh mysql_upgrade -u root -p --force. Hoffe das hilft jemandem hier.
Gregoltsov
62

Dies kann passieren, wenn Sie versuchen, einem anderen Benutzer alle Berechtigungen für alle Tabellen zu erteilen, da die Tabelle mysql.users für einen anderen Benutzer als root als nicht zulässig gilt.

Folgendes sollte jedoch funktionieren:

GRANT ALL PRIVILEGES ON `%`.* TO '[user]'@'[hostname]' IDENTIFIED BY '[password]' WITH GRANT OPTION;

Beachten Sie, dass wir `%`. * Anstelle von *. * Verwenden.

Anuj Gupta
quelle
28
Bitte erklären Sie dies. Warum '%'.*funktioniert aber nicht *.*?
Pacerier
Dies ist der richtige Weg. Sie müssen sich als root bei MySQL anmelden und dann versuchen, Berechtigungen zu erteilen.
Nav
Ich
bekomme
Vielen Dank, ich habe versucht, über eine Python-Anwendung mit pymysql auf MySQL zuzugreifen. Es wurde ein Fehler mit der Meldung "Host darf keine Verbindung zu diesem MariaDB-Server herstellen" angezeigt , der durch Hinzufügen eines neuen Benutzers [hier] ( stackoverflow.com/questions/19101243/… ) behoben wurde. Anschließend wurde ein weiterer Fehler mit der Meldung "Zugriff für Benutzer verweigert" angezeigt. und löste es durch Ihre Methode.
Balraj Bains
1
Wenn Sie '%'.*anstelle von verwenden, `%`.*funktioniert nicht. Sie müssen verwenden`%`.*
Rosario Russo
7

Dies ist mir passiert, als ich versucht habe, eine höhere MySQL-Version als die mit der Distribution gelieferte zu installieren.

Ich habe die alte Version gelöscht und dann die neue installiert (rpm -e ... dann rpm -i MySQL-Server *), aber nicht bemerkt, dass die Dateien in / var / lib / mysql noch von der älteren Version stammen (mit Unterschieden als erklärt von Marc Alff - danke!)

Ich hätte ein mysql_upgrade machen können, aber da ich von vorne anfangen wollte, tat ich Folgendes:

# su - mysql
$ rm -rf /var/lib/mysql/*
$ mysql_install_db
# /etc/init.d/mysql start

Setzen Sie dann das Root-Passwort (/ usr / bin / mysqladmin -u root-Passwort) und alles funktionierte wie erwartet mit den GRANT-Befehlen ...

phil_w
quelle
Danke, das hat mir geholfen. Zum Glück war es egal, ob ich alle DBs ausgelöscht habe ...
Jarrod Mosen
5

Grundsätzlich tritt dieser Fehler auf, wenn Sie kein Kennwort angegeben haben. Dies bedeutet, dass in einer Optionsdatei ein falsches Kennwort aufgeführt ist.

In diesem DOC erfahren Sie, wie Sie Konten Kennwörter zuweisen und verwalten.

Überprüfen Sie außerdem, ob die Berechtigung für den Ordner /var/lib/mysql/mysql 711 lautet oder nicht.

Mithun Sasidharan
quelle
Das hat bei mir funktioniert. Es sieht so aus, als ob MySQL keine Berechtigungen für 'user' @ 'localhost' erstellt. Also musste ich diesen Benutzer erstellen und sicherstellen, dass er ein Passwort hatte.
Jerinaw
Die Berechtigungen waren falsch! Ich bin erstaunt. Vielen Dank für die Veröffentlichung.
Adam
5

Ich hatte das gleiche Problem, dh alle für root gewährten Berechtigungen:

SHOW GRANTS FOR 'root'@'localhost'\G
*************************** 1. row ***************************
Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*[blabla]' WITH GRANT OPTION

... aber noch keine Tabelle erstellen dürfen:

 create table t3(id int, txt varchar(50), primary key(id));
ERROR 1142 (42000): CREATE command denied to user 'root'@'localhost' for table 't3'

Nun, es wurde durch einen nervigen Benutzerfehler verursacht, dh ich habe keine Datenbank ausgewählt. Nach der Ausgabe von USE dbname hat es gut funktioniert.

tzp
quelle
5

Unter Debian ( Wheezy , 7.8) mit MySQL 5.5.40 stellte ich fest SELECT * FROM mysql.user WHERE User='root'\G, dass die Event_privFelder und 'Trigger_priv` vorhanden waren , aber nicht auf Y gesetzt waren.

Laufen mysql_upgrade(mit oder ohne --force) machte keinen Unterschied; Ich musste ein Handbuch machen:

update user set Event_priv = 'Y',Trigger_priv = 'Y' where user = 'root'

Dann könnte ich endlich gebrauchen:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION

… Und dann genauer auf ein einzelnes Datenbank- / Benutzerkonto anwenden.

William Turrell
quelle
1
Dies löste das Problem auch für mich, aber erst nachdem ich herausgefunden hatte, dass Sie PRIVILEGIEN SPÜLEN müssen; Danach und erneut anmelden, um die Grant-Option festzulegen.
Hendrik
5

Möglicherweise sind Sie mit MySQL Version 8 (wie ich) auf diese Frage gekommen und haben keine zufriedenstellende Antwort gefunden. In Version 8 können Sie solche Benutzer nicht mehr erstellen:

GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;

Die ziemlich verwirrende Fehlermeldung, die Sie zurückerhalten, lautet: ERROR 1410 (42000): You are not allowed to create a user with GRANT

Um Benutzer in Version 8 zu erstellen, müssen Sie dies in zwei Schritten tun:

CREATE USER 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]';
GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' WITH GRANT OPTION;

Wenn Sie möchten, können Sie natürlich auch eine begrenzte Anzahl von Berechtigungen (anstelle von GRANT ALL PRIVILEGES) bereitstellen , zGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER

Gloriphobie
quelle
3

Die Eingabe SHOW GRANTS FOR 'root'@'localhost';zeigte mir ein verdecktes Passwort, also loggte ich mich mit HeidiSQL auf einem anderen System (unter Verwendung rootdes Benutzernamens und des entsprechenden Passworts) bei MySQL dieses Systems ein und tippte ein
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

und es funktionierte, als ich zum System zurückkehrte und mich mit anmeldete
mysql -uroot -pthepassword;

Nav
quelle
2

Ich habe dies ausgeführt, als ich versucht habe, Performance_schema Berechtigungen hinzuzufügen. Dies ist der MySQL- Fehler http://bugs.mysql.com/bug.php?id=44898 (Problemumgehung zum Hinzufügen von --single-transaction).

pevik
quelle
2

Ich hatte das gleiche Problem und es dauerte viel, SO-Beiträge und Googles Dokumentation zu lesen. Ich habe dies schließlich in den Cloud SQL-FAQ gefunden :

Google Cloud SQL unterstützt keine SUPER-Berechtigungen. Dies bedeutet, dass GRANT ALL PRIVILEGESAnweisungen nicht funktionieren. Alternativ können Sie verwendenGRANT ALL ON `%`.*

kurdtpage
quelle
1

Für diejenigen, die immer noch wie ich darauf stoßen, lohnt es sich zu überprüfen, ob der Versuch GRANTnoch nicht existiert:

SHOW GRANTS FOR username;

In meinem Fall lag der Fehler nicht daran, dass ein Berechtigungsfehler aufgetreten ist, sondern daran, dass der GRANTbereits vorhanden war.

mopo922
quelle
1

Eine einfache Lösung, die für mich immer funktioniert, wenn MySQL-Fehler "Zugriff verweigert" auftreten: Verwenden sudo.

sudo mysql -u root

Dann sind die erforderlichen Berechtigungen für GRANTBefehle vorhanden.

Verdächtiger
quelle