L'hôte 'xxx.xx.xxx.xxx' n'est pas autorisé à se connecter à ce serveur MySQL


668

Cela devrait être très simple, mais je ne peux pas le faire fonctionner pour la vie de moi.
J'essaie simplement de me connecter à distance à mon serveur MySQL.

connexion en tant que

mysql -u root -h localhost -p  

fonctionne bien, mais en essayant

mysql -u root -h 'any ip address here' -p

échoue avec l'erreur

ERROR 1130 (00000): Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server

Dans le mysql.usertableau, il existe exactement la même entrée pour l'utilisateur 'root' avec l'hôte 'localhost' qu'un autre avec l'hôte '%'.

Je suis à bout de souffle et je n'ai aucune idée de comment procéder. Toutes les idées sont les bienvenues.


Impossible de se connecter en tant que root dans la plupart des circonstances en raison de mesures de sécurité ..
AO_

Réponses:


816

Peut-être une précaution de sécurité. Vous pouvez essayer d'ajouter un nouveau compte administrateur:

mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
    ->     WITH GRANT OPTION;
mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
    ->     WITH GRANT OPTION;

Bien que Pascal et d'autres l'ont noté, ce n'est pas une bonne idée d'avoir un utilisateur avec ce type d'accès ouvert à n'importe quelle IP. Si vous avez besoin d'un utilisateur administratif, utilisez root et laissez-le sur localhost. Pour toute autre action, spécifiez exactement les privilèges dont vous avez besoin et limitez l'accessibilité de l'utilisateur comme Pascal l'a suggéré ci-dessous.

Éditer:

De la FAQ MySQL:

Si vous ne pouvez pas comprendre pourquoi vous avez refusé l'accès, supprimez de la table utilisateur toutes les entrées qui ont des valeurs d'hôte contenant des caractères génériques (entrées qui contiennent des caractères '%' ou '_'). Une erreur très courante consiste à insérer une nouvelle entrée avec Host = '%' et User = 'some_user', pensant que cela vous permet de spécifier localhost pour se connecter à partir de la même machine. La raison pour laquelle cela ne fonctionne pas est que les privilèges par défaut incluent une entrée avec Host = 'localhost' et User = ''. Étant donné que cette entrée a une valeur d'hôte «localhost» qui est plus spécifique que «%», elle est utilisée de préférence à la nouvelle entrée lors de la connexion à partir de localhost! La procédure correcte consiste à insérer une deuxième entrée avec Host = 'localhost' et User = 'some_user', ou pour supprimer l'entrée avec Host = 'localhost' et User = ''. Après avoir supprimé l'entrée, n'oubliez pas d'émettre une instruction FLUSH PRIVILEGES pour recharger les tables de droits. Voir également Section 5.4.4, «Contrôle d'accès, étape 1: vérification de la connexion».


17
Bonne capture Yannick, mais je ne lui recommanderais pas d'accorder tous les privilèges à un utilisateur non root. Peut-être un ensemble réduit?
Corey Ballou

3
Eh bien, ce ne serait en effet pas une bonne idée, mais permettre à «root» de se connecter à partir de tous les hôtes est exactement le même, car il est au même niveau de privilège.
Yannick Motton

2
Je pense que vous manquez mon point Pascal. Le fait est que l'utilisateur «root» a déjà ces droits, et il veut permettre à n'importe quelle adresse IP de s'authentifier en tant qu'utilisateur. Donc, si c'est vraiment ce qu'il veut, l'exemple par défaut de création d'un nouvel utilisateur administrateur (qui a exactement les mêmes droits) est une alternative à ce qu'il essaie.
Yannick Motton

2
C'est vrai Yannick, j'ai lu trop vite et je supprimerai mon commentaire. Cependant, AFAIK, les autorisations fonctionnent bien dans MySQL donc: 1. peut-être que l'OP a modifié les tables d'octroi manuellement et doit ensuite vider les privilèges. 2. peut-être qu'il n'a pas utilisé la syntaxe de subvention appropriée pour root. L'ajout d'un autre utilisateur administratif peut être une solution de contournement, mais cela ne résoudra pas le vrai problème à mon humble avis.
Pascal Thivent

1
Je pensais que fournir un accès de tous les hôtes à root n'était pas une bonne solution. Au lieu de cela, j'ai créé un nouvel utilisateur et accordé un ensemble de privilèges réduit, l'ensemble que j'ai utilisé est décrit comme «DBManager» sur MySQL Workbench. J'ai également autorisé l'accès à partir d'un certain groupe d'hôtes dans mon réseau local, en particulier 192.168.0.%
Gustavo Guevara

