So gewähren Sie Root-Benutzern in MySQL 8.0 alle Berechtigungen


109

Versucht

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

Bekommen

FEHLER 1064 (42000): In Ihrer SQL-Syntax ist ein Fehler aufgetreten. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von 'IDENTIFIED BY' root 'WITH GRANT OPTION' in Zeile 1.

Hinweis: Dasselbe funktioniert, wenn es in früheren Versionen versucht wurde.

Auch versucht

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Bekommen

FEHLER 1410 (42000): Mit GRANT dürfen Sie keinen Benutzer erstellen

MySQL (8.0.11.0) Benutzername / Passwort ist root / root.


verbindest du dich direkt mit mysql oder benutzt du ssh?
Harald

direkt von der Eingabeaufforderung als Root-Benutzer
Praveen

1
Siehe die Unterschiede zwischen 13.7.1.6 GRANT-Syntax und 13.7.1.4 GRANT-Syntax .
wchiquito

7
Ich bin zu fest mit dem gleichen Problem. Ich starte die MySQL-Shell mit mysql -u root -pund gebe dann das Root-Passwort ein. Dann habe ich es versucht GRANT GRANT OPTION ON *.* TO 'root'@'%';und ich bekomme den FehlerERROR 1410 (42000): You are not allowed to create a user with GRANT
aiman

Antworten:


194

Ab MySQL 8 können Sie mit dem GRANTBefehl keinen Benutzer mehr (implizit) erstellen . Verwenden Sie stattdessen CREATE USER , gefolgt von der GRANT- Anweisung:

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Vorsicht vor den Sicherheitsrisiken WITH GRANT OPTION, siehe:


3
Dieser Befehl erstellt einen neuen Benutzer. Ich möchte jedoch vorhandenen Root-Benutzern Berechtigungen gewähren. mysql> CREATE USER 'root' @ '%' IDENTIFIED BY 'root'; Abfrage OK, 0 Zeilen betroffen (0,31 Sek.) Mysql> GRANT ALL PRIVILEGES ON . TO 'root' @ '%' WITH GRANT OPTION; Abfrage OK, 0 Zeilen betroffen (0,16 Sek.) Mysql> SELECT User FROM mysql.user; + ------------------ + | Benutzer | + ------------------ + | root | | mysql.infoschema | | mysql.session | | mysql.sys | | root | + ------------------ + 5 Zeilen im Satz (0,00 Sek.)
Praveen

Jetzt sind zwei Benutzer mit dem Namen root in der Benutzertabelle vorhanden !! Außerdem kann ich keine Remoteverbindung herstellen (Root-Benutzer). ------------- Details: Typ: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException SQL-Status: 08001
Praveen

Seltsam. Die Fehlermeldung in Ihrer Frage zeigt an, dass dieser Benutzer nicht vorhanden ist. Dies ist der einzige Grund, warum ich vorgeschlagen habe, es zuerst zu erstellen. Und es ist unmöglich, denselben Benutzer zweimal in einer einzelnen MySQL-Instanz zu haben. Sie unterscheiden sich entweder im Namen oder im Host-Teil.
Mike Lischke

2
Diese beiden Benutzer stellen eine Verbindung von verschiedenen Hosts her. Führen Sie SELECT User, Host FROM mysql.user;stattdessen aus.
Mike Lischke

3
Habe diesen Fehler bekommen:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi

31

1) Das hat bei mir funktioniert. Erstellen Sie zunächst einen neuen Benutzer. Beispiel: Benutzer foomit Passwortbar

> mysql> CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';

2) Ersetzen Sie den folgenden Code durch einen Benutzernamen mit 'foo'.

> mysql> GRANT ALL PRIVILEGES ON database_name.* TO'foo'@'localhost';

Hinweis: Datenbankname ist die Datenbank, für die Sie Berechtigungen haben möchten . bedeutet alles auf alles

3) Melden Sie sich als Benutzer foo an

mysql> mysql -u foo -p

Passwort: bar

4) Stellen Sie sicher, dass Ihre anfängliche Verbindung von Sequelize auf poo mit pw bar eingestellt ist.


5
Dies beantwortet die Frage bei weitem nicht. Es geht um globale Berechtigungen und nicht um datenbankspezifische Berechtigungen.
tmuecksch

28

Ich sehe viele (falsche) Antworten, es ist genauso einfach:

USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'pass';
GRANT ALL ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;

Hinweis: Anstelle einer selbst erstellten können userSie rooteine Verbindung zur Datenbank herstellen. Die Verwendung des Standard-Root-Kontos, mit dem eine Anwendung eine Verbindung zur Datenbank herstellen kann, ist jedoch nicht die bevorzugte Methode.

Alternative Privilegien (seien Sie vorsichtig und denken Sie an das Prinzip der geringsten Privilegien):

-- Grant user permissions to all tables in my_database from localhost --
GRANT ALL ON my_database.* TO 'user'@'localhost';

-- Grant user permissions to my_table in my_database from localhost --
GRANT ALL ON my_database.my_table TO 'user'@'localhost';

-- Grant user permissions to all tables and databases from all hosts --
GRANT ALL ON *.* TO 'user'@'*';

