BŁĄD 1698 (28000): Odmowa dostępu dla użytkownika „root” @ „localhost”

382

Konfiguruję nowy serwer i ciągle napotykam ten problem.

Gdy próbuję zalogować się do bazy danych MySQL z użytkownikiem root, pojawia się błąd:

BŁĄD 1698 (28000): Odmowa dostępu dla użytkownika „root” @ „localhost”

Nie ma znaczenia, czy połączę się przez terminal (SSH), przez PHPMyAdmin lub klienta MySQL, np. Navicat. Wszystkie zawodzą.

Zajrzałem do tabeli mysql.user i otrzymałem następujące informacje:

+------------------+-------------------+
| user             | host              |
+------------------+-------------------+
| root             | %                 |
| root             | 127.0.0.1         |
| amavisd          | localhost         |
| debian-sys-maint | localhost         |
| iredadmin        | localhost         |
| iredapd          | localhost         |
| mysql.sys        | localhost         |
| phpmyadmin       | localhost         |
| root             | localhost         |
| roundcube        | localhost         |
| vmail            | localhost         |
| vmailadmin       | localhost         |
| amavisd          | test4.folkmann.it |
| iredadmin        | test4.folkmann.it |
| iredapd          | test4.folkmann.it |
| roundcube        | test4.folkmann.it |
| vmail            | test4.folkmann.it |
| vmailadmin       | test4.folkmann.it |
+------------------+-------------------+

Jak widać, root powinien mieć dostęp.

Serwer jest dość prosty, ponieważ od jakiegoś czasu próbowałem rozwiązać ten problem.

Działa z Ubuntu 16.04.1 LTS z Apache, MySQL i PHP, dzięki czemu może obsługiwać strony internetowe, a iRedMail 0.9.5-1, aby mógł obsługiwać pocztę.

Zaloguj się do bazy danych MySQL działa dobrze, zanim zainstaluję iRedMail. Próbowałem również, po prostu instaluję iRedMail, ale potem root, również nie działa ...

Gdyby ktoś mógł mi powiedzieć, jak rozwiązać problem z logowaniem do MySQL lub jak zainstalować iRedMail, oprócz istniejącej instalacji MySQL. I tak, wypróbowałem Porady dotyczące instalacji i nie mogę znaleźć tych zmiennych w plikach konfiguracyjnych.

Folkmann
źródło
Po skorzystaniu z tego linku pierwsza opcja zadziałała dla mnie: askubuntu.com/questions/763336/...
Mikael Arhelger
3
sudo mysql_secure_installationjest najprostszym sposobem, aby to naprawić
Sergey Ponomarev

Odpowiedzi:

1119

Niektóre systemy, takie jak Ubuntu, mysql domyślnie korzystają z wtyczki UNIX auth_socket .

Zasadniczo oznacza, że: korzystający z niej db_users będą „uwierzytelniani” przez poświadczenia użytkownika systemu. Aby sprawdzić, czy rootużytkownik jest skonfigurowany w ten sposób, wykonaj następujące czynności:

$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user;

+------------------+-----------------------+
| User             | plugin                |
+------------------+-----------------------+
| root             | auth_socket           |
| mysql.sys        | mysql_native_password |
| debian-sys-maint | mysql_native_password |
+------------------+-----------------------+

Jak widać w zapytaniu, rootużytkownik korzysta z auth_socketwtyczki

Istnieją 2 sposoby rozwiązania tego problemu:

  1. Możesz ustawić użytkownika root, aby używał mysql_native_passwordwtyczki
  2. Możesz stworzyć nowy db_userprzy sobie system_user(zalecane)

Opcja 1:

$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ service mysql restart

Opcja 2: (zamień YOUR_SYSTEM_USER na swoją nazwę użytkownika)

$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY '';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'YOUR_SYSTEM_USER'@'localhost';
mysql> UPDATE user SET plugin='auth_socket' WHERE User='YOUR_SYSTEM_USER';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ service mysql restart

Pamiętaj, że jeśli użyjesz opcji # 2, będziesz musiał połączyć się z mysql jako nazwą użytkownika systemu ( mysql -u YOUR_SYSTEM_USER)

Uwaga: W niektórych systemach (np. Debian stretch) wtyczka „auth_socket” nazywa się „unix_socket” , więc odpowiednie polecenie SQL powinno brzmieć:UPDATE user SET plugin='unix_socket' WHERE User='YOUR_SYSTEM_USER';

Aktualizacja: z komentarza @ andy wydaje się, że mysql 8.xx zaktualizował / zastąpił auth_socketdla caching_sha2_passwordNie mam konfiguracji systemu z mysql 8.xx, aby to przetestować, jednak powyższe kroki powinny pomóc w zrozumieniu problemu. Oto odpowiedź:

