Błąd MySQL: „Odmowa dostępu dla użytkownika„ root ”@„ localhost ”

263

$ ./mysqladmin -u root -p ' redacted '
Wprowadź hasło:

mysqladmin: połączenie z serwerem na „localhost” nie powiodło się błąd:
„Odmowa dostępu dla użytkownika„ root ”@„ localhost ”(przy użyciu hasła: TAK)”

Jak mogę to naprawić?

Surowe Trivedi
źródło
1
@clearlight Nie jest to samo pytanie, ten post jest problemem z mysqladmin wygrać super uprawnienia do mysql, drugi post to problem z prostym połączeniem z gniazdem.
e-info128
Spróbuj usunąć, jeśli istnieje ~/.my.cnfplik.
e-info128
11
Wiem, że to stare, ale chcę to powiedzieć przyszłym użytkownikom. Nie wpisuj swojego hasła mysql, szczególnie dla roota, w samym poleceniu, w przeciwnym razie zostanie ono zapisane w historii powłoki. Po prostu zostaw tę -popcję samą, a mysql poprosi o podanie hasła.
Scotty C.

Odpowiedzi:

356
  1. Otwórz i edytuj /etc/my.cnflub /etc/mysql/my.cnf, w zależności od dystrybucji.
  2. Dodaj skip-grant-tablesponiżej[mysqld]
  3. Uruchom ponownie MySQL
  4. Powinieneś być teraz w stanie zalogować się do mysql za pomocą poniższej komendy mysql -u root -p
  5. Biegać mysql> flush privileges;
  6. Ustaw nowe hasło przez ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
  7. Wróć do /etc/my.cnf i usuń / skomentuj pominąć-tabele-granty
  8. Uruchom ponownie MySQL
  9. Teraz będziesz mógł zalogować się przy użyciu nowego hasła mysql -u root -p