Wenn Sie irgendwie auf folgenden Fehler stoßen würden:

FEHLER 1130 (HY000): Host '1.2.3.4' darf keine Verbindung zu diesem MySQL-Server herstellen

Sie müssen die folgenden zwei Zeilen hinzufügen / ändern /etc/mysql/my.cnfund MySQL neu starten:

bind-address           = 0.0.0.0
skip-networking

Könnten Sie näher erläutern, warum es nicht funktioniert, anstatt sich nur zu beschweren? Auf diese Weise kann ich Ihnen helfen oder zusätzliche Informationen veröffentlichen.
Nebulastischer

Diese Antwort adressiert nicht einmal die Frage nach dem Root- Benutzerrecht.
Joseph,

Die Antwort wurde entsprechend aktualisiert.
Nebulastischer

1
Beste Antwort, jetzt ist es GRANT ALL ONfür MySQL 8.0. Ich glaube auch, dass Sie anstelle der Deaktivierung an beliebige Befehle bind-addressbinden 127.0.0.1und diese einbinden können --protocol=tcp. Die Leistung auf lange Sicht ist auch besser als mit localhost.
Jesse Nickles

3

Meine Spezifikationen:

mysql --version
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

Was hat bei mir funktioniert:

mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'desired_password';
mysql> GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' WITH GRANT OPTION;

Antwort in beiden Fragen:

Query OK, O rows affected (0.10 sec*)

NB: Ich habe zuvor eine Datenbank (Datenbankname) erstellt und einen Benutzeranmeldeinformationen mit allen Berechtigungen erstellt, die allen Tabellen in der Datenbank gewährt wurden, anstatt den Standard-Root-Benutzer zu verwenden, den ich irgendwo gelesen habe. Dies ist eine bewährte Methode.


3

Der angegebene Benutzer ist in MySQL einfach nicht vorhanden (daher versucht MySQL, ihn mit GRANT wie vor Version 8 zu erstellen, schlägt jedoch mit den in dieser Version eingeführten Einschränkungen fehl).

MySQL ist zu diesem Zeitpunkt ziemlich dumm. Wenn Sie also 'root' @ 'localhost' haben und versuchen, 'root' @ '%' Berechtigungen zu erteilen, werden diese als unterschiedliche Benutzer behandelt und nicht als allgemeine Vorstellung für Root-Benutzer auf einem beliebigen Host, einschließlich localhost.

Die Fehlermeldung ist ebenfalls irreführend.

Wenn Sie also die Fehlermeldung erhalten, überprüfen Sie Ihre vorhandenen Benutzer mit so etwas

SELECT CONCAT("'", user, "'@'", host, "'") FROM mysql.user;

und erstellen Sie dann einen fehlenden Benutzer (wie von Mike empfohlen) oder passen Sie Ihren GRANT-Befehl an die tatsächlich vorhandene Benutzerspezifikation an.


Dies war eine gültige Lösung für mich! Ich hatte es einfach versäumt, die user @ line genau einzugeben. Überprüfen Sie dies unbedingt, bevor Sie die anderen vorgeschlagenen Lösungen ausprobieren. Für mich war es: CREATE USER 'user'@'%domain.com' und als ich dann die fehlgeschlagene GRANT-Anweisung ausgab, war meine Syntax um eins '.' Es sah so aus: GRANT .... TO 'user'@'%.domain.com'. Ich habe vergessen, das '.' in meiner create-Anweisung und es machte den Unterschied bei der Behebung dieses Problems.
Wallisds

2

Nur meine 2 Cent zu diesem Thema. Ich hatte genau das gleiche Problem beim Versuch, eine Verbindung von MySQL Workbench herzustellen. Ich verwende eine virtuelle Bitnami-MySQL-Maschine, um eine lokale Sandbox für die Entwicklung einzurichten.

In Bitnamis Tutorial soll der Befehl "Alle Berechtigungen gewähren" ausgeführt werden:

/opt/bitnami/mysql/bin/mysql -u root -p -e "grant all privileges on *.* to 'root'@'%' identified by 'PASSWORD' with grant option";

Das hat eindeutig nicht funktioniert, ich habe es endlich mit Mike Lischkes Antwort zum Laufen gebracht.

Was meiner Meinung nach passiert ist, war, dass dem Benutzer root @% die falschen Anmeldeinformationen zugeordnet waren. Wenn Sie also versucht haben, die Berechtigungen des Benutzers zu ändern, und ohne Glück versuchen, versuchen Sie:

  1. Benutzer löschen.
  2. Erstellen Sie den Benutzer erneut.
  3. Stellen Sie sicher, dass Ihre my.cnf-Konfigurationsdatei die richtige Bindung aufweist. In meinem Fall habe ich die Zeile kommentiert, da es sich nur um eine Sandbox-Umgebung handelt.

Von der MySQL-Konsole:

Benutzer auflisten (hilfreich, um alle Benutzer anzuzeigen):

select user, host from mysql.user;

Gewünschten Benutzer löschen:

drop user '{{ username }}'@'%';

Benutzer erstellen und Berechtigungen erteilen:

