Доступ запрещен для пользователя 'root' @ 'localhost' (с паролем: YES) после новой установки в Ubuntu

124

Сегодня я авторизовался как root в Ubuntu 14.04.1 LTS ll

а затем apt-get install mariadb-server(без sudo, но с правами root).

С mySQL -h localhost -u root --password=<PW>я получил

Доступ запрещен для пользователя 'root' @ 'localhost' (с паролем: ДА)

С mySQL -u root -pЯ вошел в БД и сделал

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '<PW>';
FLUSH ALL PRIVILEGES;

Но это не помогло. Есть идеи? Я не нашел ответа на подобные вопросы.

SQL-Neuling
источник
Вы пробовали сбросить пароль для root?
Ozgur Bar

Ответы:

278

TL; DR: чтобы получить доступ к более новым версиям mysql / mariadb после того, как вы являетесь пользователем root, после новой установки вам необходимо находиться в корневой оболочке (т.е. sudo mysql -u rootили mysql -u rootвнутри оболочки, запущенной su -или sudo -iпервой)


Только что выполнив такое же обновление на Ubuntu, у меня была такая же проблема.

Что было странно

sudo /usr/bin/mysql_secure_installation

Примет мой пароль и позволит мне его установить, но я не могу войти в систему как rootчерез mysqlклиента

Мне пришлось начать мариадб с

sudo mysqld_safe --skip-grant-tables

чтобы получить доступ как root, в то время как все остальные пользователи могут получить доступ нормально.

Глядя на mysql.userтаблицу, я заметил, что для root pluginстолбец установлен на, unix_socketтогда как для всех других пользователей он установлен на mysql_native_password. Беглый взгляд на эту страницу: https://mariadb.com/kb/en/mariadb/unix_socket-authentication-plugin/ объясняет, что Unix Socket позволяет входить в систему путем сопоставления uidпроцесса, запускающего клиента, с процессом пользователя вmysql.user стол. Другими словами, чтобы получить доступ к mariadb, rootвы должны войти в систему как root.

Разумеется, перезапуск моего демона mariadb с требуемой аутентификацией я могу войти в систему как root с

sudo mysql -u root -p

или

sudo su -
mysql -u root -p

Сделав это, я подумал о том, как получить доступ без необходимости выполнять sudo, а это просто вопрос выполнения этих запросов mysql.

GRANT ALL PRIVILEGES on *.* to 'root'@'localhost' IDENTIFIED BY '<password>';
FLUSH PRIVILEGES;

(замена <password> желаемый пароль root mysql). Это позволяет использовать пароль для входа в систему для пользователя root.

В качестве альтернативы запустите запрос mysql:

UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE user = 'root' AND plugin = 'unix_socket';
FLUSH PRIVILEGES;

Изменит учетную запись root на использование пароля для входа без изменения пароля, но это может оставить вас с установкой mysql / mariadb без пароля root.

После любого из этих действий вам необходимо перезапустить mysql / mariadb:

sudo service mysql restart

И вуаля у меня был доступ из личного кабинета через mysql -u root -p

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ, ЧТО ЭТО УМЕНЬШАЕТ БЕЗОПАСНОСТЬ. Предположительно, разработчики MariaDB выбрали такую ​​работу с корневым доступом по уважительной причине.

Думая об этом, я вполне счастлив, что это произошло, sudo mysql -u root -pпоэтому я возвращаюсь к этому, но я решил опубликовать свое решение, так как я не мог найти его в другом месте.

DorianFM
источник
7
"чтобы получить доступ к mariadb как root, вы должны войти в систему как root". - Это предложение должно быть в начале ответа.
Филипп Людвиг,
1
почему вы запускаете GRANT ALL PRIVILEGES on *.* to 'root'@'localhost' IDENTIFIED BY '<password>'; команду дважды, прежде чем сбрасывать приват?
Blairg23
4
Это должно быть где-то более заметным, например, большие красные буквы во время установки или что-то в этом роде ... Просто потратил несколько часов жизни, пытаясь настроить сервер, который мне нужен как можно скорее ....
Галл Анноним
1
кстати, если ты такой же ленивый, как я, ты можешь сэкономить две секунды с помощьюsudo service mysql restart
zeisi 07
1
Спасибо за совет, отлично подходит для разработчиков, но как вернуть исходное изображение?
Сэм
42

В чистом Ubuntu 16.04 LTS вход root MariaDB для localhost изменился со стиля пароля на стиль входа sudo ...

так что просто сделай

sudo mysql -u root

поскольку мы хотим войти в систему с паролем, создайте другого пользователя 'user'

в консоли MariaDB ... (вы попадаете в консоль MariaDB с помощью sudo mysql -u root)

use mysql
CREATE USER 'user'@'localhost' IDENTIFIED BY 'yourpassword';
\q

затем в приглашении оболочки bash,

mysql-workbench

и вы можете войти в систему с помощью 'user' с 'yourpassword' на локальном хосте

Curycu
источник
12

Попробуйте команду

sudo mysql_secure_installation

нажмите ввод и назначьте новый пароль для root в mysql / mariadb .

Если вы получите сообщение об ошибке

ОШИБКА 2002 (HY000): не удается подключиться к локальному серверу MySQL через сокет '/var/run/mysqld/mysqld.sock'

включить службу с

service mysql start

теперь, если вы снова войдете с

mysql -u root -p

если вы следите за проблемой, введите sudo suи mysql -u root -pтеперь примените разрешения для root

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '<password>';

это устранило мою проблему в MariaDB .

Удачи

IsraelM17
источник
11

от суперпользователя принят ответ :

sudo mysql -u root
use mysql;
update user set plugin='' where User='root';
flush privileges;
exit;
sailfish009
источник
3

Мне пришлось войти в Ubuntu как root, чтобы получить доступ к Mariadb как root. Это может иметь какое-то отношение к тому «Harden ...», которое он предлагает вам сделать при первой установке. Так:

$ sudo su
[sudo] password for user: yourubunturootpassword
# mysql -r root -p
Enter password: yourmariadbrootpassword

и ты внутри.

Джо С
источник
2

Новая команда для сброса привилегий:

FLUSH PRIVILEGES

Старая команда FLUSH ALL PRIVILEGESбольше не работает.

Вы получите сообщение об ошибке следующего вида:

MariaDB [(none)]> FLUSH ALL PRIVILEGES; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ALL PRIVILEGES' at line 1

Надеюсь это поможет :)

Сильвен
источник
0

Такая система, как Ubuntu, предпочитает использовать плагин auth_socket . Он попытается аутентифицироваться, сравнивая ваше имя пользователя в БД и процесс, который делает запрос mysql; это описано здесь

Плагин сокета проверяет, совпадает ли имя пользователя сокета (имя пользователя операционной системы) с именем пользователя MySQL, указанным клиентской программой для сервера, и разрешает соединение, только если имена совпадают.

Вместо этого вы можете вернуться с mysql_native_password , который потребует пользователя / пароля для аутентификации.

Что касается метода достижения этого, я рекомендую это .

Nguyen
источник