Jedną ze zmian od MySQL 8.0.4 jest to, że nową domyślną wtyczką uwierzytelniającą jest „caching_sha2_password”. Nowy „YOUR_SYSTEM_USER” będzie miał tę wtyczkę uwierzytelniania, a teraz możesz zalogować się z powłoki bash za pomocą „mysql -u YOUR_SYSTEM_USER -p” i podać hasło dla tego użytkownika w wierszu polecenia. Nie ma potrzeby wykonywania kroku „UPDATE user SET plugin”. Aby uzyskać aktualizację domyślnej wtyczki uwierzytelniania 8.0.4, patrz: https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/

zetacu
źródło
5
Opcja 1 działała dla mnie. Ale potem musiałem też biec sudo gedit /etc/phpmyadmin/config.inc.php. Potem szukałem AllowNoPasswordi odkomentowałem obie linie, które ją zawierały. Wtedy mogłem zalogować się jako root bez hasła.
Joe
7
Opcja 2 działa. Myślę, że zawsze najlepszą praktyką jest tworzenie nowego użytkownika i używanie pozostawienia roota, aby tam być!
PasinduJay
2
IDENTIFIED BY ''nieco prawdopodobnie powinno byćIDENTIFIED BY 'YOUR_PASSWD'
YakovL
4
Wreszcie odpowiedź, która faktycznie działa !! Istnieje ponad milion odpowiedzi mówiących „zrób mysqld_safe --skip-grant-tablesto” i to nie działa.
Stewart
4
Ok, jak to zrobić, jeśli sudo mysql -u root -pmnie nie wpuścisz?
Hrvoje T
173

Sprawdź tutaj:

NOWA wersja MYSQL robi to w ten sposób.

W nowym my-sql, jeśli hasło zostanie pozostawione puste podczas instalacji, jest ono oparte na auth_socketwtyczce.

Prawidłowym sposobem jest zalogowanie się do my-sql z sudouprawnieniami.

$ sudo mysql -u root -p

A następnie aktualizując hasło za pomocą:

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

Po wykonaniu tej czynności stop and startserwer mysql.

$  sudo service mysql stop
$  sudo service mysql start

Aby uzyskać szczegółowe informacje, możesz skorzystać z tego linku .

W razie wątpliwości komentuj.

Nandesh
źródło
4
To działało dla mnie przy użyciu Ubuntu 18. Dziękuję bardzo.
Peter Drinnan
10
Pracowałem również na Ubuntu 18.04
sgtkuncoro
2
Dokładnie tego szukałem. Dziękuję :) Pracowałem nad Ubuntu 18
Manthan_Admane
2
działało to jak urok, lubuntu 19.04
Kvvaradha
3
To działa dobrze. Link jest przydatny.
kjohri
9

Miałem ten problem na maszynie Wirtualnej Debian 8, z którą współpracowałem za pośrednictwem Putty na pulpicie Windows 10.

Próbowałem różnych sugestii tutaj, ale nic nie działało i korzystam z MariaDB na hoście Debiana. W końcu okazało się, że nie mogę uruchomić serwera db w trybie awaryjnym, ale nie musiałem i następujące polecenia faktycznie dla mnie działały, tj. Pozwalając nowo utworzonemu użytkownikowi MySql zalogować się na serwerze MySql / MariaDB:

sudo service mysql restart
sudo mysql # logs in automatically into MariaDB
use mysql;
update user set plugin='' where user='your_user_name';
flush privileges;
exit;
sudo service mysql restart # restarts the mysql service

Jeśli powyższe nie do końca działa, wykonaj kroki opisane w powyższym poście zetacu ( zetacu ), a następnie wykonaj moje kroki.

Teraz powinieneś mieć możliwość korzystania ze zdalnego klienta terminala i bezpiecznego logowania do mysql za pomocą polecenia:

mysql -u your_user_name -p

* po wyświetleniu monitu wpisz hasło

Tahir Khalid
źródło
Tak proste. Dobrze, tylko pierwsza komenda nie wolno wykonać drugi, więc będę dostosować go edycji - proszę zobaczyć, czy mam rację ...
kokbira
7

Sugerowałbym usunięcie połączenia MySQL -

AKTUALIZACJA - dotyczy wersji Mysql 5.5, jeśli twoja wersja jest inna, zmień odpowiednio pierwszą linię

sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-core-5.5 mysql-client-core-5.5
sudo rm -rf /etc/mysql /var/lib/mysql
sudo apt-get autoremove
sudo apt-get autoclean

I zainstaluj ponownie Ale tym razem sam ustaw hasło roota. Zaoszczędzi to wiele wysiłku.

