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


35

Сегодня я хотел создать базу данных в PMA. Он сказал: «Невозможно войти на сервер MySQL». Я пытался через терминал, та же проблема, и это потому, что мой пароль неверный. И я не могу понять почему.

Я попытался обычным способом сбросить пароль root (пропустить монтирование таблиц грантов и сбросить пароль), но, похоже, он не работает.

Видеть, что:

morgan@rakija:~$ sudo mysqld_safe --skip-grant-tables &
[1] 14016
morgan@rakija:~$ 150802 19:07:25 mysqld_safe Can't log to error log and syslog at the same time.  Remove all --log-error configuration options for --syslog to take effect.
150802 19:07:25 mysqld_safe Logging to '/var/log/mysql/error.log'.
150802 19:07:25 mysqld_safe A mysqld process already exists

[1]+  Terminé 1               sudo mysqld_safe --skip-grant-tables
morgan@rakija:~$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.0.20-MariaDB-0ubuntu0.15.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> update user set password=PASSWORD("newPass") where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
morgan@rakija:~$ sudo service mysql restart
morgan@rakija:~$ mysql -uroot -pnewPass
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Ответы:


56

Я нашел решение, которое так же странно, как и сама проблема.

Перезагрузите MySQL / MariaDB с помощью --skip-grant-tables(поиск учебников в Интернете). (совсем не обязательно, читайте мои правки в конце поста)

Посмотрите на pluginполе в mysql.userтаблице:

MariaDB [mysql]> SELECT user, plugin FROM user;
+------+-------------+
| user | plugin      |
+------+-------------+
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
+------+-------------+

Мне пришлось сбросить поле плагина каждой записи в пустую строку.

UPDATE user SET plugin="";   // without WHERE clause

Кроме того, убедитесь, что пароль определен, потому что иногда он кажется стертым (выберите в user, passwordполях). Если нет, обновите его:

UPDATE user SET password=PASSWORD("my_password") WHERE user="root";

Параметры привилегий необходимо сохранять явно:

FLUSH PRIVILEGES;

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

Это не обязательно отключит соединение через сокет Unix. После ремонта MySQL va в PMA я вижу, что соединение установлено через сокет Unix.

РЕДАКТИРОВАТЬ , несколько месяцев спустя: я привык к тому, что эта проблема часто возвращалась, я думаю, что при каждом обновлении MariaDB (или что-то в этом роде). Так что у меня есть лучшее понимание проблемы; есть плагин UNIX_SOCKET, который позволяет вам входить в учетную запись MariaDB без необходимости создавать пароль, потому что он использует учетные данные оболочки, чтобы доверять вам, без необходимости вводить пароль. Фактически, этот плагин является плагином аутентификации, а не методом связи с сервером SQL. Таким образом, вы можете безопасно отключить его, если вы не используете сокет unix в качестве метода входа в систему. Единственное, что я не могу объяснить, это то, почему плагин UNIX_SOCKET регулярно устанавливается на каждую учетную запись базы данных, без каких-либо действий с моей стороны.

Это имеет приятный побочный эффект, что, когда это происходит, вы можете войти на сервер SQL без необходимости перезапуска MariaDB с помощью --skip-grant-tables: просто войдите в систему с учетной записью root, затем просто подключитесь mysql -u rootбез пароля, затем сбросьте поле плагина в как это объяснено выше.

РЕДАКТИРОВАТЬ 2: Подтверждено, это происходит при каждом обновлении MariaDB на Ubuntu.


1
Это нарушает работу cron по обслуживанию в Ubuntu 16.04 (по крайней мере), потому что этот сценарий ожидает входа в систему без пароля с помощью плагина сокета. См. Superuser.com/questions/957708/… для получения подробной информации.
колан

Ладно, интересно, но этого больше не происходит (мои старые пароли теперь не случайно устанавливаются). Может быть, плагин для сокета Unix установлен только для пользователя root? Не могу проверить это прямо сейчас. Но мне не нравится идея, что ОС решает, какую настройку аутентификации использовать.
Морган Тувери Квиллинг

Эта проблема отстой, это произошло в Debian 9, когда я установил MariaDB, пароль от root не спрашивался, и я даже не смог сбросить его. Я надеюсь, что это не повторится после обновления. Должны ли мы заменить MariaDB на MySQL, чтобы избежать таких проблем?
Baptx

Не уверен, что это все еще происходит, возможно, это было исправлено сейчас (я могу редактировать пост, если кто-нибудь знает). Может быть, это происходит только при установке, которая будет хорошей настройкой по умолчанию.
Морган Тувери Квиллинг

1
Я просто заметил , что если мы не будем использовать сокет плагин Unix для корневого пользователя, он не сможет установить пакет PhpMyAdmin на последнем Debian: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). Поэтому лучшим решением будет продолжать использовать аутентификацию сокетов Unix по умолчанию с командой sudo mysql -u root, которая, на мой взгляд, также более безопасна и эффективна.
baptx

5

Из этого ответа http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

Mysql пытается аутентифицировать root с помощью плагина, а не пароля. Вам необходимо отключить использование плагина для root.

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q

2
Это именно то, что я написал в качестве ответа.
Морган Тувери Квиллинг

1
Это немного более краткий свод с вашим обновлением.
пони

Я даже не могу получить оболочку mysql, так что в моем случае это не сработает, хотя я вижу это Could not open mysql.plugin table.в журнале ошибок.
Дейв Эверитт

0

Подключите, как описано ранее:

mysqld_safe --skip-grant-tables

Файл журнала будет показан:

160518 23:21:01 mysqld_safe Logging to '/usr/local/mysql/data/ab123456.domain.com.err'.
160518 23:21:01 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

Журнал поиска (в данном случае: /usr/local/mysql/data/ab123456.domain.com.err) для правого сокета:

cat /usr/local/mysql/data/ab123456.domain.com.err | grep "socket: "
Version: '5.5.49-MariaDB'  socket: '/tmp/mysql.sock'  port: 3306  MariaDB Server

и использовать его в соединении mysql:

mysql --socket /tmp/mysql.sock -u root
root@ab123456:~# /usr/local/mysql/bin/mysql --socket /tmp/mysql.sock -u root

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.49-MariaDB MariaDB Server

Я просто получаю, $ mysqld_safe --skip-grant-tables 190818 14:13:35 mysqld_safe Logging to '/usr/local/var/mylaptop.local.err'. 190818 14:13:35 mysqld_safe Starting mysqld daemon with databases from /usr/local/varно просто возвращаюсь к приглашению bash.
Дейв Эверитт

0

По умолчанию marriadb использует плагин аутентификации «unix_socket» для установки паролей, это должно быть «mysql_native_password», поэтому

переключить базу данных ..

use mydatabase;

Первый плагин ведьмы установлен ..

SELECT user, plugin FROM user;

установите его в "mysql_native_password"

UPDATE user SET plugin="mysql_native_password"; 

установить новый пароль ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.