Я попытался много шагов, чтобы исправить эту проблему. Существует так много источников возможных решений этой проблемы, что трудно отфильтровать смысл от бессмыслицы. Я наконец нашел хорошее решение здесь :
Шаг 1: Определите версию базы данных
$ mysql --version
Вы увидите некоторые результаты, как это с MySQL:
$ mysql Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using EditLine wrapper
Или вывод, как это для MariaDB:
mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1
Запишите, какая база данных и какая у вас версия, так как вы будете использовать их позже. Затем вам нужно остановить базу данных, чтобы вы могли получить к ней доступ вручную.
Шаг 2. Остановка сервера базы данных
Чтобы сменить пароль пользователя root, вам необходимо заранее выключить сервер базы данных.
Вы можете сделать это для MySQL с:
$ sudo systemctl stop mysql
И для MariaDB с:
$ sudo systemctl stop mariadb
Шаг 3. Перезапуск сервера базы данных без проверки разрешений.
Если вы запустите MySQL и MariaDB без загрузки информации о пользовательских привилегиях, это позволит вам получить доступ к командной строке базы данных с правами суперпользователя без предоставления пароля. Это позволит вам получить доступ к базе данных, не зная об этом.
Для этого вам нужно запретить базе данных загружать таблицы грантов, в которых хранится информация о привилегиях пользователя. Поскольку это немного угрожает безопасности, вам также следует пропустить сеть, чтобы предотвратить подключение других клиентов.
Запустите базу данных, не загружая таблицы грантов и не включая сеть:
$ sudo mysqld_safe --skip-grant-tables --skip-networking &
Амперсанд в конце этой команды заставит этот процесс работать в фоновом режиме, чтобы вы могли продолжать использовать свой терминал.
Теперь вы можете подключиться к базе данных как пользователь root, который не должен запрашивать пароль.
$ mysql -u root
Вместо этого вы сразу увидите приглашение оболочки базы данных.
MySQL Prompt
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
MariaDB Prompt
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
Теперь, когда у вас есть root-доступ, вы можете изменить пароль root.
Шаг 4: Изменение корневого пароля
mysql> FLUSH PRIVILEGES;
Теперь мы можем изменить пароль root.
Для MySQL 5.7.6 и новее, а также MariaDB 10.1.20 и новее используйте следующую команду:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
Для MySQL 5.7.5 и старше, а также MariaDB 10.1.20 и старше используйте:
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
Обязательно замените new_password
ваш новый пароль на ваш выбор.
Примечание: если ALTER USER
команда не работает, это обычно указывает на более серьезную проблему. Однако UPDATE ... SET
вместо этого вы можете попытаться сбросить пароль root.
[ВАЖНО] Это конкретная строка, которая исправила мою конкретную проблему:
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';
Не забудьте перезагрузить таблицы грантов после этого.
В любом случае вы должны увидеть подтверждение того, что команда была успешно выполнена.
Query OK, 0 rows affected (0.00 sec)
Пароль был изменен, поэтому теперь вы можете остановить ручной экземпляр сервера базы данных и перезапустить его, как это было раньше.
Шаг 5: Перезагрузите сервер базы данных в обычном режиме
Учебное пособие включает дальнейшие шаги для перезапуска базы данных, но единственная часть, которую я использовал, была следующей:
Для MySQL используйте:
$ sudo systemctl start mysql
Для MariaDB используйте:
$ sudo systemctl start mariadb
Теперь вы можете подтвердить, что новый пароль был введен правильно, запустив:
$ mysql -u root -p
Теперь команда должна запросить вновь назначенный пароль. Введите его, и вы должны получить доступ к приглашению базы данных, как и ожидалось.
Вывод
Теперь у вас восстановлен административный доступ к серверу MySQL или MariaDB. Убедитесь, что выбранный вами новый пароль root является надежным и надежным, и храните его в надежном месте.