Wie kann ich die vollen Berechtigungen des MySQL-Root-Benutzers wiederherstellen?

108

Ich habe versehentlich einige der Berechtigungen von meinem MySQL-Root-Benutzer entfernt, einschließlich der Möglichkeit, Tabellen zu ändern. Gibt es eine Möglichkeit, diesen Benutzer in seinen ursprünglichen Zustand (mit allen Berechtigungen) zurückzusetzen?

UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
# MySQL returned an empty result set (i.e. zero rows).
FLUSH PRIVILEGES ;
# MySQL returned an empty result set (i.e. zero rows).


#1045 - Access denied for user 'root'@'localhost' (using password: YES)
GRANT ALL ON *.* TO 'root'@'localhost'
Steven
quelle
1
Der zweite Fehler scheint ein Passwortproblem zu sein. Wahrscheinlich meine Schuld an der Annahme, dass Sie bereits ein 'root' @ 'localhost'-Konto hatten. Führen Sie mysqld erneut mit --skip-grant-tables aus und: "DROP USER 'root' @ 'localhost'; GRANT ALL PRIVILEGES ON . TO 'root' @ '%';" stattdessen? Der beste Weg, um herauszufinden, auf welches Konto Sie Zugriff gewähren sollten, besteht darin, "SELECT User, Host FROM mysql.user WHERE User = 'root';" auszuführen. Damit erhalten Sie den Hostnamen, der nach dem @ verwendet werden soll. Symbol im Befehl GRANT.
DMI
1
Es ist eine schlechte Form für die Mods, das Thema als nicht zum Thema gehörend zu markieren, wenn es nicht zum Thema gehört, außer dass es möglicherweise eine andere Stack Exchange-Site gibt, die für das Thema besser geeignet ist. In diesem Fall sollte es identifiziert werden. (Schade um die Mods.) Hier ist, wohin das führen könnte: dba.stackexchange.com
Jon Davis
^ stimmte zu, ich stimmte für die Wiedereröffnung. Wenn es aufgrund der Existenz des DBA-Standorts geschlossen wurde, hätte dies zumindest erwähnt und das OP dorthin geleitet werden müssen. (Oder möglicherweise als Duplikat einer anderen Frage hier geschlossen)
unteilbar

Antworten:

148

Wenn das GRANT ALLnicht funktioniert, versuchen Sie:

  1. Stoppen Sie mysqldund starten Sie es mit der --skip-grant-tablesOption neu.
  2. Stellen Sie mysqldmit nur: eine Verbindung zum Server her mysql(dh keine -pOption, und der Benutzername ist möglicherweise nicht erforderlich).
  3. Geben Sie die folgenden Befehle im MySQL-Client ein:

    UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

    FLUSH PRIVILEGES;

Danach sollten Sie in der Lage sein, es auszuführen GRANT ALL ON *.* TO 'root'@'localhost';und zum Laufen zu bringen .

DMI
quelle
7
1.Wie man mit nur: mysql eine Verbindung zum mysqld-Server herstellt 2.Wenn ich UPDATE ausgegeben habe mysql.user SET Grant_priv = '1' WHERE User = 'root'; SPÜLPRIVILEGIEN; Ich habe Abfrage in Ordnung, 0 Zeilen betroffen (0,00 Sek.) Übereinstimmende Zeilen: 2 geändert: 0 Warnungen: 0 Abfrage in Ordnung, 0 Zeilen betroffen (0,00 Sek.). Wenn ich mich als Root-Benutzer bei phpMyAdmin angemeldet habe, wird weiterhin "Keine Berechtigungen" angezeigt.
Steven
Entschuldigung, nach den obigen Schritten sollten Sie in der Lage sein, den Befehl GRANT ALL auszuführen. Um eine Verbindung zu mysqld herzustellen, meinte ich, dass Sie kein Passwort benötigen - ich kann mich nicht erinnern, ob ein Benutzername funktioniert oder ob er "root" sein muss.
DMI
2
Das funktioniert nicht. Wie Steven sagte, wirkt sich die Aktualisierung der Benutzertabelle auf 0 Datensätze aus. Der Root-Benutzer kann weiterhin keine Berechtigung erteilen.
Cerin
1
Ja, es funktioniert. Und wenn Sie unter Windows arbeiten, fügen Sie einfach vorübergehend skip-grant-tablesden [mysqld]Abschnitt Ihrer MySQL-Konfigurationsdatei hinzu, um ohne Kennwort auf MySQL in der Befehlszeile zuzugreifen.
Markus
1
Ich blieb mehr als 9 Stunden beim Grant-Teil (der nicht funktionierte) und Ihre Antwort rettete mich ... Sie sind ein Lebensretter. Vielen Dank
Ali SH
91

