Activer la connexion MySQL à distance: ERREUR 1045 (28000): accès refusé pour l'utilisateur

136

MySQL 5.1.31 fonctionnant sous Windows XP.

A partir de la locale serveur MySQL (192.168.233.142) Je peux connecter en tant que root comme suit:

>mysql --host=192.168.233.142 --user=root --password=redacted

Depuis une machine distante (192.168.233.163), je peux voir que le port mysql est ouvert:

# telnet 192.168.233.142 3306
Trying 192.168.233.142...
Connected to 192.168.233.142 (192.168.233.142).

Mais en essayant de me connecter à mysql depuis la machine distante , je reçois:

# mysql --host=192.168.233.142 --user=root --password=redacted
ERROR 1045 (28000): Access denied for user 'root'@'192.168.233.163' (using password: YES)

Je n'ai que 2 entrées dans mysql.user:

Host         User     Password
--------------------------------------
localhost    root     *blahblahblah
%            root     [same as above]

Que dois-je faire de plus pour activer l'accès à distance?

ÉDITER

Comme suggéré par Paulo ci-dessous, j'ai essayé de remplacer l'entrée mysql.user pour% par une entrée spécifique IP, donc ma table utilisateur ressemble maintenant à ceci:

Host             User     Password
------------------------------------------
localhost        root     *blahblahblah
192.168.233.163  root     [same as above]

J'ai ensuite redémarré la machine, mais le problème persiste.

Mike Chamberlain
la source

Réponses:

211

Vous devez mettre ceci en tant que root:

GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'IP' IDENTIFIED BY 'PASSWORD' with grant option;

;

où IP est l'adresse IP à laquelle vous souhaitez autoriser l'accès, USERNAME est l'utilisateur que vous utilisez pour vous connecter et PASSWORD est le mot de passe correspondant.

Si vous souhaitez autoriser l'accès à partir de n'importe quelle adresse IP, placez simplement %votre adresse IP

et puis il suffit de mettre

FLUSH PRIVILEGES;

Ou redémarrez le serveur mysql et c'est tout.

Octavio
la source
Y a-t-il un moyen de faire cela sans un client mysql local?
cmcginty
comment supprimer les privilèges d'une adresse IP spécifique?
Umair Ayub
4
stackoverflow.com/a/21151255/470749 m'a également aidé parce que je suppose que mon paramètre d'adresse de liaison devait être commenté. Accorder des privilèges à distance n'était pas suffisant pour le faire fonctionner.
Ryan
8
Non expliqué dans la réponse, mais remplacez-le PASSWORDpar le mot de passe du compte. J'ai essayé le changement ci-dessus uniquement USERNAMEet IPcela n'a pas fonctionné pour moi jusqu'à ce que je change PASSWORD.
Richard Parnaby-King
Après avoir fait cela, suivez également ce qui est dit dans la réponse suivante: stackoverflow.com/a/21151255/445438
budhajeewa
85

J'obtenais la même erreur après avoir accordé l'accès à distance jusqu'à ce que je fasse ceci:

De /etc/mysql/my.cnf

Dans les versions plus récentes de mysql, l'emplacement du fichier est /etc/mysql/mysql.conf.d/mysqld.cnf

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1

(commenter cette ligne: bind-address = 127.0.0.1)

Alors courez service mysql restart.

les gars
la source
6
Ou, changez-le en bind-address = 0.0.0.0
lolski
2
Seuls les commentaires bind-addressn'ont pas fonctionné pour moi. Soit bind-address = 0.0.0.0ou bind-address = <server_ip>fonctionne.
chhantyal
58

Par défaut, dans le serveur MySQL, l'accès à distance est désactivé. Le processus pour fournir un accès à distance à l'utilisateur est.

  1. Allez dans mon dossier sql bin ou ajoutez-le à PATH
  2. Connectez-vous à root par mysql -uroot -proot(ou quel que soit le mot de passe root).
  3. En cas de succès, vous obtiendrez mysql>
  4. Accordez l'accès à tous pour cet utilisateur.

GRANT ALL PRIVILEGES ON *.* TO 'username'@'IP' IDENTIFIED BY 'password';

Ici, IP est l'adresse IP pour laquelle vous souhaitez autoriser l'accès à distance, si nous mettons %une adresse IP peut accéder à distance.

Exemple:

C:\Users\UserName> cd C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin

C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin>mysql -uroot -proot

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.27 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.25 sec)

Ceci pour un autre utilisateur.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'testUser'@'%' IDENTIFIED BY 'testUser';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

J'espère que cela aidera

Ravi Kant
la source
+1 pour d'excellents détails, cela m'a vraiment aidé à voir que 0 rows affectedc'est la norme :) Aussi, service mysqld restartest recommandé à la fin. [ mysqldest parfois juste mysql]
Nathan Dortman
#Remarque: Pour la version 5.6+, utilisez "grant all on ..." (sans les privilèges)
Nicke Manarin
21

L'aide de Paulo m'a conduit à la solution. C'était une combinaison des éléments suivants:

  • le mot de passe contenait un signe dollar
  • J'essayais de me connecter à partir d'un shell Linux

Le shell bash traite le signe dollar comme un caractère spécial pour l' expansion vers une variable d'environnement, nous devons donc l'échapper avec une barre oblique inverse. Incidemment, nous n'avons pas à faire cela dans le cas où le signe dollar est le caractère final du mot de passe.

Par exemple, si votre mot de passe est "pas $ word", depuis Linux bash, nous devons nous connecter comme suit:

