webentwicklung-frage-antwort-db.com.de

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

Ich habe mir eine Reihe ähnlicher Fragen angesehen und demonstriere, dass ich die Grundlagen überprüft habe. Das heißt 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 bei dem ich das Kennwort bereits eingegeben habe und Zugriff erhalten habe? (Der Vollständigkeit halber habe ich versucht, das falsche Kennwort einzugeben, um sicherzustellen, dass der MySQL-Client mir den Zugriff beim Programmstart verweigert.)

Hintergrund:

An der Shell des Rechners angemeldet, auf dem der MySQL-Server über ssh ausgeführt wird, logge ich mich als root ein:

[[email protected] ~]$ 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. Wenn ich die Antworten auf ähnliche Fragen lese, sollte ich sicherstellen, dass die Berechtigungen mit den Angaben in den Grant-Tabellen übereinstimmen

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

mysql> 

Als nächstes stelle sicher, dass ich der bin, von dem ich denke, dass ich es bin:

mysql> SELECT user();
+----------------+
| user()         |
+----------------+
| [email protected] |
+----------------+
1 row in set (0.00 sec)

... und wirklich wirklich stellen Sie sicher:

mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| [email protected] |
+----------------+
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 [email protected]                                                                                                                                                                                                                                                                                                                                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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)

Nun, das ist etwas schwer zu lesen. Versuchen wir es also auf folgende Weise (Sie werden auch feststellen, dass es einen nicht-lokalen "root" -Nutzer 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 alle 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 so etwas 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. Ich werde darüber nachdenken, dies zu tun, sobald ich einem anderen Benutzer einige Berechtigungen erteilen kann.

Danke!

158
Steven Scotten

Beachten Sie, wie die Ausgabe von

SHOW GRANTS FOR 'root'@'localhost';

habe nicht "ALL PRIVILEGES" gesagt, sondern musste darlegen, was root @ localhost hat.

GRANT ALL PRIVILEGES wird fehlschlagen, weil ein Benutzer nicht gewähren kann, was er/sie nicht hat, und der Server scheint zu denken, dass etwas nicht hier ist ...

Was fehlt dann noch?

Auf meinem System erhalte 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 [email protected]                                           |
+---------------------------------------------------------------------+
| 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)

In 5.5 gibt es auch neue Tabellen wie 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, bei dem die fehlenden Tabellen/Spalten hinzugefügt werden.

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

52
Marc Alff

Ich hatte auch das gleiche Problem, aber unter Windows nach dem Upgrade von MySQL 5.1 auf MySQL 5.5. Ich habe bereits versucht, das in hier , hier , hier , hier , nein Hinweis. Ich bekomme immer noch den gleichen Fehler:

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

Ich bin in der Lage, mich normal zu verbinden, alle Datenbanken anzuzeigen, auszuwählen und einzufügen, Benutzer zu erstellen und hinzuzufügen, und wenn es um GRANT geht, bin ich durcheinander. Der Fehler "Zugriff verweigert" wird erneut angezeigt.

Ich konnte dieses Problem lösen, indem ich die Berechtigungen mit dem folgenden Befehl im Verzeichnis bin/des MySQL-Servers korrigierte, wie in hier erwähnt:

C:\MySQL Server 5.5\bin> mysql_upgrade

Dann ist das Problem weg. Ich hoffe, dass diese Lösung auch unter Linux funktioniert, da MySQL normalerweise unter Linux und Windows den gleichen Befehl bereitstellt.

72
Aryo

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

56
Anuj Gupta

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 waren (mit Unterschieden wie erklärt von Marc Alff - danke!)

Ich hätte ein mysql_upgrade durchführen können, aber als 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 alle haben wie erwartet mit den GRANT-Befehlen funktioniert ...

7
phil_w

Ich hatte das gleiche Problem, d. H. Alle Berechtigungen, die für root gewährt wurden:

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

... darf aber noch keine Tabelle erstellen:

 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 ist auf einen nervigen Benutzerfehler zurückzuführen, d. H. Ich habe keine Datenbank ausgewählt. Nach der Ausgabe von SE dbname hat es gut funktioniert.

5
tzp

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

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

Die etwas verwirrende Fehlermeldung, die Sie erhalten, lautet: ERROR 1410 (42000): You are not allowed to create a user with GRANT

Um Benutzer in Version 8 zu erstellen, müssen Sie zwei Schritte ausführen:

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 angeben (anstelle von GRANT ALL PRIVILEGES), z. GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER

4
gloriphobia

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

Lesen Sie diese DOC , um zu verstehen, wie Sie Konten Passwörter zuweisen und verwalten.

Überprüfen Sie auch, ob die Berechtigung für den Ordner /var/lib/mysql/mysql 711 ist oder nicht.

4

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

Das Ausführen von 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 verwenden:

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

… Und dann genauer auf eine einzelne Datenbank/Benutzerkonto anwenden.

4
William Turrell

Durch die Eingabe von SHOW GRANTS FOR 'root'@'localhost'; wurde mir ein verdecktes Kennwort angezeigt. Daher habe ich mich mit HeidiSQL auf einem anderen System bei mysql dieses Systems angemeldet (wobei root als Benutzername und das entsprechende Kennwort verwendet wurde) und eingegeben
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

und es hat funktioniert, als ich zum System zurückgekehrt bin und mich mit angemeldet habe
mysql -uroot -pthepassword;

3
Nav

Ich habe versucht, Berechtigungen zu performance_schema hinzuzufügen, was mysql bug http://bugs.mysql.com/bug.php?id=44898 (Problemumgehung zum Hinzufügen von --single-transaction) ).

2
pevik

Für diejenigen, die immer noch wie ich darüber stolpern, lohnt es sich zu überprüfen, ob das versuchte GRANT noch nicht existiert:

SHOW GRANTS FOR username;

In meinem Fall lag der Fehler nicht tatsächlich an einem Berechtigungsfehler, sondern daran, dass GRANT bereits vorhanden war.

1
mopo922

Ich hatte das gleiche Problem und musste viele SO Posts und die Dokumentation von Google lesen. Ich habe dies endlich in den Cloud SQL FAQ gefunden :

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

1
kurdtpage