Erreur MySQL:: 'Accès refusé pour l'utilisateur' root '@' localhost '

264

$ ./mysqladmin -u root -p ' caviardé '
Entrez le mot de passe:

mysqladmin: échec de la connexion au serveur à 'localhost':
'Accès refusé pour l'utilisateur' root '@' localhost '(en utilisant le mot de passe: OUI)'

Comment puis-je réparer cela?

Harsh Trivedi
la source
5
Double accès
clearlight
1
@clearlight n'est pas la même question, ce message est un problème avec mysqladmin gagner des super privilèges dans mysql, l'autre message est un problème avec une simple connexion depuis socket.
e-info128
Essayez de supprimer si le ~/.my.cnffichier existe .
e-info128
11
Je sais que c'est vieux, mais je veux dire cela pour les futurs visiteurs. N'entrez pas votre mot de passe mysql, en particulier pour root, dans la commande elle-même, sinon il sera stocké dans l'historique de votre shell. Laissez simplement l' -poption seule et mysql vous demandera un mot de passe.
Scotty C.

Réponses:

358
  1. Ouvrez et modifiez /etc/my.cnfou /etc/mysql/my.cnf, selon votre distribution.
  2. Ajouter skip-grant-tablessous[mysqld]
  3. Redémarrez Mysql
  4. Vous devriez pouvoir vous connecter à mysql maintenant en utilisant la commande ci-dessous mysql -u root -p
  5. Courir mysql> flush privileges;
  6. Définissez un nouveau mot de passe en ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
  7. Revenez à /etc/my.cnf et supprimez / commentez skip-grant-tables
  8. Redémarrez Mysql
  9. Vous pourrez désormais vous connecter avec le nouveau mot de passe mysql -u root -p
Kishore Venkataramanan
la source
6
Bonjour, j'ai eu le même problème. J'ai fait ce qui précède et cela résout le problème, mais chaque fois que je redémarre CentOS, je dois refaire toutes les étapes (j'ai le message: Accès refusé pour l'utilisateur 'root' @ 'localhost' (en utilisant le mot de passe: NO) - lors de l'exécution de la commande mysql (ou de toute commande sql) et je le fais encore et encore comme ci-dessus à chaque redémarrage.
Eitan
19
Dommage que cela ne fonctionne pas avec MariaDB:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USER 'root'@'localhost' IDENTIFIED BY 'NewPassword'' at line 1
Philipp Ludwig
11
J'ai trouvé que cela fonctionnait @PhilippLudwig set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');Je l'ai fait après l'étape 5. Voici à quoi ressemblait la sortie de mon invite de commande:MariaDB [(none)]> MariaDB [(none)]> set PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); Query OK, 0 rows affected (0.00 sec)
therobyouknow
3
Pour l'étape 3, redémarrez MariaDB: j'ai trouvé les œuvres suivantes:sudo systemctl restart mariadb
therobyouknow
7
Certains peuvent trouver le fichier dans /etc/mysql/my.cnf
DSinghvi
590

Toutes les solutions que j'ai trouvées étaient beaucoup plus complexes que nécessaire et aucune n'a fonctionné pour moi. Voici la solution qui a résolu mon problème. Pas besoin de redémarrer mysqld ou de le démarrer avec des privilèges spéciaux.

sudo mysql

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

Avec une seule requête, nous changeons l' auth_plugin en mysql_native_password et définissons le mot de passe root sur root (n'hésitez pas à le changer dans la requête)

Vous devriez maintenant pouvoir vous connecter avec root. Plus d'informations peuvent être trouvées dans la documentation mysql

(quittez la console mysql avec Ctrl + D ou en tapant exit )

user1878906
la source
41
Je ne suis pas en mesure de le faire ... "Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MariaDB pour la bonne syntaxe à utiliser près de ...".
TCB13
2
Cette réponse a fonctionné, j'ai accidentellement ajouté que la réponse n'est pas utile. Votez, excusez-moi!
taher
25
A très bien fonctionné sur Ubuntu 18.04
Almino Melo
2
@ TCB13 et toute autre personne confrontée à ce problème. "Je ne peux pas faire ça ..." Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MariaDB pour la bonne syntaxe à utiliser près de ... ". Utilisez FLUSH PRIVILEGES avant d'exécuter la commande alter
codeur
3
vous sauvez ma journée :)
xger86x
50

