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


35

Dzisiaj chciałem stworzyć bazę danych w PMA. Napisano: „Nie można zalogować się do serwera MySQL”. Próbowałem przez terminal, ten sam problem, a to dlatego, że moje hasło jest nieprawidłowe. I nie rozumiem dlaczego.

Próbowałem zwykłej metody zresetowania hasła roota (pomiń montowanie tabel grantu i zresetuj hasło), ale wygląda na to, że to nie działa.

Zobaczyć, że:

morgan@rakija:~$ sudo mysqld_safe --skip-grant-tables &
[1] 14016
morgan@rakija:~$ 150802 19:07:25 mysqld_safe Can't log to error log and syslog at the same time.  Remove all --log-error configuration options for --syslog to take effect.
150802 19:07:25 mysqld_safe Logging to '/var/log/mysql/error.log'.
150802 19:07:25 mysqld_safe A mysqld process already exists

[1]+  Terminé 1               sudo mysqld_safe --skip-grant-tables
morgan@rakija:~$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.0.20-MariaDB-0ubuntu0.15.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> update user set password=PASSWORD("newPass") where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

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

MariaDB [mysql]> exit
Bye
morgan@rakija:~$ sudo service mysql restart
morgan@rakija:~$ mysql -uroot -pnewPass
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Odpowiedzi:


56

Znalazłem rozwiązanie równie dziwne jak sam problem.

Uruchom ponownie MySQL / MariaDB przy użyciu --skip-grant-tables(wyszukaj samouczki w Internecie). (wcale nie jest to konieczne, przeczytaj moje zmiany na końcu postu)

Spójrz na pluginpole do mysql.usertabeli:

MariaDB [mysql]> SELECT user, plugin FROM user;
+------+-------------+
| user | plugin      |
+------+-------------+
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
+------+-------------+

Musiałem zresetować pole wtyczki każdego wpisu na pusty ciąg.

UPDATE user SET plugin="";   // without WHERE clause

Upewnij się również, że hasło jest zdefiniowane, ponieważ czasami wydaje się, że zostało usunięte (wybierz w user, passwordpolach). Jeśli nie, zaktualizuj go za pomocą:

UPDATE user SET password=PASSWORD("my_password") WHERE user="root";

Parametry uprawnień należy jawnie zapisać:

FLUSH PRIVILEGES;

Następnie zrestartuj MySQL w trybie normalnym i powinieneś być w stanie połączyć się z kontem root.

Nie musi to koniecznie wyłączać połączenia przez gniazdo Unix. Po naprawie mojego MySQL va w PMA widzę, że połączenie jest ustanawiane przez gniazdo Unix.

EDYCJA , kilka miesięcy później: jestem przyzwyczajony, że ten problem często wraca, myślę, że przy każdej aktualizacji MariaDB (lub coś takiego). Mam więc lepsze zrozumienie problemu; istnieje wtyczka UNIX_SOCKET, która pozwala zalogować się na konto MariaDB bez konieczności tworzenia hasła, ponieważ korzysta z poświadczeń powłoki, aby ci zaufać, bez konieczności wprowadzania żadnego hasła. W rzeczywistości ta wtyczka jest wtyczką uwierzytelniającą, a nie metodą komunikacji z serwerem SQL. Możesz więc bezpiecznie go wyłączyć, jeśli nie używasz gniazda unix jako metody logowania. Jedyne, czego nie potrafię wyjaśnić, to dlaczego wtyczka UNIX_SOCKET jest regularnie ustawiana na każdym koncie bazy danych, bez żadnych działań po mojej stronie.

Ma to fajny efekt uboczny, że kiedy to się stanie, możesz zalogować się do serwera SQL bez konieczności ponownego uruchamiania MariaDB za pomocą --skip-grant-tables: po prostu zaloguj się do konta root systemu, a następnie po prostu połącz się mysql -u rootbez hasła, a następnie zresetuj pole wtyczki w sposób wyjaśniony powyżej.

EDYCJA 2: Potwierdzono, że dzieje się to przy każdej aktualizacji MariaDB w Ubuntu.


