mysql (mariadb) ERROR 1698 (28000): Odmowa dostępu dla użytkownika „root” @ „localhost”

22

Pracuję nad Xubuntu 15.04. Zainstalowałem już serwer MariaDB na różnych systemach i zawsze proszono mnie o hasło roota podczas instalacji. Tym razem nie pamiętam jednak prośby o hasło. Gdy próbuję się zalogować bez hasła (lub pustego hasła), pojawia się Access denied for user 'root'@'localhost'błąd. Próbowałem całkowicie odinstalować pakiet

sudo apt-get remove mariadb-server
sudo apt-get purge mariadb-server

Po ponownej instalacji nadal nie wyświetlało się pytanie o hasło roota.

Wypróbowałem mysqld --skip-grant-tablespodejście z mysql, jak naprawić odmowę dostępu dla użytkownika „root” @ „localhost” . Mogę zmodyfikować hasło użytkownika root w bazie danych mysql - przynajmniej zmiany wartości skrótu - ale nadal nie mogę zalogować się przy użyciu nowego hasła po ponownym uruchomieniu serwera mysql. Nadal pojawia się ten sam błąd.

Użytkownik debian-sys-maint nie istnieje. Nie mogę go więc użyć do naprawy czegokolwiek.

Jakieś pomysły, co jeszcze mogę spróbować?

d72b617c
źródło
Pomocny wątek z tym samym pytaniem na StackOverflow: stackoverflow.com/questions/39281594/...
Kevin

Odpowiedzi:

34

Musisz zresetować hasło. więc po to

sudo mysql -u root
use mysql;
update user set plugin='' where User='root';
flush privileges;
exit;
Abhinav bhardwaj
źródło
8
Nieoczywistą „magią” tego podejścia jest to, że użytkownik root systemu operacyjnego może zalogować się do bazy danych bez konieczności podawania hasła, ponieważ plugin: auth_socketjest ono domyślnie włączone. Innymi słowy, nie ma potrzeby używania, --skip-grant-tablestak jak byłoby to konieczne w poprzednich wersjach MySQL. (Ponadto technicznie rzecz biorąc, środek ten nie „resetuje hasła”, ale wyłącza wtyczkę.)
Ben Johnson,
1
+1, Czy możesz wyjaśnić powód, dlaczego?
A1Gard,
4
Takie podejście spowoduje problemy później. Jeśli wyłączysz wtyczkę, codzienne zadanie crona zostanie przerwane, ponieważ zakłada, że ​​można się zalogować za pomocą tej wtyczki. Zobacz moją odpowiedź, aby poznać szczegóły.
colan
11

Idea nowej konfiguracji polega na tym, że nie powinieneś w ogóle używać haseł. Aby uzyskać szczegółowe informacje, patrz Wtyczka uwierzytelniania UNIX_SOCKET .

Szczególnie istotna jest zawartość /usr/share/doc/mariadb-server-10.0/README.Debian.gz na Ubuntu 16.04:

W nowych instalacjach nie jest ustawione hasło roota i nie jest już tworzony użytkownik debian-sys-maint. Zamiast tego konto root MariaDB jest ustawione na uwierzytelnianie przy użyciu gniazda unix, np. Każde wywołanie mysqld przez root lub sudo pozwoli użytkownikowi zobaczyć monit mysqld.

Nigdy nie możesz nigdy usunąć użytkownika „root” użytkownika mysql. Chociaż nie ma ustawionego hasła, wtyczka unix_auth zapewnia, że ​​można go uruchomić tylko lokalnie jako użytkownik root.

Poświadczenia w /etc/mysql/debian.cnf określają użytkownika używanego przez skrypty init do zatrzymywania serwera i przeprowadzania logrotacji. Był to użytkownik debian-sys-maint, który nie jest już używany, ponieważ root może działać bezpośrednio.

Jeśli więc wyłączysz tę wtyczkę dla roota i ustawisz hasło, codzienne zadanie crona zostanie przerwane, ponieważ zakłada, że ​​zaloguje się jako root bez hasła, ale z wtyczką.

Później mówi:

Skrypty powinny być uruchamiane, ponieważ użytkownik ma wymagane granty i mogą być identyfikowane przez unix_socket.

Wygląda więc na to, że aplikacje nie powinny już używać haseł.

colan
źródło
1
Właśnie napotkałem bardzo opisany przez ciebie problem: "So if you disable that plug-in for root and set a password, the daily cron job will break as it's assuming it will log in as root without a password..."Nieoczywiste implikacje włączenia wtyczki uwierzytelniającej UNIX_SOCKET (która jest teraz domyślna) polega na tym, że możliwość uwierzytelnienia się jako użytkownik root bazy danych za pomocą hasła jest wyłączona. Nigdzie na mariadb.com/kb/en/mariadb/unix_socket-authentication-plugin nie wspomniano o tym znaczącym ograniczeniu. W związku z tym nie można zalogować się jako root, np. Przez SSH.
Ben Johnson
2

Rozwiązałem problem po odpowiedzi z tego postu:

Nie można zresetować hasła roota MySQL (MariaDB)

Trzeba zmienić pole wtyczki mysql.user dla wszystkich katalogów głównych na pusty ciąg.

d72b617c
źródło
Ten problem został opisany tutaj: percona.com/blog/2016/03/16/…
antonu17
3
Takie podejście spowoduje problemy później. Jeśli wyłączysz wtyczkę, codzienne zadanie crona zostanie przerwane, ponieważ zakłada, że ​​można się zalogować za pomocą tej wtyczki. Zobacz moją odpowiedź, aby poznać szczegóły.
colan
1

Zrobiłem to, uruchamiając to polecenie, zaraz po instalacji:

$ sudo mysql_secure_installation

W pierwszym kroku hasło jest puste, więc po prostu naciśnij Enter.

dxvargas
źródło
1
Nie jest puste, jeśli zostało już ustawione, a moim zapomnianym pw jest… więc nadal nie mogę się zalogować
Dave Everitt
0

Miałem ten sam problem na piapie raapberry z odcinkiem. Moim rozwiązaniem było utworzenie nowego użytkownika ze wszystkimi uprawnieniami, wykonując następujące czynności:

sudo mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root

MariaDB [(none)]> use mysql
MariaDB [mysql]> FLUSH PRIVILEGES;
GRANT ALL privileges ON mysql.* TO 'admin'@'localhost' with grant option;

Teraz mogę się zalogować, a do nas użytkownik „admin” jako administrator.

Mam nadzieję, że to komuś pomoże.

trasba
źródło
0

Po prostu użyj sudo mysql -u root- to wszystko


Szczegóły: nowsze wersje uwierzytelniają się w mysql przy użyciu uwierzytelniania systemowego. Więc jeśli możesz sudo na system operacyjny, zakłada się, że jesteś także rootem db. Możesz to potwierdzić, wydając sudo mysql -u root -e "USE mysql; SELECT User, Host, plugin FROM mysql.user;". Powinieneś zobaczyć coś takiego (może z auth_socketinnymi dystrybucjami)

+------+-----------+-------------+
| User | Host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket |
+------+-----------+-------------+
DeepSpace101
źródło
Jestem zalogowany jako root, ale dla mnie to polecenie nadal chce hasło root MariaDB… które zapomniałem :-(
Dave Everitt