sudo apt-get update
sudo apt-get install mysql-server
Eminem347
źródło
@ingernet może to z powodu innych problemów, które zostały pominięte podczas ponownej instalacji
Eminem347,
@PJBrunet może powodować, że Twoja wersja MySQL jest inna
Eminem347
W porządku, ale rozwiązanie uniwersalne jest najlepsze.
PJ Brunet,
6

Po wielu godzinach zmagania się z brakiem rozwiązania, to zadziałało dla mnie, a potem znalazłem film na youtube, w którym jest napisane, że kolumna z hasłami nazywa się teraz uwierzytelnianie. Mogłem więc zmienić hasło w następujący sposób: Najpierw wejdź do mysql z terminala

sudo mysql

następnie wewnątrz mysql wpisz cokolwiek po mysql>

mysql> use mysql
mysql> update user set authentication_string=PASSWORD("mypass") where user='root';
mysql> flush privileges;
mysql> quit;

w tym momencie jesteś z mysql z powrotem do normalnego miejsca na terminalu. Aby to zadziałało, musisz ponownie uruchomić mysql. dla tego typu:

sudo service mysql restart

Zobacz ten link wideo, aby lepiej zrozumieć

Ameer Ul Islam
źródło
5

krok 1. sudo mysql -u root -p

krok 2. USE mysql;

krok 3. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'admin';

Tutaj „admin” to twoje nowe hasło, możesz je zmienić.

krok 4. exit

Dzięki. Gotowe.

Y. Joy Ch. Singha
źródło
5

Nie ma potrzeby sudo

Baza danych jest inicjowana za pomocą 2 kont z wszystkimi uprawnieniami: pierwsze to „root”, które jest niedostępne, a drugie z twoją nazwą użytkownika (sprawdź za pomocą polecenia whoami).

Aby umożliwić dostęp do konta root, musisz zalogować się przy użyciu swojej nazwy użytkownika

mysql -u $(whoami)

i ręcznie zmień hasło dla roota

use mysql;
set password for 'root'@'localhost' = password('YOUR_ROOT_PASSWORD_HERE');
flush privileges;
quit

Zaloguj się jako „root”

mysql -u root -p
Raoul HATTERER
źródło
Jesteś poprawną odpowiedzią na aktualną wersję mysql, dziękuję!
Hugo S
3

Pierwszy krok: przejdź do /etc/phpmyadmin/config.inc.php, a następnie odkomentuj wiersze, w których znajduje się AllowNoPassword. Drugi krok: zaloguj się do domyślnego konta mysql

mysql -u root -p
use mysql;
update user set plugin="" where user='root';
flush privilege;

i to wszystko!

Ángel Ugarte
źródło
3

To działało dla mnie:

mysql --user=root mysql
CREATE USER 'some_user'@'%' IDENTIFIED BY 'some_pass';
GRANT ALL PRIVILEGES ON *.* TO 'some_user'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Dorad
źródło
3

Po raz pierwszy napotkałem ten sam problem.

Teraz jest naprawione:

Najpierw skopiuj /etc/mysql/mysql.conf.d/mysqld.cnfplik i wklej go do /etc/mysql/my.cnf.

Możesz to zrobić za pomocą polecenia:

sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf

Teraz zresetujmy hasło:

Użyj następujących poleceń w swoim terminalu:

sudo service mysql stop 
sudo service mysql start
sudo mysql -u root

Teraz jesteś w konsoli mysql.

Napiszmy kilka zapytań, aby zresetować nasze hasło roota

USE mysql
update mysql.user set authentication_string=password('newpass') where user='root' and Host ='localhost';
update user set plugin="mysql_native_password"; 
flush privileges;
quit

Teraz możemy wyczyścić /etc/mysql/my.cng

Otwórz powyższy plik w edytorze i usuń całe linie z pliku.

Następnie uruchommy ponownie mysql:

sudo mysql service restart 

Teraz użyjmy mysql z nowo utworzonym hasłem:

sudo mysql -u root -p

Na koniec wprowadź nowo utworzone hasło.

muhammed fairoos nm
źródło
1
Działało dobrze ! ale twoja odpowiedź musi zostać zaktualizowana !! /etc/mysql/my.cnf i nie /etc/mysql/my.cng, a dla usługi zrestartuj usługę sudo mysql restart
essayoub
3

Tutaj znalazłem swoje rozwiązanie po wielu godzinach badań.

Zatrzymaj MySQL

sudo service mysql stop

Utwórz katalog usług MySQL.

sudo mkdir /var/run/mysqld

Zezwól użytkownikowi MySQL na zapis w katalogu usługi.

sudo chown mysql: /var/run/mysqld

Uruchom MySQL ręcznie, bez sprawdzania uprawnień i sieci.

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

Zaloguj się bez hasła.

 mysql -uroot mysql

Aktualizować hasło