Wenn Sie Ihren rootBenutzer versehentlich gelöscht haben, können Sie Folgendes tun:

  1. Beenden Sie den MySQL-Dienst
  2. Lauf mysqld_safe --skip-grant-tables &
  3. Geben Sie ein mysql -u root -pund drücken Sie die Eingabetaste.
  4. Geben Sie Ihr Passwort ein
  5. Geben Sie in der MySQL-Befehlszeile Folgendes ein: use mysql;

Führen Sie dann diese Abfrage aus:

insert into `user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

Starten Sie dann die mysqld neu

EDIT: 6. Oktober 2018

Falls jemand diese Antwort benötigt, habe ich sie heute mit innodb_version 5.6.36-82.0 und 10.1.24-MariaDB ausprobiert und sie funktioniert, wenn Sie die BACKTICKS ENTFERNEN (auch keine einfachen Anführungszeichen, entfernen Sie sie einfach):

insert into user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');
Bipin Bahuguna
quelle
1
@Bipin, komisch gibt es nur mysqld.exeim binOrdner, nicht mysqld_safe.exe. Was meinst du mit "mysqld_safe"?
Pacerier
4
Für MySQL 5.5 benötigen Sie zwei weitere Privilegien, Event_priv und Trigger_priv.
Greg Bell
Ich stelle mir vor, dass dies in 5.6.5
Otheus
1
@ Pacerier - laut diesem Beitrag brauchen Sie nicht wirklich mysqld_safe, führen Sie einfach die normale mysqld-Binärdatei aus:mysqld.exe --skip-grant-tables
bkwdesign
2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jamie Hutber
24

Ich entferne auch die Berechtigungen von Root und Datenbank, die nicht in der MySQL-Konsole angezeigt werden, als ich ein Root-Benutzer war. Daher habe ich den Benutzer um mysql>mysql -u 'userName' -p;und das Kennwort geändert .

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

FLUSH PRIVILEGES;

Nach diesem Befehl werden alle Datenbanken im Stammverzeichnis angezeigt.

Vielen Dank

Prabhu
quelle
1
Ich musste eine Kombination von Dingen machen. Ich musste den mysqld-Dienst stoppen, dann mysqld_safe --skip-crant-tables & ausführen, dann den obigen UPDATE-Befehl ausführen, dann mysql neu starten und dann GRANT ALL ON ausführen . TO 'user' @ 'localhost';
Nick Woodhams
5

Ich hatte die Berechtigungen zum Einfügen und erneuten Laden in root verweigert. Nach dem Aktualisieren der Berechtigungen funktionierte FLUSH PRIVILEGES nicht (aufgrund fehlender Berechtigungen zum erneuten Laden). Also habe ich den Benutzer debian-sys-wart unter Ubuntu 16.04 verwendet, um die Berechtigungen für user.root wiederherzustellen. Das Passwort von user.debian-sys-wart finden Sie in dieser Datei

sudo cat /etc/mysql/debian.cnf
Varun Kumar
quelle
Du rettest mich! GRANT funktionierte auch nicht im Modus --skip-grant-tables. Wenn ich also als Ubuntu-System eintrete, kann ich meinen Root-Benutzer erneut erstellen und dann alle Berechtigungen aktualisieren
lunix15
4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

Melden Sie sich einfach von root mit dem entsprechenden Kennwort an und führen Sie den obigen Befehl einfach für den Benutzer aus.

Beispielsweise:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;
unbekannt
quelle
3
Wenn der Root-Benutzer jedoch Berechtigungen verloren hat, wie kann dies funktionieren? Benötigt der Root-Benutzer dafür keine erhöhten Berechtigungen? Das hat bei mir nicht funktioniert.
Terungwa
3

Fügen Sie einfach in jede Spaltenberechtigung einen mysql.userWert ein oder aktualisieren Sie ihn Y.

Benutzer1316095
quelle
2

Wenn Sie WAMP auf Ihrem lokalen Computer verwenden (MySQL-Version 5.7.14) Schritt 1: Öffnen Sie die Datei my.ini. Schritt 2: Entfernen Sie den Kommentar zu dieser Zeile 'Skip-Grant-Tabellen', indem Sie das Semikolon entfernen Server Schritt 4: Starten Sie die mySQL-Konsole. Schritt 5:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;

Schritt 6: Problem gelöst !!!!

Terungwa
quelle