Jak mogę przywrócić pełne uprawnienia użytkownika root MySQL?


108

Przypadkowo usunąłem niektóre uprawnienia mojego użytkownika root MySQL, w tym możliwość zmiany tabel. Czy istnieje sposób, aby przywrócić tego użytkownika do jego pierwotnego stanu (ze wszystkimi uprawnieniami)?

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'

1
Drugi błąd wygląda na problem z hasłem. Prawdopodobnie moja wina, że ​​założyłem, że masz już konto „root” @ „localhost”. Uruchom ponownie mysqld z --skip-grant-table i: "DROP USER 'root' @ 'localhost'; PRZYZNAJ WSZYSTKIE PRZYWILEJE . TO 'root' @ '%';" zamiast? Najlepszym sposobem, aby dowiedzieć się, do którego konta należy przyznać dostęp, jest uruchomienie polecenia „SELECT User, Host FROM mysql.user WHERE User = 'root';” ... który poda nazwę hosta, której należy użyć po znaku @ symbol w poleceniu GRANT.
— DMI

1
To zła forma dla modów, aby oznaczyć temat jako niezwiązany z tematem, gdy nie jest on niezwiązany z tematem, z wyjątkiem tego, że może istnieć inna witryna Stack Exchange bardziej dopasowana do tego tematu, w którym to przypadku należy ją zidentyfikować. (Szkoda modów.) Oto, dokąd to może się udać: dba.stackexchange.com
— Jon Davis

^ zgodził się, zagłosowałem za ponownym otwarciem. jeśli został zamknięty z powodu istnienia bazy DBA, należało przynajmniej o tym wspomnieć i skierować tam PO. (Lub potencjalnie zamknięty jako duplikat innego pytania tutaj)
— niepodzielny

Odpowiedzi:


148

Jeśli GRANT ALLto nie zadziała, spróbuj:

  1. Zatrzymaj mysqldi uruchom ponownie za pomocą --skip-grant-tablesopcji.
  2. Połącz się z mysqldserwerem za pomocą tylko: mysql(tj. Bez -popcji i nazwa użytkownika może nie być wymagana).
  3. Wydaj następujące polecenia w kliencie mysql:

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

    FLUSH PRIVILEGES;

Po tym powinieneś być w stanie uruchomić GRANT ALL ON *.* TO 'root'@'localhost';i sprawić, że będzie działać.


7
1.Jak połączyć się z serwerem mysqld za pomocą: mysql 2.Gdy wydałem UPDATE mysql.user SET Grant_priv = '1' WHERE User = 'root'; PRZYWILEJE PŁUKANIA; Otrzymałem zapytanie OK, 0 wierszy dotkniętych (0,00 s) dopasowanych wierszy: 2 zmienione: 0 ostrzeżeń: 0 Zapytanie ok, dotyczy 0 wierszy (0,00 s). Kiedy logowałem się do phpMyAdmin jako użytkownik root, nadal widzę „Brak uprawnień”.
— Steven

Przepraszamy, po wykonaniu powyższych czynności powinno być możliwe uruchomienie polecenia GRANT ALL. Chciałem połączyć się z mysqld, miałem na myśli, że nie będziesz potrzebować hasła - nie pamiętam, czy jakakolwiek nazwa użytkownika będzie działać, czy też będzie musiała to być „root”.
— DMI

2
To nie działa. Jak powiedział Steven, aktualizacja tabeli użytkowników wpływa na 0 rekordów. Użytkownik root nadal nie może udzielić.
— Cerin

1
Tak, to działa. A jeśli korzystasz z systemu Windows, po prostu tymczasowo dodaj skip-grant-tablesdo [mysqld]sekcji pliku konfiguracyjnego mysql, aby uzyskać dostęp do mysql z wiersza poleceń bez hasła.
— markus

1
Utknąłem w części Grant (która nie zadziałała) przez ponad 9 godzin, a twoja odpowiedź mnie uratowała ... jesteś ratownikiem. wielkie dzięki
— Ali SH

91

Jeśli rootprzez pomyłkę usunąłeś swojego użytkownika, możesz zrobić jedną rzecz:

  1. Zatrzymaj usługę MySQL
  2. Biegać mysqld_safe --skip-grant-tables &
  3. Wpisz mysql -u root -pi naciśnij Enter.
  4. Wprowadź hasło
  5. W linii poleceń mysql wpisz: use mysql;

Następnie wykonaj to zapytanie:

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');

następnie uruchom ponownie mysqld

EDYCJA: 6 października 2018 r

Na wypadek, gdyby ktoś inny potrzebował tej odpowiedzi, wypróbowałem ją dzisiaj, używając innodb_version 5.6.36-82.0 i 10.1.24-MariaDB i działa, jeśli USUNĄCIE TŁO (bez cudzysłowów, po prostu je usuń):

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');

1
@Bipin, dziwne jest tylko mysqld.exew binfolderze, nie mysqld_safe.exe. Co rozumiesz przez „mysqld_safe”?
— Pacerier

4
Do MySQL 5.5 potrzebujesz dwóch dodatkowych uprawnień, Event_priv i Trigger_priv.
— Greg Bell

Wyobrażam sobie, że to się
— kończy

1
@Pacerier - zgodnie z tym postem nie potrzebujesz mysqld_safe, po prostu uruchom normalny plik binarny mysqld:mysqld.exe --skip-grant-tables
— bkwdesign

2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
— Jamie Hutber

24

usuwam również uprawnienia roota i bazy danych, które nie są wyświetlane w konsoli mysql, gdy byłem użytkownikiem root, więc zmieniłem użytkownika mysql>mysql -u 'userName' -p;i hasło;

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

FLUSH PRIVILEGES;

po tym poleceniu wszystko pokazuje bazę danych w katalogu głównym.

Dzięki


1
Musiałem zrobić kombinację rzeczy. Musiałem zatrzymać usługę mysqld, następnie uruchomić mysqld_safe --skip-crant-table &, następnie powyższe polecenie UPDATE, a następnie ponownie uruchomić mysql, a następnie uruchomić GRANT ALL ON . TO 'użytkownik' @ 'localhost';
— Nick Woodhams,

5

Odmówiłem uprawnień roota do wstawiania i ponownego ładowania. Więc po zaktualizowaniu uprawnień FLUSH PRIVILEGES nie działało (z powodu braku uprawnień do przeładowania). Użyłem więc debian-sys-maint user na Ubuntu 16.04, aby przywrócić uprawnienia user.root. Możesz znaleźć hasło do user.debian-sys-maint w tym pliku

sudo cat /etc/mysql/debian.cnf

Ratujesz mnie! GRANT nie działał również w trybie --skip-grant-table, więc wejście jako system ubuntu pozwoliło mi ponownie utworzyć użytkownika root, a następnie zaktualizować wszystkie uprawnienia
— lunix15

4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

Po prostu zaloguj się z konta roota, używając odpowiedniego hasła, jeśli istnieje, i po prostu uruchom powyższe polecenie dla dowolnego użytkownika.

Na przykład:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;

3
ale jeśli użytkownik „root” utracił uprawnienia, to jak może to działać, czy użytkownik root nie potrzebuje do tego wyższych uprawnień? to nie zadziałało dla mnie.
— Terungwa


2

Jeśli używasz WAMP na swoim komputerze lokalnym (mysql wersja 5.7.14) Krok 1: otwórz plik my.ini Krok 2: usuń komentarz z tego wiersza „skip-grant-table”, usuwając średnik. Krok 3: zrestartuj mysql serwer krok 4: uruchom konsolę mySQL krok 5:

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

Krok 6: Problem rozwiązany !!!!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.