J'ai essayé de nombreuses étapes pour corriger ce problème. Il y a tellement de sources de solutions possibles à ce problème qu'il est difficile de filtrer le sens du non-sens. J'ai finalement trouvé une bonne solution ici :

Étape 1: identifier la version de la base de données

$ mysql --version

Vous verrez une sortie comme celle-ci avec MySQL:

$ mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

Ou une sortie comme celle-ci pour MariaDB:

mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

Notez quelle base de données et quelle version vous utilisez, car vous les utiliserez plus tard. Ensuite, vous devez arrêter la base de données pour pouvoir y accéder manuellement.

Étape 2: arrêt du serveur de base de données

Pour modifier le mot de passe root, vous devez au préalable arrêter le serveur de base de données.

Vous pouvez le faire pour MySQL avec:

$ sudo systemctl stop mysql

Et pour MariaDB avec:

$ sudo systemctl stop mariadb

Étape 3: redémarrage du serveur de base de données sans vérification des autorisations

Si vous exécutez MySQL et MariaDB sans charger d'informations sur les privilèges utilisateur, cela vous permettra d'accéder à la ligne de commande de la base de données avec les privilèges root sans fournir de mot de passe. Cela vous permettra d'accéder à la base de données sans le savoir.

Pour ce faire, vous devez empêcher la base de données de charger les tables d'octroi, qui stockent les informations de privilège utilisateur. Étant donné qu'il s'agit d'un risque pour la sécurité, vous devez également ignorer la mise en réseau pour empêcher d'autres clients de se connecter.

Démarrez la base de données sans charger les tables de droits ni activer la mise en réseau:

$ sudo mysqld_safe --skip-grant-tables --skip-networking &

L'esperluette à la fin de cette commande fera exécuter ce processus en arrière-plan afin que vous puissiez continuer à utiliser votre terminal.

Vous pouvez maintenant vous connecter à la base de données en tant qu'utilisateur root, qui ne devrait pas demander de mot de passe.

$ mysql -u root

Vous verrez immédiatement une invite de shell de base de données à la place.

Invite MySQL

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Invite MariaDB

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Maintenant que vous disposez d'un accès root, vous pouvez modifier le mot de passe root.

Étape 4: modification du mot de passe racine

mysql> FLUSH PRIVILEGES;

Maintenant, nous pouvons réellement changer le mot de passe root.

Pour MySQL 5.7.6 et plus récent ainsi que MariaDB 10.1.20 et plus récent , utilisez la commande suivante:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

Pour MySQL 5.7.5 et versions antérieures ainsi que MariaDB 10.1.20 et versions antérieures , utilisez:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

Assurez-vous de le remplacer new_passwordpar le nouveau mot de passe de votre choix.

Remarque: Si la ALTER USERcommande ne fonctionne pas, cela indique généralement un problème plus important. Cependant, vous pouvez essayer UPDATE ... SETde réinitialiser le mot de passe root à la place.

[IMPORTANT] Ceci est la ligne spécifique qui a résolu mon problème particulier:

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';

N'oubliez pas de recharger les tables de droits après cela.

Dans les deux cas, vous devriez voir la confirmation que la commande a été exécutée avec succès.

Query OK, 0 rows affected (0.00 sec)

Le mot de passe a été modifié, vous pouvez donc arrêter l'instance manuelle du serveur de base de données et le redémarrer comme il l'était auparavant.

Étape 5: redémarrer le serveur de base de données normalement

Le tutoriel va dans quelques étapes supplémentaires pour redémarrer la base de données, mais la seule pièce que j'ai utilisée était la suivante:

Pour MySQL, utilisez: $ sudo systemctl start mysql

Pour MariaDB, utilisez:

