ZaLinux.ru

Аутентификация по паролю и unix_socket в MySQL и MariaDB. Исправление ошибки #1698 - Access denied for user ‘root’@’localhost’

Исправление ошибки #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;

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *