40 votes

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

Aujourd'hui, j'ai voulu 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 incorrect. Et je ne comprends pas pourquoi.

J'ai essayé la méthode habituelle pour réinitialiser le mot de passe root (monter les tables de privilèges et réinitialiser le mot de passe) mais il semble que ça ne fonctionne pas.

Voici :

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): Accès refusé pour l'utilisateur 'root'@'localhost'

62voto

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

Redémarrez MySQL/MariaDB en utilisant --skip-grant-tables (recherchez des tutoriels sur le web). (pas du tout nécessaire, lisez mes modifications à la fin de la publication)

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 |
+------+-------------+

J'ai dû réinitialiser le champ plugin de chaque entrée en une chaîne vide.

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

Assurez-vous également qu'un mot de passe est défini, car parfois il semble être effacé (sélectionnez sur les champs user, password). Si ce n'est pas le cas, mettez à jour avec :

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

Les paramètres de privilèges doivent être sauvegardé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 la réparation de mon MySQL, dans PMA, je peux voir que la connexion est établie via un socket Unix.

MODIFICATION, quelques mois plus tard : Je suis maintenant habitué à ce que ce problème revienne fréquemment, je pense à chaque mise à jour de MariaDB (ou quelque chose comme ça). Donc j'ai une meilleure compréhension du problème ; il y a un plugin 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 plugin d'authentification 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 l'effet secondaire intéressant 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 root du système, puis connectez-vous avec mysql -u root sans mot de passe, puis réinitialisez le champ plugin de la manière expliquée ci-dessus.

MODIFICATION 2: Confirmé, cela se produit à chaque mise à jour de MariaDB sur Ubuntu.

6voto

xDG Points 123

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

Mysql essaie d'authentifier root en utilisant le plugin, pas le mot de passe. Vous devez désactiver l'utilisation du plugin pour root.

shell$ sudo mysql -u root

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

1voto

Connectez-vous comme décrit précédemment :

mysqld_safe --skip-grant-tables

Le fichier journal s'affichera :

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

Recherchez le journal listé (dans ce cas : /usr/local/mysql/data/ab123456.domain.com.err) pour le bon socket :

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 utilisez-le 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

0voto

André Verwijs Points 151

Par défaut, mariadb utilise le plugin d'authentification "unix_socket" pour définir les mots de passe, cela devrait être "mysql_native_password" donc

changer de base de données..

use mydatabase;

voir d'abord quel plugin est défini..

SELECT utilisateur, plugin FROM utilisateur;

définir le plugin sur "mysql_native_password"

UPDATE utilisateur SET plugin="mysql_native_password"; 

définir un nouveau mot de passe...

update utilisateur set authentication_string=password('My@Password'), plugin='mysql_native_password' where utilisateur='root';

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X