UPDATE mysql.user SET authentication_string=PASSWORD('YOURNEWPASSWORD'), plugin='mysql_native_password' WHERE User='root' AND Host='%';
EXIT;

Wyłącz MySQL.

sudo mysqladmin -S /var/run/mysqld/mysqld.sock shutdown

Uruchom usługę MySQL normalnie.

sudo service mysql start
Sanjun Dev
źródło
To dało mi monit mysql, kiedy NIC NIE zrobiłoby tego! Dzięki!
UserX
2

Chcesz uzyskać dostęp do MySQL z użytkownikiem root, ale nie podajesz poprawnego hasła roota.

Jeśli musisz ustawić nowe hasło dla roota , strona MySQL ma świetną dokumentację, jak to zrobić: http://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html

Nie pokażę tutaj procesu, ponieważ dokumentacja MySql na powyższy link jest jasna i zwięzła .

Cristian Gonçalves
źródło
Dzięki za odpowiedź, ale nie mogłem jej uruchomić, dlatego zdecydowałem się zainstalować iRedMail z bazą danych pgSQL.
Folkmann
Roger Folkman! Dobrze wiedzieć, że mimo to rozwiązałeś problem.
Cristian Gonçalves
Linki się psują. mysql.com ma wiele uszkodzonych linków na przestrzeni lat. Powinieneś skopiować i wkleić odpowiednie informacje tutaj, co jest w porządku, dopóki przypisujesz źródło.
Goose
1

os: Ubuntu18.04

mysql: 5.7

  1. dodaj na skip-grant-tableskońcu pliku mysqld.cnf

  2. cp my.cnf

sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf
  1. zresetować hasło
(base)   ~ sudo service mysql stop 
(base)   ~ sudo service mysql start
(base)   ~ mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed, 3 warnings
mysql> update mysql.user set authentication_string=password('newpass') where user='root' and Host ='localhost';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> update user set plugin="mysql_native_password"; 
Query OK, 0 rows affected (0.00 sec)
Rows matched: 4  Changed: 0  Warnings: 0

mysql>  flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye
  1. usunąćskip-grant-tables z my.cnf
(base)   ~ sudo emacs /etc/mysql/mysql.conf.d/mysqld.cnf 
(base)   ~ sudo emacs /etc/mysql/my.cnf                 
(base)   ~ sudo service mysql restart
  1. otwórz mysql
(base)   ~ mysql -uroot -ppassword 
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> 
  1. sprawdź politykę haseł
mysql> select @@validate_password_policy;
+----------------------------+
| @@validate_password_policy |
+----------------------------+
| MEDIUM                     |
+----------------------------+
1 row in set (0.00 sec)


mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
6 rows in set (0.08 sec)!
  1. zmień konfigurację validate_password
mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.05 sec)

mysql> set global validate_password_mixed_case_count=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_number_count=3;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_special_char_count=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_length=3;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_dictionary_file    |       |
| validate_password_length             | 3     |
| validate_password_mixed_case_count   | 0     |
| validate_password_number_count       | 3     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 0     |
+--------------------------------------+-------+
6 rows in set (0.00 sec)

pamiętaj, że powinieneś wiedzieć, że popełniłeś błąd przez co? validate_password_policy?

powinieneś zresetować hasło, aby wypełnić polisę lub zmienić polisę.

iamcxl
źródło
0

Zdarzyło mi się to również. Problem polega na tym, że repozytorium mysql jest już dostarczane z dystrybucją Linuksa. Więc kiedy to zrobisz: $ sudo apt install mysql-server instaluje mysql z domyślnego repozytorium, co powoduje ten problem. Aby to pokonać, musisz odinstalować zainstalowany mysql $ sudo apt remove mysql* --purge --auto-remove

Następnie pobierz repozytorium mysql z oficjalnej strony MySQL APT Repo Postępuj zgodnie z ich dokumentacją dotyczącą dodawania repozytorium i instalowania go. To nie stanowi problemu. Ponadto, jak odpowiedział @zetacu, możesz sprawdzić, czy root mysql rzeczywiście używa teraz wtyczki mysql_native_password

sudip
źródło
0

w moim przypadku,

dev@Dev-007:~$ mysql -u root -p
Enter password: 
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Jestem pewien, że moje hasło było prawidłowe, w przeciwnym razie byłby kod błędu ERROR 1045 (28000): Access denied for user

więc ponownie loguję się używając sudo,

dev@Dev-007:~$ sudo mysql -u root -p

tym razem zadziałało dla mnie. zobacz dokumenty

a następnie zmień hasło roota,

mysql> alter user 'root'@'%' identified with mysql_native_password by 'me123';
Query OK, 0 rows affected (0.14 sec)

mysql> 

następnie zrestartuj serwer za pomocą sudo /etc/init.d/mysql restart

Mohideen bin Mohammed
źródło