Исправление ошибки #1698 - Access denied for user ‘root’@’localhost’
В последних версиях MariaDB (возможно и MySQL) по умолчанию стала применяться аутентификация по unix_socket. Если вы не знакомы с ней, то вы могли столкнуться с ошибкой «#1698 - Access denied for user ‘root’@’localhost’».
Давайте рассмотрим, что такое аутентификация по unix_socket в MySQL и MariaDB, а также как исправить ошибку #1698.
Аутентификация unix_socket в MySQL и MariaDB
Суть аутентификации по unix_socket в том, что если пользователь уже выполнил вход в систему, то ему не нужно вводить пароль при подключении к СУБД, поскольку его подлинность уже была проверена при входе в ОС.
На практике, большинство работает под обычным пользователем, а подключается к MySQL как root. В результате возникает обозначенная выше ошибка.
Можно выбрать один из вариантов:
1. Всегда использовать sudo при подключении как root.
2. Внести изменения в настройки MySQL, чтобы к СУБД могли подключаться и обычные пользователи.
3. Создать пользователя MySQL с таким же именем, как имя вашего системного пользователя
Как проверить, какой метод аутентификации используется
Для просмотра используемого метода аутентификации можно использовать следующий SQL запрос:
select * from mysql.global_priv where User='root';
Или такую, для большей наглядности вывода:
SELECT CONCAT(user, '@', host, ' => ', JSON_DETAILED(priv)) FROM mysql.global_priv where user='root';
Можно увидеть, что в качестве плагина установлены mysql_native_password и unix_socket:
{ "access": 18446744073709551615, "plugin": "mysql_native_password", "authentication_string": "invalid", "auth_or": [ { }, { "plugin": "unix_socket" } ] }
При такой конфигурации, у меня работала только аутентификация по unix_socket.
Включение и отключение аутентификации по unix_socket
Переключиться на аутентификацию по паролю можно следующим SQL запросом:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'ПАРОЛЬ';
Обратите внимание, что вам нужно ввести ПАРОЛЬ.
Чтобы переключиться на аутентификацию по unix_socket выполните следующий SQL запрос:
ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket;
Проверим:
SELECT plugin from mysql.user where User='root';
Если выведено mysql_native_password, то это означает, что используется вход по паролю.
На самом деле, аутентификацию по unix_socket можно сочетать с аутентификацией по паролю, но я не буду на этом останавливаться.
Вариант с update user
Если предыдущий способ не сработал для вас, то для получения доступа к базе данных MySQL обычному пользователю без использования sudo привилегий, зайдите в приглашение командной строки MySQL
sudo mysql
и запустите следующие команды:
use mysql; update user set plugin='' where User='root'; flush privileges; exit
Затем перезапустите службу MySQL и попробуйте войти в базу данных без sudo, как показано ниже.
sudo systemctl restart mysql.service mysql -u root -p
Замена для «update user set plugin='' where User='root';»
Ранее похожий эффект - смены аутентификации с unix_socket на аутентификацию по паролю - достигался с помощью последовательности команд:
Подключение к серверу MySQL:
sudo mysql
В приглашении MySQL нужно было выполнить команды:
use mysql; update user set plugin='' where User='root'; flush privileges; exit
Затем нужно было перезапустить службу:
sudo systemctl restart mysql.service
И можно было подключаться без sudo.
mysql -u root -p
В показанном выше случае также менялся способ аутентификации с unix_socket на пароль, но при этом не происходила установка нового пароля. Если вы хотите такого же эффекта (хотя это становится небезопасным после отключения аутентификации с unix_socket), то вы можете выполнить следующие запросы (то есть установить пустой пароль):
use mysql; ALTER USER 'root'@'localhost' IDENTIFIED BY ''; exit
Выбор способа аутентификации при создании пользователя
Создать пользователя с аутентификацией по паролю можно SQL запросом следующего вида:
CREATE USER ПОЛЬЗОВАТЕЛЬ@ХОСТ IDENTIFIED BY 'ПАРОЛЬ';
Чтобы создать пользователя с аутентификацией по unix_socket выполните следующий SQL запрос:
CREATE USER ПОЛЬЗОВАТЕЛЬ@ХОСТ IDENTIFIED VIA unix_socket;
Связанные статьи:
- Решение проблемы с ошибкой #1698 - Access denied for user 'root'@'localhost' (100%)
- Ошибка «ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2 "No such file or directory")» (РЕШЕНО) (54.3%)
- Ошибка «mysqli_connect(): (HY000/1045): Access denied for user 'username'@'localhost'» (РЕШЕНО) (54.3%)
- Ошибка «Failed - Network error» во время экспорта в phpMyAdmin (РЕШЕНО) (54.3%)
- Чувствительный к регистру поиск в phpMyAdmin (54.3%)
- Как включить SMPTS (465) postfix в Linux (RANDOM - 0.3%)