mysql (mariadb) ОШИБКА 1698 (28000): доступ запрещен для пользователя 'root' @ 'localhost'


23

Я работаю над Xubuntu 15.04. Я уже установил MariaDB-сервер в различных системах, и меня всегда спрашивали пароль root во время установки. На этот раз, однако, я не помню, чтобы меня спрашивали пароль. Когда я пытаюсь войти без пароля (или пустого пароля), я получаю сообщение об Access denied for user 'root'@'localhost'ошибке. Я попытался удалить пакет полностью

sudo apt-get remove mariadb-server
sudo apt-get purge mariadb-server

Когда я переустанавливал, меня все равно не спросили пароль root.

Я попробовал mysqld --skip-grant-tablesподход из mysql, как исправить доступ, запрещенный для пользователя 'root' @ 'localhost' . Я могу изменить пароль для пользователя root в базе данных mysql - по крайней мере, изменится значение хеш-функции - но я все еще не могу войти в систему с новым паролем после перезапуска сервера mysql. Я все еще получаю ту же ошибку.

Пользователь debian-sys-maint не существует. Таким образом, я не могу использовать это, чтобы исправить что-либо.

Есть идеи, что еще я мог попробовать?


Полезная тема с тем же вопросом о StackOverflow: stackoverflow.com/questions/39281594/…
Кевин - Восстановить Монику

Ответы:


36

Вам необходимо сбросить пароль. так за что

sudo mysql -u root
use mysql;
update user set plugin='' where User='root';
flush privileges;
exit;

9
Неочевидное «волшебство» этого подхода заключается в том, что пользователь корневой операционной системы может войти в базу данных без необходимости указывать пароль, поскольку plugin: auth_socketон включен по умолчанию. Другими словами, нет необходимости использовать, --skip-grant-tablesкак было бы необходимо в прошлых версиях MySQL. (Кроме того, технически, эта мера не "сброс пароля"; это отключение плагина.)
Бен Джонсон

1
+1, можете ли вы объяснить, почему?
A1Gard

4
Этот подход вызовет проблемы позже. Если вы отключите плагин, ежедневное задание cron будет прервано, поскольку предполагается, что оно может войти в систему с этим плагином. Смотрите мой ответ для деталей.
Колан

11

Идея новой настройки заключается в том, что вам вообще не следует использовать пароли. Смотрите UNIX_SOCKET Аутентификационный плагин для деталей.

Что особенно важно, так это содержимое /usr/share/doc/mariadb-server-10.0/README.Debian.gz в Ubuntu 16.04:

При новой установке пароль root не устанавливается и пользователь debian-sys-maint больше не создается. Вместо этого корневая учетная запись MariaDB настроена для аутентификации с использованием сокета unix, например, любой вызов mysqld пользователем root или через sudo позволит пользователю увидеть приглашение mysqld.

Вы никогда не сможете удалить пользователя root «mysql». Хотя пароль не установлен, плагин unix_auth гарантирует, что он может быть запущен только локально как пользователь root.

Учетные данные в /etc/mysql/debian.cnf указывают пользователя, который используется сценариями init для остановки сервера и выполнения регистрации. Раньше это был пользователь debian-sys-maint, который больше не используется как root, может запускаться напрямую.

Поэтому, если вы отключите этот плагин для пользователя root и установите пароль, ежедневное задание cron будет прервано, поскольку предполагается, что оно войдет в систему как root без пароля, но с помощью плагина.

Позже это говорит:

Скрипты должны запускаться, поскольку у пользователя есть необходимые права доступа, и их можно идентифицировать с помощью unix_socket.

Похоже, пароли больше не должны использоваться приложениями.


1
Я только что столкнулся с той самой проблемой, которую вы описываете: "So if you disable that plug-in for root and set a password, the daily cron job will break as it's assuming it will log in as root without a password..."неочевидное следствие того, что подключаемый модуль аутентификации UNIX_SOCKET (который сейчас используется по умолчанию), заключается в том, что возможность аутентификации пользователя корневой базы данных с паролем отключена. Нигде на mariadb.com/kb/en/mariadb/unix_socket-authentication-plugin не упоминается это существенное ограничение. Соответственно, невозможно войти в систему как root, например, через SSH.
Бен Джонсон

2

Я решил проблему, следуя ответу из этого поста:

Не удается сбросить пароль root MySQL (MariaDB)

Нужно изменить поле плагина mysql.user для всех корней на пустую строку.


Эта проблема описана здесь: percona.com/blog/2016/03/16/…
antonu17

3
Этот подход вызовет проблемы позже. Если вы отключите плагин, ежедневное задание cron будет прервано, поскольку предполагается, что оно может войти в систему с этим плагином. Смотрите мой ответ для деталей.
Колан

1

Я сделал это, выполнив эту команду сразу после установки:

$ sudo mysql_secure_installation

На первом шаге пароль пуст, поэтому просто нажмите Enter.


1
Это не пусто, если уже установлено, что мой забытый pw ... так что до сих пор не могу войти
Дейв Эверитт

0

У меня была такая же проблема на raapberry pi с натяжкой. Моим решением было создать нового пользователя со всеми привилегиями, выполнив следующие действия:

sudo mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root

MariaDB [(none)]> use mysql
MariaDB [mysql]> FLUSH PRIVILEGES;
GRANT ALL privileges ON mysql.* TO 'admin'@'localhost' with grant option;

Теперь я могу войти в систему и использовать пользователя «admin» в качестве суперпользователя.

Я надеюсь, что это поможет кому-то.


0

Просто используйте sudo mysql -u root- вот и все


Детали: Новые версии аутентифицируются в mysql, используя системную аутентификацию. Так что, если вы можете использовать sudo для ОС, это предполагает, что вы тоже root db. Вы можете подтвердить это, выдав sudo mysql -u root -e "USE mysql; SELECT User, Host, plugin FROM mysql.user;". Вы должны увидеть что-то вроде этого (возможно, auth_socketв других дистрибутивах)

+------+-----------+-------------+
| User | Host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket |
+------+-----------+-------------+

Я вошел в систему как root, но для меня эта команда все еще хочет пароль root для MariaDB… который я забыл :-(
Дэйв Эверитт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.