1
Powoduje to przerwanie zadania cron konserwacji na Ubuntu 16.04 (przynajmniej), ponieważ ten skrypt spodziewa się zalogować bez hasła przy użyciu wtyczki gniazda. Szczegółowe informacje można znaleźć na stronie superuser.com/questions/957708/ ...
colan

W porządku, ciekawe, ale tak się już nie dzieje (moja konfiguracja haseł starszego typu nie jest teraz losowa). Być może wtyczka gniazda Unix jest teraz ustawiona tylko dla użytkownika root? Nie mogłem tego teraz sprawdzić. Ale nie podoba mi się pomysł, że system operacyjny decyduje o tym, jakiej konfiguracji uwierzytelniania użyć.
Morgan Touverey Quilling

Ten problem jest do bani, zdarzyło się na Debianie 9, nie pytano o hasło roota, kiedy instalowałem MariaDB i nawet nie mogłem go zresetować. Mam nadzieję, że to się nie powtórzy po aktualizacji. Czy powinniśmy zastąpić MariaDB MySQL, aby uniknąć takich problemów?
baptx

Nie jestem pewien, czy nadal tak się dzieje, być może zostało to teraz naprawione (mogę edytować post, jeśli ktoś wie). Może dzieje się to tylko podczas instalacji, co byłoby dobrym domyślnym ustawieniem.
Morgan Touverey Quilling

1
Właśnie zauważyłem, że jeśli nie używamy wtyczki gniazda unix dla użytkownika root, to nie zainstalować pakiet phpMyAdmin na najnowszym Debianie: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). Najlepszym rozwiązaniem jest więc używanie domyślnego uwierzytelniania gniazda UNIX za pomocą polecenia sudo mysql -u root, które moim zdaniem jest również bardziej bezpieczne i wydajne.
baptx

5

Z tej odpowiedzi http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

Mysql próbuje uwierzytelnić root'a za pomocą wtyczki, a nie hasła. Musisz wyłączyć użycie wtyczki dla roota.

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q

2
Właśnie to opublikowałem jako odpowiedź.
Morgan Touverey Quilling

1
Jest to nieco bardziej zwięzły pakiet z twoją aktualizacją.
kucyki

Nie mogę nawet uzyskać powłoki mysql, więc w moim przypadku to nie zadziała, nawet jeśli widzę Could not open mysql.plugin table.w dzienniku błędów.
Dave Everitt

0

Połącz jak opisano wcześniej:

mysqld_safe --skip-grant-tables

Plik dziennika zostanie wyświetlony:

160518 23:21:01 mysqld_safe Logging to '/usr/local/mysql/data/ab123456.domain.com.err'.
160518 23:21:01 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

Przeszukaj dziennik (w tym przypadku: /usr/local/mysql/data/ab123456.domain.com.err) w celu znalezienia odpowiedniego gniazda:

cat /usr/local/mysql/data/ab123456.domain.com.err | grep "socket: "
Version: '5.5.49-MariaDB'  socket: '/tmp/mysql.sock'  port: 3306  MariaDB Server

i użyj go w połączeniu mysql:

mysql --socket /tmp/mysql.sock -u root
root@ab123456:~# /usr/local/mysql/bin/mysql --socket /tmp/mysql.sock -u root

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.49-MariaDB MariaDB Server

Właśnie dostaję, $ mysqld_safe --skip-grant-tables 190818 14:13:35 mysqld_safe Logging to '/usr/local/var/mylaptop.local.err'. 190818 14:13:35 mysqld_safe Starting mysqld daemon with databases from /usr/local/varale właśnie wróciłem do zachęty.
Dave Everitt,

0

Domyślnie marriadb używa wtyczki uwierzytelniającej „unix_socket” do ustawiania haseł, powinno to być „mysql_native_password”, więc

przełącz bazę danych ..

use mydatabase;

najpierw zobacz, czy wtyczka jest ustawiona.

SELECT user, plugin FROM user;

ustaw na „mysql_native_password”

UPDATE user SET plugin="mysql_native_password"; 

ustaw nowe hasło ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
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.