CREATE USER '{{ username }}'@'%' IDENTIFIED BY '{{ password }}';
GRANT ALL PRIVILEGES ON *.* TO '{{ username }}'@'%' WITH GRANT OPTION;

Führen Sie diesen Befehl aus:

FLUSH PRIVILEGES;

Suchen Sie Ihre MySQL-Konfigurationsdatei 'my.cnf' und suchen Sie nach einer Zeile, die folgendermaßen aussieht:

bind-address=127.0.0.1

und kommentiere es mit einem '#':

#bind-address=127.0.0.1

Starten Sie dann Ihren MySQL-Dienst neu.

Hoffe, das hilft jemandem, der das gleiche Problem hat!


1

Das hat bei mir funktioniert:

mysql> FLUSH PRIVILEGES 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES

1

Überprüfen Sie, ob Ihr Benutzername und Ihre Domain mit den zuvor erstellten übereinstimmen. MySQL wählt Konto anhand der beiden Spalten in der Benutzertabelle aus. Wenn es anders ist, könnte MySQL denken, dass Sie ein neues Konto durch Grant erstellen möchten, das nach Version 8.0 nicht mehr unterstützt wird.


1

Meine Spezifikationen:

mysql --version
mysql  Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)

Was hat bei mir funktioniert:

mysql> USE mysql;
mysql> UPDATE User SET Host='%' WHERE User='root' AND Host='localhost';

Obwohl es in Ihrer spezifischen Situation funktionieren würde. Diese SQL-Syntax aktualisiert einen Benutzer und legt kein Benutzerkonto fest. Es werden auch keine Berechtigungen gewährt.
Nebulastischer

0

Nun, ich hatte gerade das gleiche Problem. Selbst wenn die Route '%' hatte, konnte keine Remoteverbindung hergestellt werden. Schauen Sie sich nun die my.iniDatei (Konfigurationsdatei in Windows) anbind-address Anweisung übersehen.

Also ... ich geputtet diese bind-address = *nach [mysqld]und neu gestartet wird den Dienst. Jetzt gehts!


Dies ist tatsächlich die richtige Antwort.
Joseph,

0

1. Berechtigungen gewähren

mysql> GEWÄHRLEISTUNG FÜR ALLE PRIVILEGIEN. TO 'root' @ '%' WITH GRANT OPTION;

mysql> SPÜLPRIVILEGIEN

2. Überprüfen Sie die Benutzertabelle:

mysql> benutze mysql

MySQL> Host auswählen, Benutzer von Benutzer Geben Sie hier die Bildbeschreibung ein

3. Ändern Sie die Konfigurationsdatei

mysql default bind ip: 127.0.0.1, wenn wir Remote-Besuchsdienste möchten, löschen Sie einfach config

#Modify the configuration file
vi /usr/local/etc/my.cnf

#Comment out the ip-address option
[mysqld]
# Only allow connections from localhost
#bind-address = 127.0.0.1

4. Starten Sie die Dienste endgültig neu

Brauservices starten MySQL neu


Obwohl dies funktionieren würde, würde ich niemals eine MySQL-Instanz in der Produktion neu starten, wenn ich bestimmte Berechtigungen erteile. Versuchen Sie stattdessen Flush-Berechtigungen.
Nebulastischer

-1

Dies kann funktionieren:

grant all on dbtest.* to 'dbuser'@'%' identified by 'mysql_password';

1
Erklären Sie auch, warum es die richtige Lösung ist, anstatt Code wegzuwerfen. Ziel ist es, zu erziehen, damit das OP weiß, was beim nächsten Mal zu tun ist, und nicht nur das unmittelbare Problem zu lösen.
Der Blechmann

-1

Ich hatte das gleiche Problem, das mich hierher führte. Insbesondere für die lokale Entwicklung, wollte ich tun können , mysql -u root -pohne sudo. Ich möchte keinen neuen Benutzer erstellen. Ich möchte rootvon einer lokalen PHP-Web-App verwenden.

Die Fehlermeldung ist irreführend, da an den Standardbenutzerrechten nichts falsch war'root'@'%' .

Stattdessen bestand die Lösung, wie in den anderen Antworten erwähnt, einfach darin, bind-address=0.0.0.0statt bind-address=127.0.0.1in meiner /etc/mysql/mysql.conf.d/mysqld.cnfKonfiguration festzulegen. Ansonsten waren keine Änderungen erforderlich.


Dies beantwortet die Frage nicht einmal vollständig.
Nebulastischer

-2

Ich hatte das gleiche Problem unter CentOS und dies funktionierte für mich (Version: 8.0.11):

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'

FEHLER 1064 (42000): In Ihrer SQL-Syntax ist ein Fehler aufgetreten. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für Near '. TO 'root' @ '%' 'in Zeile 1
GDefender

mysql> GEWÄHRLEISTUNG FÜR ALLE PRIVILEGIEN. Wurzeln'@'%'; FEHLER 1064 (42000): In Ihrer SQL-Syntax ist ein Fehler aufgetreten. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für Near '. TO 'root' @ '%' 'in Zeile 1 mysql>
PGOEL
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.