$ sudo systemctl start mariadb

Vous pouvez maintenant confirmer que le nouveau mot de passe a été appliqué correctement en exécutant:

$ mysql -u root -p

La commande doit maintenant demander le nouveau mot de passe attribué. Entrez-le et vous devriez avoir accès à l'invite de base de données comme prévu.

Conclusion

Vous avez maintenant un accès administratif au serveur MySQL ou MariaDB restauré. Assurez-vous que le nouveau mot de passe root que vous choisissez est solide et sécurisé et conservez-le en lieu sûr.

Blairg23
la source
1
L'instruction ALTER USER a été introduite dans MariaDB 10.2.0.
Benoit Desrosiers
2
Hou la la ! cette ligne même mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';m'a sauvé la vie!
lucyjosef
36

Aucune des réponses ci-dessus ne m'a aidé à résoudre ce problème, voici donc la solution que j'ai trouvée .

La partie pertinente:

Dans les systèmes Ubuntu exécutant MySQL 5.7 (et versions ultérieures), l'utilisateur racine MySQL est configuré pour s'authentifier en utilisant le plugin auth_socket par défaut plutôt qu'avec un mot de passe. Cela permet une plus grande sécurité et convivialité dans de nombreux cas, mais cela peut également compliquer les choses lorsque vous devez autoriser un programme externe (par exemple, phpMyAdmin) à accéder à l'utilisateur.

Afin d'utiliser un mot de passe pour vous connecter à MySQL en tant que root, vous devrez basculer sa méthode d'authentification de auth_socket vers mysql_native_password. Pour ce faire, ouvrez l'invite MySQL depuis votre terminal:

sudo mysql

Ensuite, vérifiez quelle méthode d'authentification chacun de vos comptes d'utilisateurs MySQL utilise avec la commande suivante:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Production

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

Dans cet exemple, vous pouvez voir que l'utilisateur root s'authentifie en fait à l'aide du plugin auth_socket. Pour configurer le compte root pour s'authentifier avec un mot de passe, exécutez la commande ALTER USER suivante. Assurez-vous de changer le mot de passe en un mot de passe fort de votre choix et notez que cette commande changera le mot de passe root que vous avez défini à l'étape 2:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Ensuite, exécutez FLUSH PRIVILEGES qui indique au serveur de recharger les tables de droits et de mettre vos nouvelles modifications en vigueur:

FLUSH PRIVILEGES;

Vérifiez à nouveau les méthodes d'authentification utilisées par chacun de vos utilisateurs pour confirmer que root ne s'authentifie plus à l'aide du plugin auth_socket:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Production

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

Vous pouvez voir dans cet exemple de sortie que l'utilisateur MySQL racine s'authentifie désormais à l'aide d'un mot de passe. Une fois que vous avez confirmé cela sur votre propre serveur, vous pouvez quitter le shell MySQL:

exit

sonrad10
la source
27

Pour les utilisateurs d'Ubuntu / Debian

