mysql (mariadb) ERREUR 1698 (28000): accès refusé à l'utilisateur 'root' @ 'localhost'

23

Je travaille sur Xubuntu 15.04. J'ai déjà installé le MariaDB-Server sur différents systèmes et on m'a toujours demandé un mot de passe root lors de l'installation. Cette fois, cependant, je ne me souviens pas qu'on m'ait demandé le mot de passe. Lorsque j'essaie de me connecter sans mot de passe (ou mot de passe vide), j'obtiens l' Access denied for user 'root'@'localhost'erreur. J'ai essayé de désinstaller complètement le package par

sudo apt-get remove mariadb-server
sudo apt-get purge mariadb-server

Quand j'ai réinstallé, on ne m'a toujours pas demandé le mot de passe root.

J'ai essayé l' mysqld --skip-grant-tablesapproche de mysql pour réparer l'accès refusé pour l'utilisateur 'root' @ 'localhost' . Je peux modifier le mot de passe de l'utilisateur root dans la base de données mysql - au moins la valeur de hachage change - mais je ne peux toujours pas me connecter avec le nouveau mot de passe après un redémarrage du serveur mysql. Je reçois toujours la même erreur.

L'utilisateur debian-sys-maint n'existe pas. Donc, je ne peux pas l'utiliser pour réparer quoi que ce soit.

Des idées quoi d'autre que je pourrais essayer?

d72b617c
la source
Un fil utile avec la même question sur StackOverflow: stackoverflow.com/questions/39281594/…
Kevin - Reinstate Monica

Réponses:

36

Vous devez réinitialiser le mot de passe. donc pour ça

sudo mysql -u root
use mysql;
update user set plugin='' where User='root';
flush privileges;
exit;
Abhinav bhardwaj
la source
9
La «magie» non évidente de cette approche est que l'utilisateur du système d'exploitation racine peut se connecter à la base de données sans avoir à spécifier de mot de passe car il plugin: auth_socketest activé par défaut. En d'autres termes, il n'est pas nécessaire d'utiliser --skip-grant-tablescomme cela aurait été nécessaire dans les versions antérieures de MySQL. (Aussi, techniquement, cette mesure ne consiste pas à "réinitialiser le mot de passe"; elle désactive un plugin.)
Ben Johnson
1
+1, pouvez-vous expliquer pourquoi?
A1Gard
4
Cette approche posera des problèmes plus tard. Si vous désactivez le plug-in, le travail cron quotidien sera interrompu car il suppose qu'il peut se connecter avec ce plug-in. Voir ma réponse pour plus de détails.
colan
11

L'idée avec la nouvelle configuration est que vous ne devriez pas du tout utiliser de mots de passe. Voir Plug - in d'authentification UNIX_SOCKET pour plus de détails.

Ce qui est particulièrement pertinent, c'est le contenu de /usr/share/doc/mariadb-server-10.0/README.Debian.gz sur Ubuntu 16.04:

Sur les nouvelles installations, aucun mot de passe root n'est défini et aucun utilisateur debian-sys-maint n'est plus créé. Au lieu de cela, le compte root MariaDB est configuré pour être authentifié à l'aide de la socket unix, par exemple, toute invocation mysqld par root ou via sudo permettra à l'utilisateur de voir l'invite mysqld.

Vous ne pouvez jamais supprimer l'utilisateur "root" de mysql. Bien qu'il n'ait pas de mot de passe défini, le plugin unix_auth garantit qu'il ne peut être exécuté que localement en tant qu'utilisateur root.

Les informations d'identification dans /etc/mysql/debian.cnf spécifient l'utilisateur qui est utilisé par les scripts d'initialisation pour arrêter le serveur et effectuer la rotation de journal. Il s'agissait de l'utilisateur debian-sys-maint qui n'est plus utilisé car root peut s'exécuter directement.

Donc, si vous désactivez ce plug-in pour root et définissez un mot de passe, le travail cron quotidien sera interrompu car il suppose qu'il se connectera en tant que root sans mot de passe, mais avec le plug-in.

Plus tard, il dit:

Les scripts doivent s'exécuter en tant qu'utilisateur disposant des autorisations requises et être identifiés via unix_socket.

Il semble donc que les mots de passe ne devraient plus être utilisés par les applications.

colan
la source
1
Je viens de rencontrer le problème que vous décrivez: l' "So if you disable that plug-in for root and set a password, the daily cron job will break as it's assuming it will log in as root without a password..."implication non évidente du plug-in d'authentification UNIX_SOCKET en cours d'activation (qui est maintenant la valeur par défaut) est que sa capacité à s'authentifier en tant qu'utilisateur de la base de données racine avec un mot de passe est désactivée. Nulle part sur mariadb.com/kb/en/mariadb/unix_socket-authentication-plugin n'est mentionnée cette limitation considérable. En conséquence, il est impossible de se connecter en tant que root, par exemple via SSH.
Ben Johnson
2

J'ai résolu le problème suite à la réponse de ce post:

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

Il faut changer le champ du plugin de mysql.user pour toutes les racines en une chaîne vide.

d72b617c
la source
Ce problème est décrit ici: percona.com/blog/2016/03/16/…
antonu17
3
Cette approche posera des problèmes plus tard. Si vous désactivez le plug-in, le travail cron quotidien sera interrompu car il suppose qu'il peut se connecter avec ce plug-in. Voir ma réponse pour plus de détails.
colan
1

Je l'ai fait en exécutant cette commande, juste après l'installation:

$ sudo mysql_secure_installation

À la première étape, le mot de passe est vide, appuyez simplement sur Entrée.

dxvargas
la source
1
Ce n'est pas vide s'il est déjà défini, ce que mon pw oublié est ... donc je ne peux toujours pas me connecter
Dave Everitt
0

J'ai eu le même problème sur un raapberry pi avec stretch. Ma solution était de créer un nouvel utilisateur avec tous les privilèges en procédant comme suit:

sudo mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root

MariaDB [(none)]> use mysql
MariaDB [mysql]> FLUSH PRIVILEGES;
GRANT ALL privileges ON mysql.* TO 'admin'@'localhost' with grant option;

Maintenant, je peux me connecter et nous utiliser "admin" en tant que superutilisateur.

J'espère que cela va aider quelqu'un.

trasba
la source
0

Utilisez simplement sudo mysql -u root- c'est tout


Détails: Les versions plus récentes s'authentifient auprès de mysql à l'aide de l'authentification système. Donc, si vous pouvez utiliser sudo sur le système d'exploitation, cela suppose que vous êtes également root db. Vous pouvez le confirmer en émettant sudo mysql -u root -e "USE mysql; SELECT User, Host, plugin FROM mysql.user;". Vous devriez voir quelque chose comme ça (peut-être avec auth_socketdans d'autres distributions)

+------+-----------+-------------+
| User | Host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket |
+------+-----------+-------------+
DeepSpace101
la source
Je suis connecté en tant que root, mais pour moi, cette commande veut toujours le mot de passe root de MariaDB… que j'ai oublié :-(
Dave Everitt