ERREUR MySQL 1045 (28000): Accès refusé pour l'utilisateur 'bill' @ 'localhost' (en utilisant le mot de passe: OUI)

430

Permettez-moi d'abord de mentionner que j'ai parcouru de nombreuses questions suggérées et que je n'ai trouvé aucune réponse pertinente. Voici ce que je fais.

Je suis connecté à mon instance Amazon EC2. Je peux me connecter avec MySQL root avec cette commande:

mysql -u root -p

J'ai ensuite créé une nouvelle facture utilisateur avec l'hôte%

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

Accordé tous les privilèges à la facture utilisateur:

grant all privileges on *.* to 'bill'@'%' with grant option;

Ensuite, je quitte l'utilisateur root et j'essaye de me connecter avec bill:

mysql -u bill -p

entré le bon mot de passe et obtenu cette erreur:

ERREUR 1045 (28000): accès refusé pour l'utilisateur 'facture' @ 'localhost' (en utilisant le mot de passe: OUI)

Ali
la source
34
Et vous FLUSH PRIVILEGES?
eggyal
6
D'accord, j'ai essayé sans succès. Toute autre suggestion s'il vous plaît.
Ali
1
Quelle version du serveur utilisez-vous? J'ai vu 5.1 se comporter bizarrement à ce sujet.
Poodlehat
2
Cela m'est arrivé lors de l'installation de Magento et j'ai fait une erreur beaucoup plus stupide. Mettre 'mysql -u magento -p magento' me
demandait
2
@authentictech malheureusement, aucune des solutions suggérées ne fonctionnait pour moi au moment où cette question a été publiée. Veuillez voir ma propre réponse qui m'a aidé à sortir de cette situation. C'est la raison pour laquelle je n'ai marqué aucun d'entre eux comme réponse. Je peux probablement marquer la réponse la mieux classée comme réponse.
Ali

Réponses:

442

Vous avez probablement un utilisateur anonyme ''@'localhost'ou ''@'127.0.0.1'.

Selon le manuel :

Lorsque plusieurs correspondances sont possibles, le serveur doit déterminer laquelle utiliser. Il résout ce problème comme suit: (...)

  • Lorsqu'un client tente de se connecter, le serveur examine les lignes [de la table mysql.user] dans l'ordre trié.
  • Le serveur utilise la première ligne qui correspond au nom d'hôte client et au nom d'utilisateur.

(...) Le serveur utilise des règles de tri qui ordonnent d'abord les lignes avec les valeurs d'hôte les plus spécifiques . Les noms d'hôtes littéraux [tels que «localhost»] et les adresses IP sont les plus spécifiques.

Par conséquent, un tel utilisateur anonyme "masquerait" tout autre utilisateur comme '[any_username]'@'%'lors de la connexion localhost.

'bill'@'localhost'correspond 'bill'@'%', mais correspondrait (par exemple) ''@'localhost'au préalable.