( peut fonctionner sur d'autres distributions, en particulier celles basées sur Debian)

Exécutez ce qui suit pour vous connecter en tant que root(sans mot de passe)

sudo /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf

Si vous ne souhaitez pas ajouter --defaults-filechaque fois que vous souhaitez vous connecter en tant que root, vous pouvez copier /etc/mysql/debian.cnfdans votre répertoire personnel:

sudo cp /etc/mysql/debian.cnf ~/.my.cnf

puis:

sudo mysql
Fab
la source
2
C'était tout ce qu'il fallait. 'root' n'est pas 'root' sur Ubuntu par défaut, apparemment.
Chaim Eliyah
21

Après avoir essayé toutes les autres réponses, c'est ce qui a finalement fonctionné pour moi

sudo mysql -- It does not ask me for any password

-- Then in MariaDB/MySQL console:
update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;
exit;

J'ai trouvé la réponse dans cet article: https://medium.com/@chiragpatel_52497/solved-error-access-denied-for-user-root-localhost-of-mysql-programming-school-6e3611838d06

Pico12
la source
1
CETTE LIGNE DE PLUGIN EST VRAIMENT UTILE. J'ai essayé beaucoup de compilations mais c'est la seule qui fonctionnait pour Ver 14.14 Distrib 5.7.27, pour Linux (x86_64)
AlexNikonov
2
Cela m'a également aidé avec mysql 5.7. Donc applicable non seulement pour mariadb
podarok
Je viens de l'utiliser sur MySQL 8 Ubuntu 20.04 et cela a fonctionné. Les autres réponses utilisant skip-grant-table(my.conf ou in mysqlcommand) n'ont pas fonctionné. J'ai pu entrer en utilisant un compte de service ( askubuntu.com/a/120769/169836 ) mais cela UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';n'a pas fonctionné. Ce n'est que lors de l'utilisation de la partie plug-in que les choses ont fonctionné. Merci ~
hamx0r
16

Pour les nouveaux utilisateurs de Linux, cela pourrait être une tâche intimidante. Permettez-moi de mettre à jour cela avec mysql 8 (la dernière version disponible actuellement est la 8.0.12 comme le 12-Sep-2018)

  1. Ouvrez le fichier de configuration "mysqld.cnf" dans "/etc/mysql/mysql.conf.d/".
  2. Ajoutez skip-grant-tables à la ligne suivante de texte [mysql] et enregistrez.
  3. Redémarrez le service mysql en tant que "sudo service mysql restart". Maintenant, votre mysql est libre de toute authentification.
  4. Connectez-vous au client mysql (également appelé mysql-shell) en tant que mysql -u root -p . Il n'y a pas de mot de passe à saisir pour l'instant.
  5. exécuter les privilèges de vidage de la commande sql ;
  6. Réinitialisez le mot de passe maintenant comme ALTER USER 'root' @ 'localhost' IDENTIFIED BY 'MyNewPassword';
  7. Revenons maintenant à l'état normal; supprimez cette ligne "skip-grant-tables" de "mysqld.cnf" et redémarrez le service.

C'est tout.

Amit Kr
la source
5

Dans votre plan de travail MySQL, vous pouvez aller dans la barre latérale gauche, sous Gestion, sélectionnez "Utilisateurs et privilèges", cliquez sur root sous Comptes d'utilisateurs, dans la section de droite, cliquez sur l'onglet "Limites de compte" pour augmenter le nombre maximal de requêtes, de mises à jour, etc., et puis cliquez sur l'onglet "Rôles administratifs" et cochez les cases pour donner l'accès au compte. J'espère que cela pourra aider!

Colleen Purcell
la source
4

J'ai fait cela pour définir mon mot de passe root dans la configuration initiale de MySQL dans OSx. Ouvrez un terminal.

sudo sh -c 'echo /usr/local/mysql/bin > /etc/paths.d/mysql'

Fermez le terminal et ouvrez un nouveau terminal. Et les suivis sont effectués sous Linux, pour définir le mot de passe root.

sudo /usr/local/mysql/support-files/mysql.server stop
sudo mysqld_safe --skip-grant-tables

(sudo mysqld_safe --skip-grant-tables: Cela n'a pas fonctionné pour moi la première fois. Mais le deuxième essai a été un succès.)

Connectez-vous ensuite à MySQL

mysql -u root

FLUSH PRIVILEGES;

Maintenant changez le mot de passe:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

Redémarrez MySQL:

sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server start
Sadee
la source
3

Dans mon cas sous Debian 10, l'erreur

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

a été résolu par (GOOD WAY)

sudo mysql -u root -p mysql

MAUVAISE VOIE:

mysql -u root -p mysql
klor
la source
3

Ugh- rien n'a fonctionné pour moi! J'ai une machine CentOS 7.4 exécutant mariadb 5.5.64.

Ce que je devais faire était ceci, juste après l'installation de mariadb de miam;

# systemctl restart mariadb
# mysql_secure_installation

Le mysql_secure_installationvous guidera à travers un certain nombre d'étapes, y compris "Définir le mot de passe root? [O / n]". Dites simplement "y" et donnez-lui un mot de passe. Répondez aux autres questions comme vous le souhaitez.

Ensuite, vous pouvez entrer avec votre mot de passe, en utilisant

# mysql -u root -p

Il survivra

# systemctl restart mariadb

La clé

Ensuite, j'ai vérifié le /bin/mysql_secure_installationcode source pour découvrir comment il était magiquement capable de changer le mot de passe root et aucune des autres réponses ici ne le pouvait. Le bit d'importation est:

do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';"

... Ça dit SET Password=...et non SET authentication_string = PASSWORD.... Ainsi, la procédure appropriée pour cette version (5.5.64) est:

login using mysql -u root -p , using the password you already set.
Or, stop the database and start it with:
mysql_safe --skip-grant-tables --skip-networking &

Depuis l'invite mysql>:

use mysql;
select host,user,password from user where user = 'root';
(observe your existing passwords for root).
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root' AND host = 'localhost';
select host,user,password from user where user = 'root';
flush privileges;
quit;

tuer le mysqld_safe en cours d'exécution. redémarrez mariadb. Connectez - vous en tant que root: mysql -u -p. Utilisez votre nouveau mot de passe.

Si vous le souhaitez, vous pouvez définir tous les mots de passe root à la fois. Je pense que c'est sage:

mysql -u root -p
(login)
use mysql;
select host,user,password from user where user = 'root';
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root';
select host,user,password from user where user = 'root';
flush privileges;
quit;

Cela effectuera des mises à jour sur tous les mots de passe root: par exemple, pour "localhost", "127.0.0.1" et ":: 1"

À l'avenir, quand je vais sur RHEL8 ou quoi d'autre, j'essaierai de me souvenir de vérifier l'installation / bin / mysql_secure_installation et de voir comment les gars l'ont fait, qui ont configuré mariadb pour ce système d'exploitation.

Mike S
la source
2

Si vous êtes comme moi et que toutes les suggestions ci-dessus ont échoué, désinstallez toutes les versions de mysql sur votre machine, recherchez tous les fichiers mysql restants à l'aide de cette commande sudo find / -name "mysql"et rm -rfchaque fichier ou répertoire avec le nom mysql attaché (vous devez ignorer les fichiers liés aux bibliothèques de langages de programmation). Installez maintenant une nouvelle version de MySQL et profitez-en. NB: Vous perdrez toutes vos données, alors pesez d'abord vos options.

Michael Ogala
la source
1

Cela peut arriver si vous n'avez pas assez de privilèges. Tapez su, entrez le mot de passe root et réessayez.

vitaly goji
la source
1

D'accord, je sais que c'est un vieux fil de discussion, mais si vous avez atteint cette page via Google comme je l'ai fait et qu'aucune des solutions ci-dessus n'a fonctionné, ce qui s'est avéré être l'erreur était à 100% une folie de ma part. Je ne me suis pas connecté au serveur. Une fois connecté, tout s'est bien passé.

Au cas où cela aiderait à connaître ma configuration, j'utilise Sequel Pro et j'essaie de me connecter avec Node en utilisant le package NPM, mysql. Je ne pensais pas que je devais réellement me connecter (à part exécuter Sequel Pro) parce que je le faisais déjà depuis mon application.

entrez la description de l'image ici

Mix Master Mike
la source
0

Solution: abandonnez!

Écoutez-moi, j'ai passé environ deux jours entiers à essayer de faire fonctionner MySQL en vain, toujours coincé avec des erreurs de permission, dont aucune n'a été corrigée par les réponses dans ce fil. C'est arrivé au point que je pensais que si je continuais, je deviendrais fou.

Par patience pour le faire fonctionner, j'ai envoyé la commande pour installer SQLite, en utilisant seulement 450 Ko, et cela a fonctionné parfaitement dès le départ.

Si vous n'avez pas la patience d'un saint, optez pour SQLite et économisez beaucoup de temps, d'efforts, de douleur et d'espace de stockage ..!

ArraysStartAt1
la source