272

Il faut créer un new MySQL Useret attribuer les privilèges comme ci-dessous dans Query promptvia phpMyAdmin ou invite de commande:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

Une fois terminé avec les quatre requêtes, il doit se connecter avec username / password


5
J'ai dû redémarrer mysql après avoir terminé les étapes ci-dessus pour que cela fonctionne pour moi.
péage du

Devez-vous créer un nom d'utilisateur @ localhost? N'est-ce pas suffisant si vous créez simplement le nom d'utilisateur @%? Je veux dire, si vous créez simplement un nom d'utilisateur @%, ne pourrez-vous pas vous connecter avec cet utilisateur depuis localhost?
Sorin Postelnicu

1
Ouais, créer un @localhostaurait du sens si les privilèges étaient différents d'une manière ou d'une autre, mais ici, ils sont les mêmes et cela va probablement être plus déroutant qu'autre chose (comme changer un mot de passe sur l'un sans se rendre compte que l'autre existe et que votre connexion pourrait frapper celui-là ).
Bratchley

en tant que débutant, cela m'a vraiment aidé
Muhammad Nayab

1
merci, cela résout mon "SQLSTATE [HY000] [1130] L'hôte 'DESKTOP-xxx.xx' n'est pas autorisé à se connecter à ce serveur MariaDB" dans une application laravel conteneurisée dans Windows
Zulqarnain

117

Mon message d'erreur était similaire et disait: «L' hôte XXX n'est pas autorisé à se connecter à ce serveur MySQL » même si j'utilisais root. Voici comment vous assurer que root dispose des autorisations appropriées.

Ma configuration :

  • Ubuntu 14.04 LTS
  • MySQL v5.5.37

Solution

  1. Ouvrez le fichier sous 'etc / mysql / my.cnf'
  2. Vérifier:

    • port (par défaut, c'est 'port = 3306')
    • bind-address (par défaut, c'est 'bind-address = 127.0.0.1'; si vous voulez ouvrir à tous alors commentez cette ligne. Pour mon exemple, je dirai que le serveur réel est sur 10.1.1.7)
  3. Accédez maintenant à la base de données MySQL sur votre serveur réel (par exemple, votre adresse distante est 123.123.123.123 au port 3306 en tant qu'utilisateur 'root' et je souhaite modifier les autorisations sur la base de données 'dataentry'. N'oubliez pas de modifier l'adresse IP, le port et le nom de la base de données à vos paramètres)

    mysql -u root -p
    Enter password: <enter password>
    mysql>GRANT ALL ON *.* to root@'123.123.123.123' IDENTIFIED BY 'put-your-password';
    mysql>FLUSH PRIVILEGES;
    mysql>exit
  4. sudo service mysqld restart

  5. Vous devriez maintenant pouvoir vous connecter à distance à votre base de données. Par exemple, j'utilise MySQL Workbench et je mets 'Hostname: 10.1.1.7', 'Port: 3306', 'Username: root'

1
Vous pouvez sauter la use dataentryligne (car la plupart des gens n'auront pas créé cette base de données).
Jedidja

3
j'ai pu le faire sans redémarrer le mysqlservice à la fin
Ryan Tuck

5
FLUSH PRIVILEGESdevrait vous permettre de ne pas avoir besoin de redémarrer.
Adam B

Cela a fonctionné pour moi pour MySQL 5.5 sur Windows 10 avec FLUSH PRIVILEGES, sans redémarrer le service. Sous Windows, les propriétés du service doivent identifier le fichier my.ini utilisé pour la configuration (Propriétés | Général | Chemin d'accès à l'exécutable)
FreeText

J'ai supposé qu'en spécifiant bind-address = "0.0.0.0", il écouterait sur toutes les interfaces et que les connexions à distance fonctionneraient, mais j'avais tort. Oui, netstat a montré que mysql écoutait sur 0.0.0.0 (toutes les interfaces) mais j'obtenais l'erreur dans le titre de la question. Une fois que j'ai supprimé complètement la ligne d'adresse de liaison, cela a commencé à fonctionner. Bizarre.
Henno

73

Vous devez accorder l'accès à l'utilisateur à partir de n'importe quel nom d'hôte.

Voilà comment vous ajoutez de nouveaux privilèges de phpmyadmin

Goto Privileges> Ajouter un nouvel utilisateur

entrez la description de l'image ici

Sélectionnez N'importe quel hôte pour le nom d'utilisateur souhaité

entrez la description de l'image ici


Très utile, merci bro
Anderson Laverde Il y a

65

Effectuez simplement les étapes suivantes:

1a) Connectez-vous à mysql (via localhost)

mysql -uroot -p

1b) Si le serveur myslq s'exécute dans Kubernetes (K8s) et est accessible via un NodePort

kubectl exec -it [pod-name] -- /bin/bash
mysql -uroot -p

2) Créer un utilisateur

CREATE USER 'user'@'%' IDENTIFIED BY 'password';

3) Accorder des autorisations

 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;

