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


35

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'

Réponses:


56

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 nécessaire du tout, lisez mes modifications à la fin du post)

Regardez le pluginchamp dans la mysql.usertable:

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 qu’il soit effacé (sélectionnez un user, passwordchamp). 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: je suis maintenant habitué à ce que ce problème revienne fréquemment, 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 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 plug-in 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 secondaire de vous permettre de vous connecter au serveur SQL sans redémarrer MariaDB avec --skip-grant-tables: connectez-vous simplement au compte root du système, puis connectez-vous simplement mysql -u rootsans mot de passe, puis réinitialisez le champ comme il est expliqué ci-dessus.

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


1
Cela interrompt (au moins) le travail périodique de maintenance sur Ubuntu 16.04 car ce script s'attend à se connecter sans mot de passe à l'aide du plug-in de socket. Voir superuser.com/questions/957708/… pour plus de détails.
colan

Ok, intéressant, mais cela ne se produit plus (la configuration de mes mots de passe hérités ne se casse pas de manière aléatoire maintenant). Peut-être que le plug-in socket Unix est défini sur l'utilisateur root uniquement, maintenant? Impossible de vérifier cela maintenant. Mais je n'aime pas l'idée que le système d'exploitation décide pour moi quelle configuration d'authentification utiliser.
Morgan Touverey Quilling

Ce problème est nul, cela est arrivé sous Debian 9, aucun mot de passe root n’a été demandé lors de l’installation de MariaDB et je ne pouvais même pas le réinitialiser. J'espère que cela ne se reproduira plus après une mise à niveau. Devrions-nous remplacer MariaDB par MySQL pour éviter de tels problèmes?
baptx

Je ne suis pas sûr que cela se produise, cela a peut-être été corrigé maintenant (je peux éditer le message si quelqu'un le sait) Peut-être que cela ne se produit que lors de l'installation, ce qui serait une bonne configuration par défaut.
Morgan Touverey Quilling

1
Je viens de remarquer que si nous ne pas utiliser le plug - in socket unix pour l'utilisateur root, il ne parviendra pas à installer le paquet phpmyadmin sur le dernier Debian: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). La meilleure solution est donc de continuer à utiliser l’authentification de socket unix par défaut avec commande sudo mysql -u root, ce qui, à mon avis, est également plus sûr et plus performant.
baptx

5

A 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

2
C'est exactement ce que j'ai posté comme réponse.
Morgan Touverey Quilling

1
C'est un cumul légèrement plus concis avec votre mise à jour.
Poneys

Je ne peux même pas obtenir un shell mysql, donc cela ne fonctionnera pas dans mon cas, même si je vois Could not open mysql.plugin table.dans le journal des erreurs.
Dave Everitt

0

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 de droite:

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

Je viens de recevoir $ 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/varmais je suis simplement renvoyé à l'invite bash.
Dave Everitt

0

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;

d'abord voir le plugin est réglé ..

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';
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.