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!
quelle
-p
und dem Passwort. Ich weiß, dass es albern ist, könnte aber jemandem helfen.Antworten:
Beachten Sie, wie die Ausgabe von
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:
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.
quelle
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:
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 :
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.
quelle
cd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
/usr/bin/mysql_upgrade -u root -p
Passwort ein und Bob ist Ihr Onkel!mysqldump ... --all-databases
Ihre Benutzer (natürlich) ersetzt wurden , wenn Sie Datenbanken aus MySQL <= 5.1 über exportiert und diese dann in MySQL> = 5.5 importiert haben, aber Sieroot
haben das gleiche Problem wie OP. Undmysql_upgrade
wird nicht funktionieren - Sie müssen--force
Flag hinzufügen , dhmysql_upgrade -u root -p --force
. Hoffe das hilft jemandem hier.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:
Beachten Sie, dass wir `%`. * Anstelle von *. * Verwenden.
quelle
'%'.*
funktioniert aber nicht*.*
?'%'.*
anstelle von verwenden,`%`.*
funktioniert nicht. Sie müssen verwenden`%`.*
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:
Setzen Sie dann das Root-Passwort (/ usr / bin / mysqladmin -u root-Passwort) und alles funktionierte wie erwartet mit den GRANT-Befehlen ...
quelle
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.quelle
Ich hatte das gleiche Problem, dh alle für root gewährten Berechtigungen:
... aber noch keine Tabelle erstellen dürfen:
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.
quelle
Unter Debian ( Wheezy , 7.8) mit MySQL 5.5.40 stellte ich fest
SELECT * FROM mysql.user WHERE User='root'\G
, dass dieEvent_priv
Felder 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.
quelle
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:
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:
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
quelle
Die Eingabe
SHOW GRANTS FOR 'root'@'localhost';
zeigte mir ein verdecktes Passwort, also loggte ich mich mit HeidiSQL auf einem anderen System (unter Verwendungroot
des Benutzernamens und des entsprechenden Passworts) bei MySQL dieses Systems ein und tippte einGRANT 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;
quelle
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).
quelle
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 :
quelle
Für diejenigen, die immer noch wie ich darauf stoßen, lohnt es sich zu überprüfen, ob der Versuch
GRANT
noch nicht existiert:In meinem Fall lag der Fehler nicht daran, dass ein Berechtigungsfehler aufgetreten ist, sondern daran, dass der
GRANT
bereits vorhanden war.quelle
Eine einfache Lösung, die für mich immer funktioniert, wenn MySQL-Fehler "Zugriff verweigert" auftreten: Verwenden
sudo
.Dann sind die erforderlichen Berechtigungen für
GRANT
Befehle vorhanden.quelle