# mysql --host=192.168.233.142 --user=root --password=pas\$word
Mike Chamberlain
la source
4
En plus de ce qui précède, veuillez vérifier /etc/mysql/my.cnf et commenter bind-address = 127.0.0.1
Buminda
2
Alternativement, on peut utiliser des guillemets simples pour empêcher l'expansion du $: mysql --host=192.168.233.142 --user=root --password='pas$word' stackoverflow.com/a/6697781/500942
jalanb
'$' dans le mot de passe. Inestimable. Merci beaucoup !!
Nagendra Kakarla
après m'être cogné la tête contre le moniteur pendant un moment, je suis tombé sur cela et cela a fonctionné. J'ai eu un ! et @ dans mon mot de passe. Mot de passe modifié, privilèges vidés et j'y suis de retour. Merci!
AJM
9

As-tu un pare-feu ? assurez-vous que le port 3306 est ouvert.

Sous Windows, par défaut, un compte root mysql est créé et est autorisé à accéder à partir de localhost uniquement à moins que vous n'ayez sélectionné l'option permettant d'activer l'accès à partir de machines distantes lors de l'installation.

créer ou mettre à jour l'utilisateur souhaité avec '%' comme nom d'hôte.

exemple :

CREATE USER 'krish'@'%' IDENTIFIED BY 'password';
Vamsi Krishna B
la source
6
Le serveur répond par "ERREUR 1045 (28000): Accès refusé pour" ... si un pare-feu obtiendra un délai d'expiration ...
Paulo H.
je voulais juste publier en premier. my bad
Vamsi Krishna B
@Krish - Tout ce que vous avez suggéré est déjà couvert dans la question
Mike Chamberlain
5
  1. Essayez à flush privilegesnouveau.

  2. Essayez de redémarrer le serveur pour recharger les subventions.

  3. Essayez de créer un utilisateur avec l'hôte "192.168.233.163". "%" semble ne pas tout autoriser (c'est bizarre)

Paulo H.
la source
Merci, j'ai essayé mais en vain. J'ai mis à jour la question avec vos suggestions.
Mike Chamberlain
4
Essayez de créer un autre utilisateur et n'oubliez pas de définir toutes les subventions:CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass'; GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' WITH GRANT OPTION;
Paulo H.
4

Dans mon cas, j'essayais de me connecter à un serveur mysql distant sur cent OS. Après avoir parcouru de nombreuses solutions (octroi de tous les privilèges, suppression des liaisons IP, activation de la mise en réseau), le problème n'était toujours pas résolu.

Il s'est avéré qu'en cherchant diverses solutions, je suis tombé sur iptables, ce qui m'a fait réaliser que le port mysql 3306 n'acceptait pas les connexions.

Voici une petite note sur la façon dont j'ai vérifié et résolu ce problème.

  • Vérification si le port accepte les connexions:

    telnet (IP du serveur mysql) [portNo]

  • Ajout d'une règle de table ip pour autoriser les connexions sur le port:

    iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPTER

  • Je ne le recommanderais pas pour l'environnement de production, mais si vos iptables ne sont pas configurés correctement, l'ajout des règles peut ne pas toujours résoudre le problème. Dans ce cas, ce qui suit doit être fait:

    arrêt du service iptables

J'espère que cela t'aides.

Kushal
la source
3

si vous utilisez une adresse IP dynamique, accordez simplement l'accès à 192.168.2.%. Vous n'avez donc plus à vous soucier d'accorder l'accès à votre adresse IP à chaque fois.

Nitin Jaiman
la source
1

J'avais du mal à me connecter à distance à MYSQL pour mon instance Linux Amazon EC2. J'ai trouvé que la solution était de m'assurer que mon groupe de sécurité incluait une règle entrante pour le port MySQL 3306 afin d'inclure mon adresse IP (ou 0.0.0.0/0 pour n'importe où). Immédiatement pourrait se connecter à distance dès que j'ai ajouté cette règle.

Brendan Moore
la source
1

Le nouvel emplacement du fichier de configuration mysql est

/etc/mysql/mysql.conf.d/mysqld.cnf
stackMonk
la source
0

Le pilote MySQL ODBC 3.51 est que les caractères spéciaux dans le mot de passe ne sont pas gérés.

"Avertissement - Vous pourriez avoir de sérieux maux de tête avec MySQL ODBC 3.51 si le mot de passe de votre commande GRANT contient des caractères spéciaux, tels que! @ # $% ^?. Le pilote ODBC MySQL ODBC 3.51 ne prend pas en charge ces caractères spéciaux dans la zone de mot de passe. Le seul message d'erreur que vous recevriez est «Accès refusé» (en utilisant le mot de passe: OUI) »- de http://www.plaintutorials.com/install-and-create-mysql-odbc-connector-on-windows-7/

PiperKeith
la source
0

La combinaison utilisateur / hôte peut avoir été créée sans mot de passe.

Je supposais que lors de l'ajout d'un nouvel hôte pour un utilisateur existant (à l'aide d'une application GUI), le mot de passe existant serait également utilisé pour la nouvelle combinaison utilisateur / hôte.

Je pourrais me connecter avec

mysql -u username -p PASSWORD

localement, mais pas depuis IPADDRESS avec

mysql -u --host=HOST -p PASSWORD

(Je pourrais en fait me connecter depuis IPADDRESS sans utiliser de mot de passe)

mysql -u --host=HOST

Définition du mot de passe pour l'accès autorisé:

set password for '<USER>'@'<IPADDRESS>' = '<PASSWORD>';
Andkrup
la source
1
Merci, j'ai passé beaucoup de temps à essayer de me connecter à distance à mon serveur Mysql et cette ligne a beaucoup aidé. Lors de la configuration du mot de passe de l'utilisateur, j'ai eu l'erreur ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal numberqui m'a conduit à cet article: knowmysql.blogspot.com/2013/09/… Après avoir suivi ces étapes, j'ai enfin pu me connecter au serveur.
Andy Forceno