Connexions à distance Mysql Ubuntu

95

Pour une raison quelconque, je n'ai pas pu me connecter à distance à mon serveur MySQL. J'ai tout essayé et j'ai toujours des erreurs.

root@server1:/home/administrator# mysql -u monty -p -h www.ganganadores.cl
Enter password:
ERROR 1045 (28000): Access denied for user 'monty'@'server1.ganganadores.cl' (using password: YES)

Maintenant, j'ai essayé de courir

 GRANT ALL ON *.* to monty@localhost IDENTIFIED BY 'XXXXX'; 
 GRANT ALL ON *.* to monty@'%' IDENTIFIED BY 'XXXXXX';` 

et toujours rien! Qu'est-ce que je fais mal?

EDIT : my.cnfa commenté l'IP de liaison.

Cristian Eduardo Lehuede Lyon
la source
quelle version de MySQL utilisez-vous?
Steve
Version serveur: 5.5.29-0ubuntu0.12.10.1 (Ubuntu)
Cristian Eduardo Lehuede Lyon
que renvoie cette commande? ubuntu ~ $ sudo lsof -i -P | grep: 3306
apesa

Réponses:

345

Pour exposer MySQL à autre chose que localhost, vous devrez avoir la ligne suivante

Pour mysql version 5.6 et inférieure

non commenté /etc/mysql/my.cnfet attribué à l'adresse IP de votre ordinateur et non en boucle

Pour mysql version 5.7 et supérieure

non commenté /etc/mysql/mysql.conf.d/mysqld.cnfet attribué à l'adresse IP de votre ordinateur et non en boucle

#Replace xxx with your IP Address 
bind-address        = xxx.xxx.xxx.xxx

Ou ajoutez un bind-address = 0.0.0.0si vous ne souhaitez pas spécifier l'adresse IP

Puis arrêtez et redémarrez MySQL avec la nouvelle entrée my.cnf. Une fois lancé, accédez au terminal et entrez la commande suivante.

lsof -i -P | grep :3306

Cela devrait revenir quelque chose comme ça avec votre adresse IP réelle dans les xxx

mysqld  1046  mysql  10u  IPv4  5203  0t0  TCP  xxx.xxx.xxx.xxx:3306 (LISTEN)

Si la déclaration ci-dessus revient correctement, vous pourrez alors accepter des utilisateurs distants. Cependant, pour qu'un utilisateur distant se connecte avec les privilèges appropriés, vous devez avoir cet utilisateur créé à la fois dans l'hôte local et dans '%' comme dans.

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

puis,

GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';

et enfin,

FLUSH PRIVILEGES; 
EXIT;

Si vous n'avez pas créé le même utilisateur que ci-dessus, lorsque vous vous connectez localement, vous pouvez hériter des privilèges de base localhost et avoir des problèmes d'accès. Si vous souhaitez restreindre l'accès à myuser, vous devez lire la syntaxe de l'instruction GRANT ICI .

REMARQUE: Si lsof ne retourne pas ou n'est pas trouvé, vous pouvez l'installer ICI en fonction de votre distribution Linux. Vous n'avez pas besoin de lsof pour faire fonctionner les choses, mais c'est extrêmement pratique lorsque les choses ne fonctionnent pas comme prévu.

Apesa
la source
1
Merci, même si j'ai suivi correctement ces étapes la première fois, je les ai refaites comme vous avez posté et travaillé comme un charme!
Cristian Eduardo Lehuede Lyon
14
Pour toute autre personne ayant des difficultés lsof -i -P | grep :3306, cela n'a pas fonctionné mais la connexion à distance fonctionne toujours correctement sans cette confirmation, ignorez si vous ne voyez pas la sortie appropriée.
Mike S
@Mike Slutsky Merci pour la note, j'ai édité ma réponse. Vous pouvez installer lsof s'il n'est pas déjà installé.
apesa le
2
FWIW sur de nombreux systèmes sudo lsof -i -Psera beaucoup plus utile que lsof -i -P(en supposant que vous soyez connecté en tant qu'utilisateur non privilégié).
Dan Passaro
2
lsof -i -P | grep :3306ne renvoie rien!
Vert
39

Ajoutez quelques points en plus de l'excellent article d'apesa:

1) Vous pouvez utiliser la commande ci-dessous pour vérifier l'adresse IP que le serveur mysql écoute

netstat -nlt | grep 3306

sample result:

tcp 0  0  xxx.xxx.xxx.xxx:3306  0.0.0.0:*   LISTEN

2) Utilisez FLUSH PRIVILEGESpour forcer le chargement des tables d'octroi si, pour une raison quelconque, les modifications ne prennent pas effet immédiatement

GRANT ALL ON *.* TO 'user'@'localhost' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
FLUSH PRIVILEGES; 
EXIT;

user == l'utilisateur que vous utilisez pour vous connecter à mysql ex.root
passwd == le mot de passe que vous utilisez pour vous connecter à mysql avec

3) Si le pare-feu netfilter est activé ( sudo ufw enable) sur la machine serveur mysql, procédez comme suit pour ouvrir le port 3306 pour un accès à distance:

sudo ufw allow 3306

vérifier l'état en utilisant

sudo ufw status

4) Une fois qu'une connexion à distance est établie, elle peut être vérifiée sur une machine client ou serveur à l'aide de commandes

netstat -an | grep 3306
netstat -an | grep -i established
Jonathan L
la source
3
Cela m'a sauvé toute la journée! Merci pour sudo ufw status!!
Riddhiman Adib
netstat -nlt | grep 3306retourne vide
João Pimentel Ferreira
@ João Pimentel Ferreira assurez-vous que mysql fonctionne en premier, utilisez la commande "/etc/init.d/mysql status" pour vérifier
Jonathan L
8

MySQL n'écoute que localhost, si nous voulons activer l'accès à distance, nous devons apporter des modifications dans le fichier my.cnf:

sudo nano /etc/mysql/my.cnf

Nous devons commenter les lignes bind-address et skip-external-lock:

#bind-address = 127.0.0.1
# skip-external-locking

Après avoir effectué ces modifications, nous devons redémarrer le service mysql:

sudo service mysql restart
Vinh Lee
la source
1
assurez-vous de commenterskip-external-locking
calebeaires
1
Je n'ai pas commenté le verrouillage externe et cela fonctionne toujours.
Marcia Ong
J'ai dû le changer dans /etc/mysql/mysql.conf.d
Bartando
le mien est cet endroit:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Lester
1

Si vous testez sous Windows, n'oubliez pas d'ouvrir le port 3306.

marbrer
la source
Ah vous êtes un génie, c'est SUPER important si vous utilisez le sous-système Windows pour Linux, vous devez ouvrir le port 3306 pour le trafic entrant via le pare-feu Windows, et aucune des choses ci-dessus pour vérifier si MySQL écoute fonctionne avec le sous
Brian Leishman
1

Vous utilisez ubuntu 12 (assez ancien)

Tout d'abord, ouvrez le fichier /etc/mysql/mysql.conf.d/mysqld.cnf ( /etc/mysql/my.cnf dans Ubuntu 14.04 et les versions antérieures

Sous [mysqld] Localisez la ligne, bind-address = 127.0.0.1 Et changez-la en, bind-address = 0.0.0.0 ou commentez-la

Ensuite, redémarrez le serveur Ubuntu MysQL systemctl restart mysql.service

Maintenant, Ubuntu Server autorisera l'accès à distance au serveur MySQL, mais vous devez toujours configurer les utilisateurs MySQL pour autoriser l'accès à partir de n'importe quel hôte.

L'utilisateur doit être 'username'@'%' de toutes les subventions requises

Pour vous assurer que le serveur MySQL écoute sur toutes les interfaces, exécutez la commande netstat comme suit.

netstat -tulnp | grep mysql

J'espère que cela fonctionne!

Gaurav Singh
la source