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.