4) Privilèges de vidage

FLUSH PRIVILEGES;

4
ERREUR 1045 (28000): accès refusé pour l'utilisateur 'root' @ 'localhost' (en utilisant passwoYES) Y
Gank

11
Devrait être *.* ?
sgarg

26

Le message *Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL serverest une réponse du serveur MySQL au client MySQL. Remarquez comment il renvoie l'adresse IP et non le nom d'hôte.

Si vous essayez de vous connecter avec mysql -h<hostname> -u<somebody> -pet qu'il renvoie ce message avec l'adresse IP, le serveur MySQL n'est pas en mesure d'effectuer une recherche inversée sur le client. Ceci est essentiel car c'est la façon dont il mappe le client MySQL aux subventions.

Assurez-vous que vous pouvez faire un nslookup <mysqlclient>FROM depuis le serveur MySQL. Si cela ne fonctionne pas, il n'y a pas d'entrée dans le serveur DNS. Alternativement, vous pouvez mettre une entrée dans le fichier HOSTS du serveur MySQL ( <ipaddress> <fullyqualifiedhostname> <hostname><- L'ordre ici peut avoir de l'importance).

Une entrée dans le fichier hôte de mon serveur permettant une recherche inversée du client MySQL a résolu ce problème.


1
"est une réponse du serveur MySQL au client MySQL." Merci, je me demandais d'où venait l'erreur, ma machine ou le serveur. J'ai l'erreur "ERREUR 1130 (HY000):" etc.
PJ Brunet

20

Manière simple:

Grant All Privileges ON *.* to 'USER_NAME'@'%' Identified By 'YOUR_PASSWORD'; 

puis

FLUSH PRIVILEGES;

terminé!


que signifie le%?
dataviews

1
c'est comme tout. Vous pouvez faire comme exemple: WHERE CustomerName LIKE 'a%'- Recherche toutes les valeurs qui commencent par "a"
user5510975

16