La solution recommandée est de supprimer cet utilisateur anonyme (c'est généralement une bonne chose à faire de toute façon).


Les modifications ci-dessous ne concernent généralement pas la question principale. Ceux-ci sont uniquement destinés à répondre à certaines questions soulevées dans d'autres commentaires de ce fil.

Modifier 1

Authentification comme 'bill'@'%'via une prise.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    Bienvenue sur le moniteur MySQL (...)

    mysql> SELECT utilisateur, hôte FROM mysql.user;
    + ------ + ----------- +
    | utilisateur | hôte |
    + ------ + ----------- +
    | facture | % |
    | racine | 127.0.0.1 |
    | racine | :: 1 |
    | racine | localhost |
    + ------ + ----------- +
    4 lignes en jeu (0,00 sec)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | UTILISATEUR () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | facture @% |
    + ---------------- + ---------------- +
    1 rangée dans l'ensemble (0,02 sec)

    mysql> AFFICHER LES VARIABLES COMME 'skip_networking';
    + ----------------- + ------- +
    | Nom_variable | Valeur |
    + ----------------- + ------- +
    | skip_networking | ON |
    + ----------------- + ------- +
    1 rangée en jeu (0,00 sec)

Modifier 2

Exactement la même configuration, sauf que j'ai réactivé la mise en réseau et que je crée maintenant un utilisateur anonyme ''@'localhost'.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    Bienvenue sur le moniteur MySQL (...)

    mysql> CREATE USER '' @ 'localhost' IDENTIFIED BY 'anotherpass';
    Requête OK, 0 lignes affectées (0,00 sec)

    mysql> Au revoir

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / tmp / mysql-5.5.sock
    ERREUR 1045 (28000): accès refusé pour l'utilisateur 'facture' @ 'localhost' (en utilisant le mot de passe: OUI)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol = TCP
    ERREUR 1045 (28000): accès refusé pour l'utilisateur 'facture' @ 'localhost' (en utilisant le mot de passe: OUI)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = TCP
    ERREUR 1045 (28000): accès refusé pour l'utilisateur 'facture' @ 'localhost' (en utilisant le mot de passe: OUI)

Modifier 3

Même situation que dans l'édition 2, fournissant maintenant le mot de passe de l'utilisateur anonyme.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    Bienvenue sur le moniteur MySQL (...)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | UTILISATEUR () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | @localhost |
    + ---------------- + ---------------- +
    1 rangée dans l'ensemble (0,01 sec)

Conclusion 1, de l'édition 1: On peut s'authentifier comme 'bill'@'%'via une socket.

Conclusion 2, de l'édition 2: Que l'on se connecte via TCP ou via un socket n'a aucun impact sur le processus d'authentification (sauf que l'on ne peut pas se connecter comme n'importe qui d'autre mais 'something'@'localhost'via un socket, évidemment).

Conclusion 3, de l'édition 3: Bien que je l'ai spécifié -ubill, j'ai obtenu l'accès en tant qu'utilisateur anonyme. Cela est dû aux "règles de tri" indiquées ci-dessus. Notez que dans la plupart des installations par défaut, un utilisateur anonyme sans mot de passe existe (et doit être sécurisé / supprimé).

RandomSeed
la source
9
Pour toute personne curieuse de savoir pourquoi 'bill' @ 'localhost' correspond à '' @ 'localhost' comme je l'étais, une chaîne vide agit effectivement comme un joker dans l'algorithme d'authentification de MySQL.
Dean Or
2
@Sanja Soyez extrêmement prudent avec cette solution de contournement. Vous pouvez autoriser un accès anonyme à votre base de données depuis n'importe quel endroit. En cas de doute, je préfère supprimer l'utilisateur.
RandomSeed du
7
@RandomSeed Merci pour ce commentaire! Je devrais probablement supprimer un utilisateur anonyme. PS J'ai trouvé dev.mysql.com/doc/refman/5.1/en/default-privileges.html qui dit que ces utilisateurs peuvent sûrement être supprimés: DROP USER ''@'localhost';. Ils ne sont pas nécessaires à un usage particulier.
Alex
1
J'ai abandonné l'utilisateur anonyme, mais les choses ne fonctionnaient toujours pas. Ensuite, j'ai trouvé que je devais également émettre "PRIVILÈGES DE RINÇAGE". Il serait utile de le mentionner également.
Neeme Praks
2
Voilà la réponse! Pourquoi cela ne vient-il pas en majuscules gras dans chaque manuel mysql. SUPPRIMEZ L'UTILISATEUR ANONYME OU IL TUERA TOUTES VOS TENTATIVES DE CONNEXION DE LOCALHOST!
Sergei
140

Essayer:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
Edgar Aviles
la source
10
C'est assez dangereux, si quelqu'un pirate votre compte billq @ localhost mysql, il aura un accès infini à toutes les bases de données de votre serveur mysql.
Adonis K. Kakoulidis
2
Whehey. J'ai dû mettre un devis autour de mon utilisateur 'myusername'@'myhost.static.myip.com' puis cela a fonctionné.
bendecko
Cela fonctionne pour moi mais j'ai bien peur de donner trop de privilèges à l'utilisateur
Csaba Toth
1
@CsabaToth que vous avez fait, réduisez à nouveau les privilèges jusqu'à ce que votre utilisateur ait ce dont il a besoin et pas plus.
2015
... et que faites-vous si cela vous donne "Accès refusé pour l'utilisateur 'root' @ 'localhost' (en utilisant le mot de passe: OUI)" alors?
Grunion Shaftoe
75

Quand tu as couru

mysql -u bill -p

et a obtenu cette erreur

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

mysqld attend que vous vous connectiez en tant que bill@localhost

Essayez de créer bill@localhost

CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;

Si vous souhaitez vous connecter à distance, vous devez spécifier le nom DNS, l'adresse IP publique ou 127.0.0.1 à l'aide de TCP / IP:

mysql -u bill -p -hmydb@mydomain.com
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP

Une fois connecté, veuillez exécuter ceci

SELECT USER(),CURRENT_USER();

USER () indique comment vous avez tenté de vous authentifier dans MySQL

CURRENT_USER () indique comment vous avez été autorisé à vous authentifier dans MySQL à partir de la table mysql.user

Cela vous donnera une meilleure vue de comment et pourquoi vous avez été autorisé à vous connecter à mysql. Pourquoi est-il important de connaître ce point de vue? Cela a à voir avec le protocole de commande de l'authentification des utilisateurs.

Voici un exemple: je vais créer un utilisateur anonyme sur mon bureau MySQL

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)

mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| x       | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
|         | %         |
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql>

OK, regardez-moi me connecter en tant qu'utilisateur anonyme:

C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> select user(),current_user();
+---------------+----------------+
| user()        | current_user() |
+---------------+----------------+
| rol@localhost | @%             |
+---------------+----------------+
1 row in set (0.00 sec)

mysql>

La commande d'authentification est très stricte. Il vérifie du plus spécifique au moins. J'ai écrit sur ce style d'authentification dans le DBA StackExchange .

N'oubliez pas d'appeler explicitement TCP comme protocole pour le client mysql lorsque cela est nécessaire.

RolandoMySQLDBA
la source
1
'bill'@'localhost'devrait correspondre 'bill@%', non?
RandomSeed
@Yak l'ordre de tri n'est pas basé uniquement sur la colonne utilisateur mysql.user. MySQL ne fait aucune correspondance de caractères en soi. J'ai écrit sur le protocole de commande d'authentification des utilisateurs dans le DBA StackExchange: dba.stackexchange.com/a/10897/877
RolandoMySQLDBA
@YaK C'est pourquoi j'ai mentionné spécifiquement SELECT USER(),CURRENT_USER();. Vous ne voyez presque jamais d'utilisateurs anonymes apparaître à partir de ces deux fonctions, sauf dans des configurations vraiment médiocres.
RolandoMySQLDBA
1
Je n'ai jamais supposé que l'ordre de tri était basé uniquement sur mysql.user. En fait, si vous relisez ma réponse, vous verrez que j'ai dit (en fait, le manuel dit) que l'ordre de tri est basé sur la hostcolonne en premier. Vous avez beaucoup écrit sur la façon de vérifier vos informations d'identification actuelles, mais je vois peu d'informations sur la raison pour laquelle 'bill'@'localhost'vous ne pouvez pas vous connecter en tant que 'bill'@'%', c'est la question d'aujourd'hui AFAIK. L'OP a probablement une mauvaise configuration, c'est pourquoi il obtient ces erreurs.
RandomSeed
2
--protocol=TCPétait la clé. Merci beaucoup!
lfx
22

Super tard pour ça

J'ai essayé toutes ces réponses et a couru de nombreuses versions différentes de mysql -u root -pmais jamais seulement RAN


mysql -u root -p

Et en appuyant simplement sur [ENTER]le mot de passe.


Une fois que j'ai fait ça, ça a marché. J'espère que cela aide quelqu'un.

Garrettmac
la source
18

Un problème connexe dans mon cas essayait de se connecter en utilisant:

mysql -u mike -p mypass

L'espace est apparemment autorisé entre -u # uname # mais PAS entre -p et # password #

Il fallait donc:

mysql -u mike -pmypass

Sinon, avec un espace blanc entre -p mypass mysql prend 'mypass' comme nom de base de données

mstram
la source
1
ou: mysql -u usrname -p - cela empêche quiconque de voir le mot de passe car il supprimera une nouvelle ligne et demandera le mot de passe sans l'afficher
grande réponse @mstram
Arpit Solanki
1
cette solution est confortable, néanmoins il n'est pas sûr de taper le mot de passe évidemment, mais pas besoin de privilèges de type type et de définir d'autres choses. Donc, si votre livre mac est sécurisé - cette approche est très confortable, encore plus je l'ai utilisée pour importer des données vers aws depuis le pilote docker mysql.
dimpiax
17

Lorsque vous tapez mysql -u root -p , vous vous connectez au serveur mysql via une socket Unix locale.

Cependant, la subvention que vous avez accordée 'bill'@'%'ne correspond que curieusement aux connexions TCP / IP.

Si vous voulez accorder l'accès à la socket Unix locale, vous devez accorder des privilèges à 'bill' @ 'localhost', ce qui n'est curieusement pas la même chose que 'bill'@'127.0.0.1'

Vous pouvez également vous connecter en utilisant TCP / IP avec le client de ligne de commande mysql, afin de faire correspondre les privilèges que vous avez déjà accordés, par exemple exécuter mysql -u root -p -h 192.168.1.123ou quelle que soit l'adresse IP locale de votre box.

non
la source
"'bill' @ '%' ne correspond qu'aux connexions TCP / IP" C'est faux. Essayez-le sur une instance propre (vierge, skip-networking
prête à l'emploi
@YaK Je n'arrive pas à faire fonctionner 'user' @ '%' dans une telle configuration, que voulez-vous dire?
nos
Je pouvais me connecter en tant que 'bill' @ '%' sur une v5.0 sans réseau (donc via une socket). Quelle version utilisez-vous? Je vais l'essayer sur une v5.5.
RandomSeed
Veuillez voir ma réponse mise à jour. J'ai pu me connecter 'bill'@'%'via une socket sur une v5.5.
RandomSeed
17

Si vous oubliez votre mot de passe ou si vous souhaitez modifier votre mot de passe, vous pouvez suivre ces étapes:

1: arrêtez votre mysql

[root @ maomao ~] # service mysqld stop
Arrêt de MySQL: [OK]

2: utilisez «--skip-grant-tables» pour redémarrer mysql

[root @ mcy400 ~] # mysqld_safe --skip-grant-tables
[root @ cy400 ~] # Démarrage du démon mysqld avec des bases de données depuis / var / lib / mysql

3: ouvrez une nouvelle fenêtre et saisissez mysql -u root

[root @ cy400 ~] # mysql -u root
Bienvenue sur le moniteur MySQL. Les commandes se terminent par; ou \ g.

4: changer la base de données utilisateur

mysql> utiliser mysql
Lecture des informations de table pour compléter les noms de table et de colonne Vous pouvez désactiver cette fonction pour obtenir un démarrage plus rapide avec -A Database modifiée

5: modifiez votre mot de passe votre nouveau mot de passe doit être entré dans "()"

mysql> update user set password = password ('root123') where user = 'root';
Requête OK, 3 lignes affectées (0,00 sec)
Lignes correspondantes: 3 Modifiées: 3 Avertissements: 0

6: rincer

mysql> privilèges de vidage;

7: quitter

mysql> quitter
Bye

8: redémarrez mysql

[root @ cy400 ~] # service mysqld restart;
Arrêter MySQL: [OK]
Démarrer MySQL: [OK]

Bingo! Vous pouvez connecter votre base de données avec votre nom d'utilisateur et votre nouveau mot de passe:

[root@cy400 ~]# mysql -u root -p <br>
Enter password: admin123 <br>
Welcome to the MySQL monitor.  Commands end with ; or \g. <br>
Your MySQL connection id is 2 <br>
Server version: 5.0.77 Source distribution <br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br>
mysql> quit <br>
Bye
Li Yingjun
la source
1
Cela m'a aidé, mais sur mac si vous installez avec homebrew c'est mysql.server stop. Dans mon cas, je n'ai pas pu mettre à jour la colonne utilisateur car il n'y en a pas; n'a pas non plus pu en créer un car il est en mode sans échec. Pour ce que je fais en ce moment, je m'en fiche, mais j'apprécie vraiment cette réponse au format avec les entrées et sorties exactes affichées. Merci!
szeitlin
Je suis désolé, je n'ai jamais utilisé de mac auparavant, je ne peux donc pas vous aider.
Li Yingjun
15

Sauvez-vous d'un mal de tête MAJEUR ... Votre problème pourrait être que vous manquez les guillemets autour du mot de passe. C'est du moins mon cas qui m'a détourné pendant 3 heures.

[client]
user = myusername
password = "mypassword"   # <----------------------- VERY IMPORTANT (quotes)
host = localhost

http://dev.mysql.com/doc/refman/5.7/en/option-files.html

Recherchez «Voici un fichier d'options utilisateur type:» et voyez l'exemple qu'ils contiennent. Bonne chance et j'espère faire gagner du temps à quelqu'un d'autre.

mimoralea
la source
1
Merci pour ça. J'ai perdu une demi-journée à ce sujet et les citations stupides autour du mot de passe ont fait l'affaire!
guyfromfl
Haha. J'ai gaspillé à peu près la même chose quand cela m'est arrivé. Heureux d'avoir pu aider.
mimoralea
12

La solution est de supprimer l'utilisateur anonyme (Any)!

J'ai également rencontré le même problème lors de la configuration d'un serveur par quelqu'un d'autre. Normalement, je ne choisis pas de créer un utilisateur anonyme lors de l'installation de MySQL, donc je ne l'avais pas remarqué. Au départ, je me suis connecté en tant qu'utilisateur "root" et j'ai créé quelques utilisateurs "normaux" (c'est-à-dire des utilisateurs avec des privilèges uniquement sur dbs avec leur nom d'utilisateur comme préfixe), puis je me suis déconnecté, puis j'ai vérifié le premier utilisateur normal. Je n'ai pas pu me connecter. Ni via phpMyAdmin, ni via shell. Il s'avère que le coupable est cet utilisateur "Any".

fevangelou
la source
11

J'ai eu un problème quelque peu similaire - lors de ma première tentative d'entrer dans MySQL, car rootil m'a dit que l'accès était refusé. Il s'avère que j'ai oublié d'utiliser le sudo...

Donc, si vous échouez à la rootpremière tentative, essayez:

sudo mysql -u root -p

puis entrez votre mot de passe, cela devrait fonctionner.

David Refaeli
la source
6

La meilleure solution que j'ai trouvée pour moi est.

mon utilisateur est sonar et chaque fois que j'essaie de me connecter à ma base de données depuis une machine externe ou autre, j'obtiens une erreur comme

ERROR 1045 (28000): Access denied for user 'sonar'@'localhost' (using password: YES)

Aussi, comme j'essaie ceci à partir d'une autre machine et via le travail Jenkins, mon URL d'accès est

alm-lt-test.xyz.com

si vous souhaitez vous connecter à distance, vous pouvez le spécifier de différentes manières comme suit:

mysql -u sonar -p -halm-lt-test.xyz.com
mysql -u sonar -p -h101.33.65.94
mysql -u sonar -p -h127.0.0.1 --protocol=TCP
mysql -u sonar -p -h172.27.59.54 --protocol=TCP

Pour y accéder avec l'URL, il vous suffit d'exécuter la requête suivante.

GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'alm-lt-test.xyz.com' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'172.27.59.54' IDENTIFIED BY 'sonar';
Abhijeet Kamble
la source
4

D'accord, je ne suis pas sûr, mais c'est probablement le fichier my.cnf dans le répertoire d'installation de mysql qui est le coupable. Mettez cette ligne en commentaire et le problème pourrait être résolu.

bind-address = 127.0.0.1
Ali
la source
1
Pour plus de détails, vous pouvez également consulter ceci wiki.bitnami.org/Components/MySQL
Ali
1
Je suis sûr que ce n'est pas le problème. Si tel est le cas, MySQL refuse les connexions à partir de tout hôte autre que 127.0.0.1, et vous n'obtiendrez pas d'erreur SQL «Accès refusé».
The Pellmeister
3

Je voulais juste vous faire savoir une circonstance inhabituelle. J'ai reçu la même erreur. Peut-être que cela aide quelqu'un à l'avenir.

J'avais développé quelques vues de base, créées sur le site de développement et transférées sur le site de production. Plus tard cette semaine-là, j'ai changé un script PHP et soudainement, des erreurs se sont produites: l'accès a été refusé à l'utilisateur «local-web-user» @ «localhost». L'objet source de données n'avait pas changé, alors je me suis concentré sur l'utilisateur de la base de données dans MySQL, inquiet en attendant que quelqu'un pirate mon site Web. Heureusement, le reste du site semblait indemne.

Il s'est avéré plus tard que les vues étaient les coupables. Nos transferts d'objets sont effectués en utilisant un autre utilisateur (et distant: admin @ ip-address) que l'utilisateur du site Web local. Les vues ont donc été créées avec 'admin' @ 'ip-address' comme définisseur. La valeur par défaut de création de la vue SECURITY est

SQL SECURITY DEFINER

Lorsque l'utilisateur local-web essaie d'utiliser la vue, il tombe sur les privilèges manquants du définisseur pour utiliser les tables. Une fois la sécurité modifiée:

SQL SECURITY INVOKER

le problème a été résolu. Le problème réel était complètement différent de celui prévu en fonction du message d'erreur.

Erik
la source
1
Cela a fini par être la source de mon problème également - une vue avec un "definer" manquant. Un moyen rapide de savoir si c'est ce qui vous arrive est d'essayer d'interroger la même table ou vue en tant que root - si vous le faites, le message d'erreur devient le plus descriptif "ERREUR 1449 (HY000): l'utilisateur spécifié en tant que definer n'existe pas ".
Joshua Davies
3

C'est une différence entre:

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

et

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

Vérifie ça:

mysql> select user,host from mysql.user;
+---------------+----------------------------+
| user          | host                       |
+---------------+----------------------------+
| bill          | %                          | <=== created by first
| root          | 127.0.0.1                  |
| root          | ::1                        |
| root          | localhost                  |
| bill          | localhost                  | <=== created by second
+---------------+----------------------------+

La commande

mysql -u bill -p

accès implicite à 'bill' @ 'localhost' et NON à 'bill' @ '%'.

Il n'y a aucune autorisation pour 'bill' @ 'localhost'

vous obtenez l'erreur:

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

résoudre le problème:

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

grant all privileges on . to 'bill'@'localhost' with grant option;
Gerd
la source
L'instruction grant a renvoyé une erreur. J'avais besoin de spécifier une base de données comme ceci: accordez tous les privilèges sur newdb. * À ....
LeBird
3

Cela se produit également lorsque votre mot de passe contient des caractères spéciaux tels que @, $, etc. Pour éviter cette situation, vous pouvez mettre le mot de passe entre guillemets simples:

$ mysql -usomeuser -p's0mep@$$w0Rd'

Ou à la place, n'utilisez pas de mot de passe lors de la saisie. Laissez-le vide, puis saisissez-le lorsque le terminal le demande. C'est la voie recommandée.

$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql>
Pranit More
la source
3
Cela peut en effet être un problème (comme pour moi). Tous mes mots de passe pour l'un de mes comptes sont générés à l'aide de pwgen. Aujourd'hui, j'en ai généré une nouvelle pour une base de données MySQL et son utilisateur. Malheureusement, le mot de passe contenait une barre oblique inverse "\" que je n'ai pas identifiée comme l'origine des erreurs (je n'y ai même pas pensé). J'ai donc cherché pendant des heures une solution. Après avoir défini le mot de passe sur "123" en désespoir de cause, la connexion a finalement fonctionné. … Les utilisateurs doivent être conscients que certains caractères spéciaux peuvent causer des problèmes car MySQL n'affiche aucun avertissement sur l'utilisation de mots de passe tels que "daiy4ha4in7chooshuiphie \ Th * aew", par exemple.
Arvid
1
Était sur le point de poster cela comme une réponse si elle n'était pas encore apparue, c'était tout simplement trop loin dans la liste pour que je puisse le remarquer (donc je l'augmente +1)
Assimilater
3

Pour moi, ce problème est dû à une nouvelle fonctionnalité de MySQL 5.7.2: les userentrées sont ignorées si leur pluginchamp est vide.

Réglez-le par exemple mysql_native_passwordpour les réactiver:

UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;

Voir les notes de publication de MySQL 5.7.2 , sous «Notes d'authentification».

Pour une raison quelconque (peut-être parce que mes hachages de mot de passe antérieurs à 4.1 ont été supprimés), le mysql_upgradescript n'a pas défini de valeur de plugin par défaut.

J'ai découvert en remarquant le message d'avertissement suivant dans /var/log/mysql/error.log:

[Avertissement] L'entrée utilisateur 'foo' @ '%' a une valeur de plugin vide. L'utilisateur sera ignoré et personne ne pourra plus se connecter avec cet utilisateur.

Je poste cette réponse ici pour peut-être éviter à quelqu'un d'utiliser le même temps ridicule que moi.

maxelost
la source
2

Je ne sais pas si quelqu'un d'autre trouvera cela utile, mais j'ai rencontré la même erreur et j'ai cherché partout des utilisateurs anonymes ... et il n'y en avait pas. Le problème a fini par être que le compte d'utilisateur a été défini sur "Exiger SSL" - que j'ai trouvé dans PHPMyAdmin en accédant aux comptes d'utilisateurs et en cliquant sur Modifier les privilèges de l'utilisateur. Dès que j'ai décoché cette option, tout a fonctionné comme prévu!

Alan
la source
2

Résumé du débogage

  • Vérifiez l'erreur de frappe: nom d'utilisateur ou mot de passe.
  • Vérifiez le nom d'hôte et comparez-le avec le nom d'hôte de la table mysql.user.
  • Vérifiez que l'utilisateur existe ou non.
  • Vérifiez si l'hôte contient une adresse IP ou un nom d'hôte.

Il est fort probable que vous ayez rencontré ce problème plusieurs fois dans votre travail. Ce problème m'est apparu la plupart du temps en raison de la saisie incorrecte du nom d'utilisateur ou du mot de passe. Bien que ce soit l'une des raisons, il existe de nombreuses autres chances que vous puissiez rencontrer ce problème. Parfois, cela semble très similaire, mais lorsque vous creuserez plus profondément, vous réaliserez plusieurs facteurs contribuant à cette erreur. Ce message expliquera en détail la plupart des raisons courantes et contournera ce problème.

Raisons possibles:

  • Cas 1: erreur de frappe: nom d'utilisateur ou mot de passe.

Il s'agit de la raison la plus courante de cette erreur. Si vous avez mal saisi le nom d'utilisateur ou le mot de passe, vous obtiendrez sûrement cette erreur.

Solution:

La solution à ce type d'erreur est très simple. Entrez simplement le nom d'utilisateur et le mot de passe corrects. Cette erreur sera résolue. Si vous oubliez le mot de passe, vous pouvez réinitialiser le nom d'utilisateur / mot de passe. Si vous oubliez le mot de passe du compte administrateur / root, il existe de nombreuses façons de réinitialiser / recapturer le mot de passe root. Je publierai un autre article sur la façon de réinitialiser le mot de passe root au cas où vous oublieriez le mot de passe root.

  • Cas 2: accès à partir d'un mauvais hôte.

MySQL fournit une restriction basée sur l'hôte pour l'accès des utilisateurs en tant que fonctionnalités de sécurité. Dans notre environnement de production, nous avions l'habitude de restreindre la demande d'accès uniquement aux serveurs d'applications. Cette fonctionnalité est vraiment utile dans de nombreux scénarios de production.

Solution:

Lorsque vous rencontrez ce type de problème, vérifiez d'abord si votre hôte est autorisé ou non en vérifiant la table mysql.user. S'il n'est pas défini, vous pouvez mettre à jour ou insérer un nouvel enregistrement dans la table mysql.user. Généralement, l'accès en tant qu'utilisateur root à partir d'une machine distante est désactivé et ce n'est pas une meilleure pratique, en raison de problèmes de sécurité. Si vous avez besoin d'accéder à votre serveur à partir de plusieurs machines, ne donnez accès qu'à ces machines. Il est préférable de ne pas utiliser de caractères génériques (%) et donne des accès universels. Permettez-moi de mettre à jour la table mysql.user, maintenant le démouseur peut accéder au serveur MySQL depuis n'importe quel hôte.

  • Cas 3: l'utilisateur n'existe pas sur le serveur.

Ce type d'erreur se produit lorsque l'utilisateur auquel vous essayez d'accéder n'existe pas sur le serveur MySQL.

Solutions:

Lorsque vous rencontrez ce type de problème, vérifiez simplement si l'utilisateur existe ou non dans la table mysql.user. Si l'enregistrement n'existe pas, l'utilisateur ne peut pas accéder. S'il est nécessaire que cet utilisateur accède, créez un nouvel utilisateur avec ce nom d'utilisateur.

  • Cas 4: Mélange d'hôtes numériques et basés sur le nom.

Les points importants

  • Il n'est pas conseillé d'utiliser des caractères génériques lors de la définition de l'hôte utilisateur, essayez d'utiliser le nom d'hôte exact.

  • Désactivez la connexion root depuis la machine distante.

  • Utilisez le concept d'utilisateur proxy.

Il existe peu d'autres concepts liés à ce sujet et entrer dans les détails de ces sujets est une portée très différente de cet article. Nous examinerons les sujets connexes suivants dans les prochains articles.

  • Que faire si vous avez oublié le mot de passe root du serveur MySQL.
  • Problèmes de privilèges d'accès MySQL et tables liées aux utilisateurs.
  • Fonctionnalités de sécurité MySQL avec les meilleures pratiques.

J'espère que ce message vous aidera à corriger le code d'erreur MySQL 1045 Accès refusé pour l'utilisateur dans MySQL.

Abhijit Jagtap
la source
2

J'espère que vous n'avez pas fait plus de dégâts en supprimant également l'utilisateur debian-sys-maint dans mysql

Demandez à votre démon mysql de fonctionner normalement. Démarrez votre client mysql comme indiqué ci-dessous

mysql -u debian-sys-maint -p

Dans un autre terminal, catle fichier /etc/mysql/debian.cnf. Ce fichier contient un mot de passe; collez ce mot de passe lorsque vous y êtes invité.

http://ubuntuforums.org/showthread.php?t=1836919

ysk
la source
2

J'ai découvert un autre cas qui apparaît en surface comme un cas de bord; Je peux exporter vers le système de fichiers, via SELECT INTO .. ​​OUTFILE en tant que root, mais pas en tant qu'utilisateur régulier. Bien que cela puisse être une question d'autorisations, j'ai examiné cela et je ne vois rien de particulièrement évident. Tout ce que je peux dire, c'est que l'exécution de la requête en tant qu'utilisateur régulier disposant de toutes les autorisations sur la base de données en question renvoie l'erreur d'accès refusé qui m'a conduit à ce sujet. Lorsque j'ai trouvé la transcription d'une utilisation réussie de SELECT INTO… OUTFILE dans un ancien projet, j'ai remarqué que j'étais connecté en tant que root. Effectivement, lorsque je me suis connecté en tant que root, la requête s'est exécutée comme prévu.

David A. Gray
la source
1

Mise à jour: sur v8.0.15 (peut-être cette version),PASSWORD() fonction ne fonctionne pas.

Vous devez:

  1. Assurez-vous d'avoir d'abord arrêté MySQL.
  2. Exécutez le serveur en mode sans échec avec contournement de privilèges: sudo mysqld_safe --skip-grant-tables
  3. S'identifier: mysql -u root
  4. mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. mysql> FLUSH PRIVILEGES;
  6. mysql> exit;
  7. Connectez-vous à nouveau: mysql -u root
  8. mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
Mohamed Jaleel Nazir
la source
0

Lorsque vous exécutez mysql -u bill -p, localhostest résolu sur votre IP, car il est 127.0.0.1 et dans votre /etc/hostsfichier, par défaut 127.0.0.1 localhostexiste. Donc, mysql vous interprète comme bill@localhostce qui n'est pas accordé avec bill@'%'. C'est pourquoi il y a 2 enregistrements différents pour l' rootutilisateur à la suite deselect host, user from mysql.user; requête.

Il existe deux façons de gérer ce problème.

L'une spécifie une adresse IP qui n'est pas résolue inversement par /etc/hostsfichier lorsque vous essayez de vous connecter. Par exemple, l'ip du serveur est 10.0.0.2. Lorsque vous exécutez la commande mysql -u bill -p -h 10.0.0.2, vous pourrez vous connecter. Si vous tapez select user();, vous obtiendrez [email protected]. Bien sûr, aucun nom de domaine ne doit être résolu avec cette adresse IP dans votre /etc/hostsfichier.

Deuxièmement, vous devez accorder un accès pour ce nom de domaine spécifique. Pour bill@localhost, vous devez appeler la commande grant all privileges on *.* to bill@localhost identified by 'billpass';. Dans ce cas, vous pourrez vous connecter avec la commande mysql -u bill -p. Une fois connecté, la select user();commande revient bill@localhost.

Mais c'est uniquement pour cela que vous essayez de vous connecter à un serveur mysql dans le même hôte. Sur les hôtes distants, mysql se comporte normalement, '%' vous autorisera à vous connecter.

Shnkc
la source
0

J'ai résolu cela en supprimant les anciennes entrées de «facture» de l'utilisateur buggé (c'est la partie importante: à la fois de mysql.user et mysql.db ), puis j'ai créé le même utilisateur que triste auparavant:

FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;

A travaillé, l'utilisateur se connecte. Maintenant, je vais en retirer certains privilèges :)

dxvargas
la source
0

J'ai rencontré la même erreur. La configuration qui ne fonctionnait pas est la suivante:

define("HOSTNAME", "localhost");
define("HOSTUSER", "van");
define("HOSTPASS", "helsing");
define("DBNAME", "crossbow");
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

La configuration modifiée ci-dessous est celle qui l'a fait fonctionner. Remarquez la différence?

define('HOSTNAME', 'localhost');
define('HOSTUSER', 'van');
define('HOSTPASS', 'helsing');
define('DBNAME', 'crossbow');
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

La différence réside dans les guillemets doubles. Ils semblent être assez importants en PHP par rapport à Java et ils ont un impact sur l'échappement des caractères, la configuration des URL et maintenant la transmission des paramètres à une fonction. Ils sont plus jolis (je sais), mais utilisez toujours des guillemets simples autant que possible, puis des guillemets doubles peuvent être imbriqués dans ceux-ci si nécessaire.

Cette erreur est survenue lorsque j'ai testé mon application sur une boîte Linux par opposition à un environnement Windows.

Raymond Wachaga
la source
0

J'ai rencontré des problèmes similaires car mon mot de passe contient ";" char casser mon mot de passe quand je le crée au premier moment. Attention à cela si cela peut vous aider.

Genaut
la source
0

Cela peut s'appliquer à très peu de gens, mais voilà. N'utilisez pas d'exclamation !dans votre mot de passe.

J'ai fait et obtenu l'erreur ci-dessus en utilisant MariaDB. Lorsque je l'ai simplifié en chiffres et en lettres, cela a fonctionné. D'autres caractères tels que @et $fonctionnent correctement - j'ai utilisé ces caractères dans un autre utilisateur sur la même instance.

La cinquième réponse à cette adresse m'a conduit à ma correction.

Chiwda
la source
0

Sous Windows, voici comment résoudre:

ERREUR 1045 (28000): accès refusé à l'utilisateur 'root' @ 'localhost' (en utilisant le mot de passe: NO)

  1. Désinstaller mysql du panneau de contrôle
  2. Supprimez le dossier MySql de C:\Program Files,C:\Program Files (x86)etC:\ProgramData
  3. Installez mysql
Sanjay
la source
J'ai essayé toutes les autres réponses, finalement résolu d'essayer cela et cela a fonctionné!
jasonoriordan
0

Cela peut également se produire si MySQL s'exécute sur un système d'exploitation insensible à la casse, tel que Windows.

par exemple, j'ai trouvé que la tentative de connexion à une base de données en utilisant ces informations d'identification a échoué:

mysql> grant select on databaseV105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -p's3curepa5wrd' -h10.61.130.89 databaseV105

ERREUR 1045 (28000): accès refusé à l'utilisateur 'specialuser'@'10.0.1.113' (en utilisant le mot de passe: OUI)

Mais cela a réussi:

mysql> grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -h10.300.300.400 databaseV105 -p

Entrer le mot de passe:

kguest
la source
0

Aujourd'hui! Solution pour :

ERREUR MySQL 1045 (28000): Accès refusé pour l'utilisateur 'utilisateur' @ 'localhost' (en utilisant le mot de passe: OUI);

Nouvelle installation ou mise à niveau de Wampserver 3.2.0

xampUtiliser probablement par mariaDBdéfaut est bien.

Wample serveur est livré avec mariaDBet mysql, et installe mariaDBpar défaut sur le port 3306 et mysql sur 3307, port parfois 3308.

Connectez-vous à mysql!

À l'installation, il demande d'utiliser mariaDBou MySql, Mais mariaDB est coché par défaut et vous ne pouvez pas le changer, cochez l' mysqloption et installez.

une fois l'installation terminée, les deux s'exécuteront mariaDBsur le port par défaut 3306 et mysqlsur un autre port 3307 ou 3308.

Faites un clic droit sur l' wampservericône où son exécution devrait être dans le coin inférieur droit, allez sur les outils et voyez votre bon mysqlport d'exécution.

Et incluez-le dans votre connexion à la base de données de la même manière que folowng:

$host = 'localhost';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$port = '3308';//Port

$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset"; //Add in connection
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

Note : J'utilise pdo.

Voir ici pour plus: https://sourceforge.net/projects/wampserver/

Dlk
la source
Veuillez ne pas utiliser de backticks pour mettre l'accent. Ils ne doivent être utilisés que pour le code. Des mots comme MySQL ou Wampserver ne sont pas du code.
Dharman