Krótko mówiąc, na MariaDB
UPDATE mysql.user SET plugin = 'mysql_native_password',
Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
gdzie zastępujesz NEWPASSWORD odpowiednim hasłem i wszystko inne dosłownie.
Problem polega na tym, że kiedy MariaDB lub MySQL są instalowane / aktualizowane (szczególnie jeśli w pewnym momencie root jest ustawiony bez hasła), to w tabeli Użytkownicy hasło jest faktycznie puste (lub ignorowane), a logowanie zależy od użytkownika systemu odpowiadającego do użytkownika MySQL. Możesz to przetestować w następujący sposób, przechodząc do systemu root, a następnie wpisz:
mysql -uroot -p
Następnie wpisz brak hasła lub nieprawidłowe hasło. Prawdopodobnie zostaniesz wpuszczony. (Możesz nawet zalogować się z katalogu głównego systemu Unix, # mysql
ponieważ hasło jest nieistotne, a użytkownik jest zdefiniowany).
Więc co się dzieje? Cóż, jeśli zalogujesz się jako root i wykonaj następujące czynności:
select User,host,plugin from mysql.user;
+----------------+-----------+-----------------------+
| User | host | plugin |
+----------------+-----------+-----------------------+
| root | localhost | auth_socket |
+----------------+-----------+-----------------------+
zanotujesz auth_socket
(które możesz przeczytać unix_socket
na MariaDB). Gniazda te ignorują hasła i pozwalają odpowiedniemu użytkownikowi Unix wejść bez sprawdzania hasła. Dlatego możesz zalogować się przy użyciu konta root, ale nie przy użyciu innego użytkownika.
Rozwiązaniem jest więc zaktualizowanie użytkowników, aby nie korzystali z auth_socket/unix_socket
i poprawnie ustawili hasło.
Na MariaDB (<10.2, patrz komentarze poniżej), który jest na Ubuntu w wersji 16 od 2017 roku, powinno to wystarczyć. NEWPASSWORD to twoje hasło. mysql_native_password
piszesz dosłownie.
UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
(Możliwe, że ustawienie pustej wtyczki działałoby. YMMV. Nie próbowałem tego. To jest alternatywa.)
UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
Inaczej:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';
Następnie
FLUSH PRIVILEGES;
Dla przypomnienia, rozwiązanie polegające na usunięciu użytkownika i ponownym utworzeniu go za pomocą „%” całkowicie zablokowało mi bazę danych i może powodować inne problemy, chyba że otrzymasz grant
poprawną instrukcję - łatwiej jest po prostu zaktualizować katalog główny, który już masz.
Z mojego doświadczenia wynika, że problem występuje tylko w przypadku użytkownika root, ponieważ inni użytkownicy zostaną dodani ręcznie, a nie w ramach pierwszej instalacji / aktualizacji.