Kishore Venkataramanan
źródło
6
Witam, miałem ten sam problem. Zrobiłem powyższe i to rozwiązuje problem, ale za każdym razem, gdy ponownie uruchamiam CentOS, muszę wykonać wszystkie kroki ponownie (dostaję komunikat: Odmowa dostępu dla użytkownika „root” @ „localhost” (przy użyciu hasła: NIE) - kiedy uruchamiam polecenie mysql (lub dowolne polecenie sql) i robię to raz po raz, jak wyżej przy każdym ponownym uruchomieniu
Eitan
19
Szkoda, że ​​to nie działa z MariaDB:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USER 'root'@'localhost' IDENTIFIED BY 'NewPassword'' at line 1
Philipp Ludwig
11
Znalazłem, że działa @ PhilippLudwig set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');Zrobiłem to po kroku 5. Oto, jak wyglądało moje wyjście z wiersza polecenia:MariaDB [(none)]> MariaDB [(none)]> set PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); Query OK, 0 rows affected (0.00 sec)
therobyouknow
3
W kroku 3 uruchom ponownie MariaDB: Znalazłem następujące prace:sudo systemctl restart mariadb
therobyouknow 27.04.18
7
Niektórzy mogą znaleźć ten plik w /etc/mysql/my.cnf
DSinghvi
589

Wszystkie znalezione przeze mnie rozwiązania były znacznie bardziej złożone niż to konieczne i żadne z nich nie działało dla mnie. Oto rozwiązanie, które rozwiązało mój problem. Nie trzeba restartować mysqld ani uruchamiać go ze specjalnymi uprawnieniami.

sudo mysql

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

Za pomocą jednego zapytania zmieniamy auth_plugin na mysql_native_password i ustawiamy hasło roota na root (możesz je zmienić w zapytaniu)

Teraz powinieneś być w stanie zalogować się przy użyciu roota. Więcej informacji można znaleźć w dokumentacji mysql

(zamknij konsolę mysql za pomocą Ctrl + D lub wpisując polecenie exit )

użytkownik1878906
źródło
41
Nie jestem w stanie tego zrobić ... „Wystąpił błąd w składni SQL; sprawdź w instrukcji, która odpowiada wersji serwera MariaDB, czy używasz właściwej składni w pobliżu ...”.
TCB13,
2
Ta odpowiedź zadziałała, przypadkowo dodałem, że nie jest przydatna odpowiedź głosuj, przepraszam!
taher
25
Bardzo dobrze działał na Ubuntu 18.04
Almino Melo
2
@ TCB13 i wszyscy inni, którzy napotykają ten problem. „Nie mogę tego zrobić ...” Wystąpił błąd w składni SQL; przed wykonaniem polecenia alter sprawdzić podręcznika, który odpowiada twojej wersji serwera MariaDB dla prawego składnię używaną w pobliżu ...”użyć przywilejów kolor.
koder
3
ratujesz
50

Próbowałem wielu kroków, aby rozwiązać ten problem. Istnieje tak wiele źródeł możliwych rozwiązań tego problemu, że trudno jest oddzielić sens od bzdur. W końcu znalazłem dobre rozwiązanie tutaj :

Krok 1: Zidentyfikuj wersję bazy danych

$ mysql --version

Zobaczysz takie dane wyjściowe w MySQL:

$ mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

Lub dane wyjściowe takie jak dla MariaDB:

mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

Zanotuj, która baza danych i którą wersję uruchomisz, ponieważ będziesz ich później używać. Następnie musisz zatrzymać bazę danych, aby uzyskać dostęp do niej ręcznie.

Krok 2: Zatrzymanie serwera bazy danych

Aby zmienić hasło roota, musisz wcześniej zamknąć serwer bazy danych.

Możesz to zrobić dla MySQL za pomocą:

$ sudo systemctl stop mysql

A dla MariaDB z:

$ sudo systemctl stop mariadb

Krok 3: Ponowne uruchomienie serwera bazy danych bez sprawdzania uprawnień

Jeśli uruchomisz MySQL i MariaDB bez ładowania informacji o uprawnieniach użytkownika, pozwoli ci to uzyskać dostęp do wiersza poleceń bazy danych z uprawnieniami roota bez podawania hasła. Pozwoli ci to uzyskać dostęp do bazy danych, nie wiedząc o tym.

Aby to zrobić, musisz zatrzymać ładowanie przez bazę danych tabel grantu, które przechowują informacje o uprawnieniach użytkownika. Ponieważ jest to trochę ryzykowne z punktu widzenia bezpieczeństwa, należy również pominąć sieć, aby uniemożliwić innym klientom nawiązywanie połączeń.

Uruchom bazę danych bez ładowania tabel grantu lub włączania sieci:

$ sudo mysqld_safe --skip-grant-tables --skip-networking &

Znak ampersand na końcu tego polecenia spowoduje, że proces ten będzie działał w tle, dzięki czemu będziesz mógł nadal korzystać z terminala.

Teraz możesz połączyć się z bazą danych jako użytkownik root, który nie powinien prosić o hasło.

$ mysql -u root

Zamiast tego natychmiast zobaczysz monit powłoki bazy danych.

Monit MySQL

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Podpowiedź MariaDB

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Teraz, gdy masz dostęp do konta root, możesz zmienić hasło roota.

Krok 4: Zmiana hasła roota

mysql> FLUSH PRIVILEGES;

Teraz możemy zmienić hasło roota.

W przypadku MySQL 5.7.6 i nowszych, a także MariaDB 10.1.20 i nowszych , użyj następującego polecenia:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

W przypadku MySQL 5.7.5 i starszych, a także MariaDB 10.1.20 i starszych , użyj:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

Pamiętaj, aby zastąpić new_passwordje nowym, wybranym hasłem.

Uwaga: jeśli ALTER USERpolecenie nie działa, zwykle oznacza większy problem. Możesz jednak spróbować UPDATE ... SETzresetować hasło roota.

[WAŻNE] To konkretny wiersz, który naprawił mój konkretny problem:

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';

Pamiętaj, aby po tym ponownie załadować tabele grantów.

W obu przypadkach powinieneś zobaczyć potwierdzenie, że polecenie zostało wykonane pomyślnie.

Query OK, 0 rows affected (0.00 sec)

Hasło zostało zmienione, dzięki czemu można teraz zatrzymać ręczną instancję serwera bazy danych i zrestartować ją tak, jak wcześniej.

Krok 5: Uruchom ponownie serwer bazy danych normalnie

Samouczek zawiera kilka dalszych kroków w celu zrestartowania bazy danych, ale użyłem tylko tego:

W przypadku MySQL użyj: $ sudo systemctl start mysql

W przypadku MariaDB użyj:

$ sudo systemctl start mariadb

Teraz możesz potwierdzić, że nowe hasło zostało poprawnie zastosowane, uruchamiając:

$ mysql -u root -p

Polecenie powinno teraz wyświetlać monit o podanie nowego hasła. Wpisz go, a powinieneś uzyskać dostęp do monitu bazy danych zgodnie z oczekiwaniami.

Wniosek

Masz teraz dostęp administracyjny do przywróconego serwera MySQL lub MariaDB. Upewnij się, że nowe hasło roota jest silne i bezpieczne i przechowuj je w bezpiecznym miejscu.

Blairg23
źródło
1
Instrukcja ALTER USER została wprowadzona w MariaDB 10.2.0.
Benoit Desrosiers
2
Łał ! właśnie ta linia mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';uratowała mi życie!
lucyjosef
35

Żadna z powyższych odpowiedzi nie pomogła mi z tym problemem, więc oto rozwiązanie, które znalazłem .

Odpowiednia część:

W systemach Ubuntu z MySQL 5.7 (i nowszymi wersjami) główny użytkownik MySQL jest uwierzytelniany przy użyciu wtyczki auth_socket domyślnie zamiast hasła. Pozwala to na pewne większe bezpieczeństwo i użyteczność w wielu przypadkach, ale może również komplikować sytuację, gdy musisz zezwolić programowi zewnętrznemu (np. PhpMyAdmin) na dostęp do użytkownika.

Aby użyć hasła do połączenia z MySQL jako root, musisz zmienić metodę uwierzytelniania z auth_socket na mysql_native_password. Aby to zrobić, otwórz okno MySQL w swoim terminalu:

sudo mysql

Następnie sprawdź, której metody uwierzytelniania używasz na każdym koncie MySQL za pomocą następującego polecenia:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Wynik

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

W tym przykładzie widać, że użytkownik root faktycznie uwierzytelnia się za pomocą wtyczki auth_socket. Aby skonfigurować konto root do uwierzytelniania za pomocą hasła, uruchom następujące polecenie ALTER USER. Zmień hasło na wybrane przez siebie silne hasło i pamiętaj, że to polecenie zmieni hasło root ustawione w kroku 2:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Następnie uruchom FLUSH PRIVILEGES, który nakazuje serwerowi ponowne załadowanie tabel grantu i wprowadzenie nowych zmian w życie:

FLUSH PRIVILEGES;

Sprawdź ponownie metody uwierzytelniania stosowane przez każdego z użytkowników, aby potwierdzić, że root nie uwierzytelnia się już przy użyciu wtyczki auth_socket:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Wynik

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

W tym przykładzie widać, że główny użytkownik MySQL uwierzytelnia się teraz przy użyciu hasła. Po potwierdzeniu tego na własnym serwerze możesz wyjść z powłoki MySQL:

exit

sonrad10
źródło
27

Dla użytkowników Ubuntu / Debian

( może działać na innych dystrybucjach, szczególnie tych opartych na Debianie)

Uruchom następujące polecenie, aby połączyć się jako root(bez hasła)

sudo /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf

Jeśli nie chcesz dodawać za --defaults-filekażdym razem, gdy chcesz się połączyć jako root, możesz skopiować /etc/mysql/debian.cnfdo katalogu domowego:

sudo cp /etc/mysql/debian.cnf ~/.my.cnf

i wtedy:

sudo mysql
Fab
źródło
2
To wystarczyło. Najwyraźniej „root” nie jest domyślnie „root” w Ubuntu.
Chaim Eliyah
21

Po wypróbowaniu wszystkich innych odpowiedzi, to w końcu dla mnie zadziałało

sudo mysql -- It does not ask me for any password

-- Then in MariaDB/MySQL console:
update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;
exit;

Znalazłem odpowiedź w tym poście: https://medium.com/@chiragpatel_52497/solved-error-access-denied-for-user-root-localhost-of-mysql-programming-school-6e3611838d06

Pico12
źródło
1
TA LINIA WTYCZKOWA JEST NAPRAWDĘ POMOCNA. Próbowałem wiele komplikacji, ale jest to jedyna sprawdzona wersja 14.14 Distrib 5.7.27, dla Linuksa (x86_64)
AlexNikonov
2
Pomogło mi to również z mysql 5.7. Tak więc zastosowanie nie tylko dla MariaDB
podarok
Właśnie użyłem tego na MySQL 8 Ubuntu 20.04 i działało. Inne odpowiedzi przy użyciu skip-grant-table(my.conf lub w mysqlpoleceniu) nie działały. Mogłem uzyskać dostęp do konta usługi ( askubuntu.com/a/120769/169836 ), ale UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';nie działałem . Tylko wtedy, gdy korzystasz z wtyczki działało. Dzięki ~
hamx0r
16

Dla nowych użytkowników Linuksa może to być trudne zadanie. Pozwól, że zaktualizuję to za pomocą mysql 8 (najnowsza dostępna wersja to 8.0.12 na 12 września 2018)

  1. Otwórz plik konfiguracyjny „mysqld.cnf” na stronie „/etc/mysql/mysql.conf.d/”.
  2. Dodaj tabele pomijania-dotacji do następnego wiersza tekstu [mysql] i zapisz.
  3. Zrestartuj usługę mysql jako „usługa sudo mysql restart”. Teraz twój mysql jest wolny od jakiegokolwiek uwierzytelnienia.
  4. Połącz się z klientem mysql (znanym również jako mysql-shell) jako mysql -u root -p . Na razie nie ma hasła do wprowadzenia.
  5. uruchom uprawnienia do opróżniania komendy sql ;
  6. Zresetuj hasło teraz jako ALTER USER „root” @ „localhost” IDENTYFIKOWANY PRZEZ „MyNewPassword”;
  7. Teraz wróćmy do normalnego stanu; usuń ten wiersz „skip-grant-tables” z „mysqld.cnf” i uruchom ponownie usługę.

Otóż ​​to.

Amit Kr
źródło
5

W swoim środowisku roboczym MySQL możesz przejść do lewego paska bocznego, w obszarze Zarządzanie wybierz „Użytkownicy i uprawnienia”, kliknij root w Kontach użytkowników, w prawej sekcji kliknij kartę „Limity konta”, aby zwiększyć maksymalną liczbę zapytań, aktualizacji itp., I następnie kliknij kartę „Role administracyjne” i zaznacz pola, aby dać dostęp do konta. Mam nadzieję, że to pomaga!

Colleen Purcell
źródło
4

Zrobiłem to, aby ustawić hasło roota w początkowej konfiguracji MySQL w OSx. Otwórz terminal.

sudo sh -c 'echo /usr/local/mysql/bin > /etc/paths.d/mysql'

Zamknij terminal i otwórz nowy terminal. W systemie Linux działają następujące ustawienia, aby ustawić hasło roota.

sudo /usr/local/mysql/support-files/mysql.server stop
sudo mysqld_safe --skip-grant-tables

(sudo mysqld_safe --skip-grant-tables: To nie działało dla mnie po raz pierwszy. Ale druga próba, zakończyło się sukcesem.)

Następnie zaloguj się do MySQL

mysql -u root

FLUSH PRIVILEGES;

Teraz zmień hasło:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

Uruchom ponownie MySQL:

sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server start
Sadee
źródło
3

W moim przypadku w Debianie 10 błąd

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

został rozwiązany przez (GOOD WAY)

sudo mysql -u root -p mysql

ZŁA DROGA:

mysql -u root -p mysql
klor
źródło
3

Ugh- nic dla mnie nie działało! Mam maszynę CentOS 7.4 z systemem mariadb 5.5.64.

Musiałem to zrobić zaraz po instalacji mariadbu od yum;

# systemctl restart mariadb
# mysql_secure_installation

mysql_secure_installationPrzeprowadzi cię przez szereg etapów, w tym „Ustaw hasło roota? [Y / n]”. Po prostu powiedz „y” i podaj hasło. Odpowiedz na inne pytania, jak chcesz.

Następnie możesz uzyskać hasło, używając

# mysql -u root -p

Przetrwa

# systemctl restart mariadb

Klucz

Następnie sprawdziłem /bin/mysql_secure_installationkod źródłowy, aby dowiedzieć się, jak magicznie można było zmienić hasło roota i żadna z pozostałych odpowiedzi tutaj nie mogła. Bit importu to:

do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';"

... Mówi SET Password=...i nie SET authentication_string = PASSWORD.... Tak więc właściwa procedura dla tej wersji (5.5.64) to:

login using mysql -u root -p , using the password you already set.
Or, stop the database and start it with:
mysql_safe --skip-grant-tables --skip-networking &

W wierszu polecenia mysql>:

use mysql;
select host,user,password from user where user = 'root';
(observe your existing passwords for root).
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root' AND host = 'localhost';
select host,user,password from user where user = 'root';
flush privileges;
quit;

zabij działającego mysqld_safe. uruchom ponownie mariadb. Zaloguj się jako root: mysql -u -p. Użyj swojego nowego hasła.

Jeśli chcesz, możesz ustawić wszystkie hasła roota jednocześnie. Myślę, że to jest mądre:

mysql -u root -p
(login)
use mysql;
select host,user,password from user where user = 'root';
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root';
select host,user,password from user where user = 'root';
flush privileges;
quit;

Spowoduje to wykonanie aktualizacji wszystkich haseł root: tj. Dla „localhost”, „127.0.0.1” i „:: 1”

W przyszłości, kiedy przejdę do RHEL8 lub co tam masz, postaram się pamiętać, aby sprawdzić / bin / mysql_secure_installation i zobaczyć, jak to zrobili chłopaki, którzy skonfigurowali mariadb dla tego systemu operacyjnego.

Mike S.
źródło
2

Jeśli jesteś podobny do mnie i wszystkie powyższe sugestie nie powiodły się, przejdź do odinstalowania wszystkich wersji mysql na komputerze, wyszukaj wszystkie pozostałe pliki mysql za pomocą tego polecenia sudo find / -name "mysql"i rm -rfkażdego pliku lub katalogu z dołączoną do niego nazwą mysql (należy pominąć powiązane pliki do bibliotek języków programowania). Teraz zainstaluj nową wersję MySQL i ciesz się. Uwaga: utracisz wszystkie dane, więc najpierw zważ swoje opcje.

Michael Ogala
źródło
1

Może się to zdarzyć, jeśli nie masz wystarczających uprawnień. Wpisz suhasło roota i spróbuj ponownie.

witaj goji
źródło
1

Okej, wiem, że to stary wątek, ale jeśli trafiłeś na tę stronę przez Google tak jak ja i żadne z powyższych rozwiązań nie zadziałało, to błąd okazał się 100% głupotą po mojej stronie. Nie podłączyłem się do serwera. Po połączeniu wszystko płynęło płynnie.

W przypadku, gdy pomaga to poznać moją konfigurację, używam Sequel Pro i próbuję połączyć się z nim za pomocą Node przy użyciu pakietu NPM, mysql. Nie sądziłem, że muszę się połączyć (poza uruchomieniem Sequel Pro), ponieważ robiłem to już z mojej aplikacji.

wprowadź opis zdjęcia tutaj

Mix Master Mike
źródło
0

Rozwiązanie: poddaj się!

Wysłuchaj mnie, spędziłem około dwóch dni próbując sprawić, że MySQL nie przyniosło rezultatu, zawsze utknąłem w błędach uprawnień, z których żaden nie został naprawiony przez odpowiedzi w tym wątku. Doszło do tego, że pomyślałem, że jeśli będę kontynuować, oszaleję.

Z powodu cierpliwości, aby działało, wysłałem polecenie instalacji SQLite, używając tylko 450 KB i działało idealnie od samego początku.

Jeśli nie masz cierpliwości świętego, skorzystaj z SQLite i zaoszczędź dużo czasu, wysiłku, bólu i miejsca do przechowywania ..!

ArraysStartAt1
źródło