Si vous modifiez les tables de droits manuellement (à l'aide de INSERT, UPDATE, etc.), vous devez exécuter une FLUSH PRIVILEGESinstruction pour indiquer au serveur de recharger les tables de droits.

PS: Je ne recommanderais pas à n'importe quel hôte de se connecter pour n'importe quel utilisateur (surtout pas l' rootutilisation). Si vous utilisez mysql pour une application client / serveur, préférez une adresse de sous-réseau. Si vous utilisez mysql avec un serveur Web ou un serveur d'applications, utilisez des adresses IP spécifiques.


4

Utilisez simplement l'interface fournie par l'outil GUI de MySql (SQLyog):

Cliquez sur Gestionnaire d'utilisateurs: entrez la description de l'image ici

Maintenant, si vous souhaitez accorder l'accès POUR TOUT AUTRE PC À DISTANCE, assurez-vous simplement que, comme dans l'image ci-dessous, la valeur du champ Hôte est% (qui est le caractère générique)

entrez la description de l'image ici


4

La plupart des réponses ici vous montrent la création d'utilisateurs avec deux valeurs d'hôte: une pour localhostet une pour %.

Veuillez noter qu'à l'exception d'un utilisateur localhost intégré comme root, vous n'avez pas besoin de le faire. Si vous souhaitez simplement créer un nouvel utilisateur pouvant se connecter depuis n'importe où, vous pouvez utiliser

CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT <whatever privileges are appropriate> ON <relevant tables> TO myuser;

et cela fonctionnera très bien. (Comme d'autres l'ont mentionné, c'est une terrible idée d'accorder des privilèges administratifs à un utilisateur de n'importe quel domaine.)


3

le moyen le plus simple est de se connecter à phpmyadmin avec un compte root, il y a une base de données mysql et une table utilisateur, il édite le compte root et dans le champ hôte ajoute% wild card. puis à travers les privilèges de vidage ssh

 FLUSH PRIVILEGES;

Cela m'a aidé à combiner cela: Accordez tous vos privilèges . POUR 'root' @ '%' AVEC L'OPTION GRANT;
Lanklaas

2

S'il s'agit d'une installation récente de mysql, avant de changer quoi que ce soit d'autre, essayez simplement d'exécuter cette commande, puis réessayez:

flush privileges;

Cela résout à lui seul le problème pour moi sur Ubuntu 16.04, mysql 5.7.20. YMMV.


2

Trouvez simplement une meilleure façon de le faire à partir de votre panneau de contrôle d'hébergement (j'utilise DirectAdmin ici)

allez simplement dans la base de données du serveur cible dans votre panneau de contrôle, dans mon cas: gestion MySQL -> sélectionnez votre base de données -> vous trouverez: "Hôtes d'accès", ajoutez simplement votre hôte distant ici et son fonctionnement maintenant! entrez la description de l'image ici

Je suppose qu'il existe une option similaire sur d'autres panneaux C. comme plesk, etc.

J'espère que cela vous a également été utile.


2

Eh bien, rien de la réponse ci-dessus n'a fonctionné pour moi. Après beaucoup de recherches, j'ai trouvé une solution. Bien que je puisse être en retard, cela peut aider les autres à l'avenir.

Connectez-vous à votre serveur SQL depuis un terminal

 mysql -u root -p
 -- root password
GRANT ALL ON *.* to root@'XX.XXX.XXX.XX' IDENTIFIED BY 'password';

Cela devrait résoudre le problème d'autorisation.

Avant de résoudre l'erreur

Après avoir résolu le problème

Bon codage !!


1

Eh bien, ce que vous pouvez faire est simplement d'ouvrir le fichier mysql.cfg et vous devez changer l'adresse de liaison en ceci

bind-address = 127.0.0.1

puis redémarrez mysql et vous pourrez connecter ce serveur à cela.

Regardez cela, vous pouvez avoir une idée de cela.

c'est du vrai sol


3
C'est lié, mais pas le même problème. L'erreur reçue à l'origine indique que le client se connecte correctement au serveur MySQL, mais échoue ensuite à l'authentification. Si bind-address a été défini sur 127.0.0.1, vous obtiendrez une erreur de connexion refusée à la place.
axone

Mais c'est l'adresse qui permettra à tout l'hôte de se connecter au serveur na?
Kishan Bheemajiyani le

Mais accorder toutes les autorisations à l'utilisateur ne sera pas une option judicieuse pour ce bcoz si vous avez un utilisateur client et que vous n'êtes pas autorisé à créer un utilisateur avec toutes les autorisations, alors quelle serait la solution.?
Kishan Bheemajiyani

1

Si vous exécutez sur Windows; Une solution simple consiste à exécuter l'assistant de configuration d'instance de serveur MySQL. Il se trouve dans votre groupe MYSQL dans le menu Démarrer. Sur l'avant-dernier écran, cliquez sur la case qui dit "autoriser l'accès root à partir de machines distantes".


1

Si vous avez WAMP Server + Windows 10 et que vous l'utilisez pour le développement, cliquez avec le bouton droit sur l'icône Wamp => Wamp Settings=>Check Allow Virtual Hosts other than 127* entrez la description de l'image ici


0

J'étais également confronté au même problème. Je l'ai résolu en 2 min pour moi, je viens de liste blanche ip via cpanel

Supposons que vous essayez de connecter la base de données du serveur B à partir du serveur A. Allez dans Serveur B Cpanel-> Remote MySQL-> entrez l'adresse IP du serveur A et c'est tout.


0

Cette réponse pourrait aider quelqu'un ...

Toutes ces réponses n'ont pas aidé, alors j'ai réalisé que j'avais oublié de vérifier une chose cruciale .. Le port :)

J'ai mysql fonctionnant dans un conteneur de docker fonctionnant sur un port différent. Je pointais vers ma machine hôte sur le port 3306, sur lequel j'ai un serveur mysql. Mon conteneur expose le serveur sur le port 33060. Donc, pendant tout ce temps, je regardais le mauvais serveur! doh!


0
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

cette erreur car aucun mot de passe à la racine, et cela s'est peut-être produit avec vous lorsque vous essayez de vous connecter de l'extérieur.


0

Solution CPANEL

Allez dans Cpanel, recherchez Remote MySQL. Ajoutez l'IP dans le champ de saisie:

Hôte (le caractère générique% est autorisé)

Commentez pour vous souvenir de ce qu'est l'IP. C'était tout pour moi.


0

Cela fonctionne pour toute future connexion mysql à distance!

    sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Accédez à la ligne qui commence par la directive bind-address. Ça devrait ressembler à ça:

    bind-address            = 0.0.0.0

Connectez-vous à votre mysql en tant que terminal racine

    mysql -u root -p
    -- root password

    CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

    CREATE USER 'username'@'%' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

    FLUSH PRIVILEGES;

    EXIT;

enfin Accordez à cette machine l'autorisation exclusive de se connecter à la base de données à distance avec la commande suivante.

    sudo ufw allow from remote_IP_address to any port 3306

-1

Au cas où quelqu'un confronté à ce problème le rencontrerait depuis SQLyog, cela s'est produit:

Je m'étais connecté à la base de données distante (depuis SQLyog) et j'ai travaillé pendant quelques heures. Ensuite, j'ai quitté le système pendant quelques minutes, puis je suis revenu pour continuer mon travail - ERREUR 1130 ! Rien de ce que j'ai essayé n'a fonctionné; Le redémarrage de SQLyog ne l'a pas corrigé. Ensuite, j'ai redémarré le système - cela ne fonctionnait toujours pas.

J'ai donc essayé de me connecter depuis le terminal - cela a fonctionné. Puis réessayé sur SQLyog ... et cela a fonctionné. Je ne peux pas l'expliquer autre que «bizarrerie informatique aléatoire», mais je pense que cela pourrait aider quelqu'un.


-1

si vous essayez d'exécuter la requête mysql sans définir la chaîne de connexion, vous obtiendrez cette erreur.

Vous avez probablement oublié de définir la chaîne de connexion avant l'exécution. avez-vous vérifié cela? (Désolé pour mon mauvais anglais)


-1

Problème: root @ localhost ne parvient pas à se connecter à une nouvelle installation de mysql-community-server sur openSUSE 42.2-1.150.x86_64. Mysql refuse les connexions - point final.

Solution:

$ ls -l /var/lib/mysql/mysql/user.*
-rw-rw---- 1 mysql mysql     0 Apr 29 19:44 /var/lib/mysql/mysql/user.MYD
-rw-rw---- 1 mysql mysql  1024 Apr 29 19:44 /var/lib/mysql/mysql/user.MYI
-rw-rw---- 1 mysql mysql 10684 Apr 29 19:44 /var/lib/mysql/mysql/user.frm

Le fichier user.MYD a une taille 0 (vraiment?!). J'ai copié les 3 fichiers d'un autre système de travail.

$ /usr/sbin/rcmysql stop
$ cd /var/lib/mysql/mysql/
$ scp root@othersytem:/var/lib/mysql/mysql/user.* ./
$ /usr/sbin/rcmysql start
$ cd -
$ mysql -u root -p

J'ai pu me connecter. Ensuite, il s'agissait simplement de réappliquer tous les privilèges de schéma. De plus, si vous avez désactivé IPv6, réactivez-le temporairement afin que le compte root @ :: 1 puisse également fonctionner.


-1

Cela fonctionne pour DirectAdmin ;

  1. Allez à votre DirectAdmin.
  2. Allez à votre MySQL Management.
  3. Sélectionnez votre database.
  4. Sous votre Accesse Hostonglet, il y a un champ. Vous devez remplir ce champ par xxx.xx.xxx.xx.
  5. Cliquez sur Add Host.

Fini. Vous pouvez maintenant accéder à cette base de données par votre your_database_username& your_database_password.
Si simple!


-3

Toutes les réponses ici n'ont pas fonctionné dans mon cas, donc je suis invité à aider d'autres utilisateurs à l'avenir. Cela peut également être un problème dans notre code, pas seulement dans MySQL seul.

Si vous utilisez VB.NET

Au lieu de ce code:

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database

 MysqlConn = New MySqlConnection()

Vous devez vous déplacer MysqlConn = New MySqlConnection()sur la première ligne. Ce serait donc comme ça

 MysqlConn = New MySqlConnection()

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database
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.