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_password
je nowym, wybranym hasłem.
Uwaga: jeśli ALTER USER
polecenie nie działa, zwykle oznacza większy problem. Możesz jednak spróbować UPDATE ... SET
zresetować 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.