33

Сегодня я хотел создать базу данных в 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'

4 ответа4

51

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

Перезагрузите 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.

4

Из этого ответа 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
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';
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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .