web-dev-qa-db-fra.com

Impossible de réinitialiser le mot de passe root MySQL (MariaDB)

Aujourd'hui, je voulais créer une base de données dans PMA. Il disait: "Impossible de se connecter au serveur MySQL". J'ai essayé via un terminal, même problème, et c'est parce que mon mot de passe est erroné. Et je ne comprends pas pourquoi.

J'ai essayé la méthode habituelle pour réinitialiser le mot de passe root (ignorer le montage des tables d'attribution et réinitialiser le mot de passe), mais il semble que cela ne fonctionne pas.

Regarde ça:

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'
33

J'ai trouvé une solution aussi étrange que le problème lui-même.

Redémarrez MySQL/MariaDB avec --skip-grant-tables (recherchez des tutoriels sur le Web). (pas nécessaire du tout, lisez mes modifications à la fin du post)

Regardez le champ plugin dans la table mysql.user:

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

Je devais réinitialiser le champ plug-in de chaque entrée en une chaîne vide.

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

Assurez-vous également qu’un mot de passe est défini, car il semble parfois l’effacer (sélectionnez-le dans les champs user, password). Sinon, mettez-le à jour avec:

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

Les paramètres de privilèges doivent être enregistrés explicitement:

FLUSH PRIVILEGES;

Ensuite, redémarrez MySQL en mode normal et vous devriez pouvoir vous connecter au compte root.

Cela ne désactivera pas nécessairement la connexion via le socket Unix. Après réparation de mon MySQL va, dans PMA, je peux voir que la connexion est établie via un socket Unix.

EDIT, quelques mois plus tard: ce problème me revient souvent, je pense à chaque mise à jour de MariaDB (ou quelque chose comme ça). J'ai donc une meilleure compréhension du problème. Il existe un plug-in UNIX_SOCKET qui peut vous permettre de vous connecter à un compte MariaDB sans avoir à créer de mot de passe, car il utilise les informations d'identification du shell pour vous faire confiance, sans avoir à entrer de mot de passe. En fait, ce plugin est un authentication plugin et non une méthode de communication avec le serveur SQL. Vous pouvez donc le désactiver en toute sécurité si vous n'utilisez pas le socket Unix comme méthode de connexion. La seule chose que je ne peux pas expliquer, c'est pourquoi le plugin UNIX_SOCKET est régulièrement défini sur chaque compte de la base de données, sans aucune action de ma part.

Cela a pour effet de Nice que, lorsque cela se produit, vous pouvez vous connecter au serveur SQL sans avoir à redémarrer MariaDB avec --skip-grant-tables: connectez-vous simplement au compte racine du système, puis connectez-vous simplement avec mysql -u root sans mot de passe, puis réinitialisez le champ du plugin. de la manière expliquée ci-dessus.

EDIT 2: Confirmé, cela se produit lors de chaque mise à niveau de MariaDB sous Ubuntu.

52

À partir de cette réponse, http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

Mysql tente d'authentifier la racine en utilisant un plugin, pas un mot de passe. Vous devez désactiver l'utilisation du plug-in pour root.

Shell$ Sudo mysql -u root

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

Par défaut, marriadb utilise le plug-in d'authentification "unix_socket" pour définir les mots de passe. Il doit s'agir de "mot_passe_natif_sql", donc

changer de base de données ..

use mydatabase;

voir d'abord le plugin Witch is set ..

SELECT user, plugin FROM user;

réglez-le sur "mysql_native_password"

UPDATE user SET plugin="mysql_native_password"; 

définir un nouveau mot de passe ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
0
André Verwijs

Connectez comme décrit précédemment:

mysqld_safe --skip-grant-tables

Le fichier de log sera montré:

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

Journal de recherche répertorié (dans ce cas: /usr/local/mysql/data/ab123456.domain.com.err) pour le socket droit:

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

et l'utiliser dans la connexion 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
0