MySQL ne peut pas se connecter via «localhost», seulement 127.0.0.1

27

c'est un peu un mystère pour moi. La seule façon de me connecter à MySQL est de l'appeler via "127.0.0.1" ... par exemple, mon script de connexion PHP ne fonctionnera PAS avec localhost

J'utilise Mac OS X Lion, apache2 intégré, MySQL, PHP, phpMyAdmin

mysqladmin:

count                             0
debug-check                       FALSE
debug-info                        TRUE
force                             FALSE
compress                          FALSE
character-sets-dir                (No default value)
default-character-set             auto
host                              (No default value)
no-beep                           FALSE
port                              0
relative                          FALSE
socket                            (No default value)
sleep                             0
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
user                              (No default value)
verbose                           FALSE
vertical                          FALSE
connect-timeout                   43200
shutdown-timeout                  3600
plugin-dir                        (No default value)
default-auth                      (No default value)
dcolumbus
la source
1
C'est probablement plus pour la faute du serveur, mais assurez-vous que votre fichier hosts a l'alias localhost.
Matt
127.0.0.1 localhost est dans mon fichier d'hôtes.
dcolumbus
Ouvrez l'invite de commande et tapez ping localhostet voyez ce qu'il dit.
Steve Robbins
64 octets à partir de 127.0.0.1: icmp_seq = 0 ttl = 64 temps = 0,100 ms 64 octets à partir de 127.0.0.1: icmp_seq = 1 ttl = 64 temps = 0,102 ms 64 octets à partir de 127.0.0.1: icmp_seq = 2 ttl = 64 temps = 0,096 ms
dcolumbus

Réponses:

26

MySQL essaiera de se connecter à la socket unix si vous lui dites de se connecter à "localhost". Si vous lui dites de se connecter à 127.0.0.1, vous le forcez à se connecter à la prise réseau. Vous avez donc probablement configuré MySQL pour n'écouter que le socket réseau et non le socket du système de fichiers.

Ce qui ne va pas exactement avec votre socket Unix est difficile à dire. Mais je vous recommande de lire cette page sur le guide de référence MySQL. Cela devrait vous aider.

MISE À JOUR: Basé sur la question mise à jour: Le paramètre "socket" devrait être quelque chose comme ceci: "/var/lib/mysql/mysql.sock". Cette page du Manuel de référence contient plus d'informations.

Voici le début de mon fichier /etc/my.cnf:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

Votre fichier doit être similaire. Ensuite, votre problème devrait être résolu. N'oubliez pas de redémarrer le serveur MySQL avant de le tester.

Raffael Luthiger
la source
1
Wow: "Un fichier socket Unix est utilisé si vous ne spécifiez pas de nom d'hôte ou si vous spécifiez le nom d'hôte spécial localhost." Cela semble ... peu intuitif. D'où toutes les autres réponses.
Mark Wagner
C'est bon à savoir +1
Matt
J'apprécie la théorie ... je ne sais pas quelle est la réponse.
dcolumbus
@dcolumbus: Comme je l'ai déjà écrit, c'est difficile à dire. Ce que je peux vous recommander, c'est d'ouvrir une console et d'écrire simplement la commande "mysql". Peut-être obtiendrez-vous alors plus d'informations. Une autre chose est de regarder dans le fichier journal. Le mien se trouve dans le répertoire / var / log / et s'appelle mysql.log. Le vôtre pourrait avoir un autre nom ou un autre emplacement. Si vous pouvez nous fournir plus d'informations, nous pouvons probablement vous aider mieux.
Raffael Luthiger
2
php.ini a des références à "/var/mysql/mysql.sock" (3 endroits pour être exact) qui doivent être changées en "/tmp/mysql.sock" ... Merci pour votre aide!
dcolumbus
8

Vous pouvez avoir activé IPv6, son hôte local très possible se résout en hôte local ipv6, qui n'est pas défini dans votre configuration msql.

ive a également eu un problème où j'ai dû ajouter 'localhost' à la place de '127.0.0.1' aux sous-réseaux autorisés pour cet utilisateur, je ne comprends pas pourquoi (j'utilisais ipv4 et c'était il y a un certain temps) mais ça vaut le coup d'essayer.

Silverfire
la source
Vous pouvez vérifier cela en voyant si 'host localhost' sur la ligne de commande renvoie :: 1 ainsi que 127.0.0.1. Si c'est le cas, vous pouvez soit supprimer le mappage :: 1 de / private / etc / hosts ou reconfigurer MySQL pour écouter sur l'adresse IPv6 :: 1 ainsi que 127.0.0.1
David North
Je pense que je me souviens avoir lu quelque part que IPv6 est activé par défaut sur Mac OS X ... est-ce le cas?
dcolumbus
ipv6 est activé pour à peu près tous les systèmes d'exploitation modernes de nos jours, im sur osx10.6 et son activé par défaut.
Silverfire
faux. Localhost a une signification particulière pour les clients mysql - consultez serverfault.com/a/295300/67675
poige
5

Pour moi, le php intégré d'OSX est configuré pour utiliser un socket Unix différent de mysql de homebrew. Ainsi, il ne peut pas se connecter via localhost qui utilise cette socket.

Je l'ai corrigé avec un hack rapide en associant le chemin de socket configuré par php pour pointer vers celui que mysql utilise réellement.

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

Les commandes de diagnostic suivantes ont été très utiles.

Vérifiez les chemins de socket par défaut utilisés par php et mysql:

php -i | fgrep 'mysql.default_socket'
mysql -e 'show variables where variable_name = "socket"'

Connectez-vous à l'aide d'une prise spécifiée:

php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "user", "pass"));'
mysql --socket=/tmp/mysql.sock

Déterminez le type de socket que le client mysql utilise pour se connecter:

lsof | egrep '^mysql .*(IPv|unix)'
soliton_zero
la source
2

Pourriez-vous vérifier mysql/conf/my.conf(la structure du répertoire devrait être à peu près la même sur OSx) pour voir si elle skip-networkingn'est pas commentée? Si c'est le cas, ajoutez un #devant la ligne et redémarrez le serveur mysql.

J'ai eu un problème similaire il y a quelque temps (bien que ce ne soit pas sous OSx), donc j'ai pensé que ça valait le coup.

karllindmark
la source
1
Pourquoi cela a-t-il été rejeté? Une explication serait utile.
karllindmark
Je ne vous ai pas voté à la baisse, mais votre réponse est en fait l'opposé de ce que demande le PO. Mais je vous ai voté parce que je me débattais avec la condition opposée - se connecter via une prise, mais PAS via le réseau. Soit dit en passant, je ne pourrais pas résoudre ce problème via my.conf; Je devais le mettre sur la ligne de commande: "mysqlf --skip_networking = 0 ..."
Jan Steinman
2

PHP essaie toujours d'utiliser l'emplacement de socket par défaut. Ce problème peut apparaître si vous avez déplacé le dossier MariaDB / MySQL de / var / lib / mysql vers un autre emplacement. Afin de résoudre le problème, vous devez définir l'emplacement du nouveau socket dans le fichier /etc/php.ini .

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

Attention, selon le pilote que vous utilisez, vous devrez peut-être spécifier pdo_mysql.default_socket = !

Afin de vérifier votre répertoire actuel, exécutez la commande suivante dans mysql:

select @@datadir;
joelschmid
la source
1

L'hôte local est-il défini dans votre /private/etc/hostsfichier?

Justin ᚅᚔᚈᚄᚒᚔ
la source
127.0.0.1 localhost est dans mon fichier d'hôtes.
dcolumbus
4
/private? Jamais vu ça auparavant
TheLQ
@TheLQ: C'est une chose Mac. Bien qu'il existe un lien symbolique de / etc vers / private / etc, pour une raison quelconque, Apple conseille généralement d'utiliser le "vrai" chemin: support.apple.com/kb/TA27291
Justin ᚅᚔᚈᚄᚒᚔ
1

J'ai pu recréer vos mêmes symptômes sur ma boîte de test, j'espère que cela vous aidera.

Dans MySQL, les utilisateurs sont définis en deux parties (nom et hôte). Par défaut, MySQL aura 3 utilisateurs root:

mysql> SELECT host,user,password FROM mysql.user WHERE user='root';
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root |                                           |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root | *PASSWORD_HASH_GOES_HERE                  |
+-----------------------+------+-------------------------------------------+

Le champ du mot de passe sera soit vide (pas de mot de passe), soit un hachage sera stocké. Si vous définissez le mot de passe pour un utilisateur spécifique, il ne met pas automatiquement à jour tous, car MySQL les voit comme des utilisateurs différents.

Par exemple:

mysql> set password for 'root'@'127.0.0.1' = password('Password');

mettra à jour le mot de passe pour 'root'@'127.0.0.1', mais pas 'root'@'localhost'ou'root'@'localhost.localdomain'

Jetez un oeil à la skip_name_resolvevariable:

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

Par défaut skip_name_resolveest OFF, et va tenter de résoudre toutes les adresses IP aux noms d' hôtes. Par exemple, si vous vous connectez en tant que 'root'@'127.0.0.1', MySQL changera vous connecter en tant que 'root'@'localhost'.

Si c'est le cas ON, MySQL verra et se connectera 'root'@'127.0.0.1'et en 'root'@'localhost'tant qu'utilisateurs séparés. Et ils peuvent ou non avoir des mots de passe différents, selon la façon dont ils ont été définis.


Donc, tout d'abord, je vérifierais les différences de mot de passe: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

Si tel est le cas, vous pouvez les corriger ou poursuivre l'enquête.

Ensuite, je vérifierais skip_name_resolve: mysql> show variables like 'skip_name_resolve';

Si c'est le cas ON, je saurais où il est placé (par exemple /etc/my.cnf) et le supprimer, à moins qu'il ne soit nécessaire.

J'espère que ceci vous aidera!

pferate
la source
1

J'avais ce problème et je ne pouvais pas le comprendre. J'ai tout essayé en vain.

J'ai trouvé que j'avais un .netrc dans / root / qui contenait des informations.

Je l'ai supprimé et le problème a disparu.

Capable de se connecter à mysql en utilisant mysql -uroot -p sans problème maintenant.

Je sais que c'est un vieux post mais j'espère que cela aide quelqu'un.

Terry
la source
1

Pour moi, changer les autorisations pour qu'elles soient publiquement lisibles sur le répertoire parent de mysql.sock a résolu le problème:

chmod 755 /var/lib/mysql
zmonteca
la source
1

Pour les personnes qui utilisent CageFS avec CloudLinux:

J'ai recréé /var/lib/mysqlparce que je reconstruisais le serveur MySQL à partir de zéro ...

qui a démonté le chemin de cagefs. Je sais que ce n'est pas lié, mais j'utilisais cPanel et CloudLinux. Je n'ai pas pu vérifier pourquoi la connexion socket ne fonctionne pas, et finalement, j'ai réalisé.

ajouter /var/lib/mysqlà /etc/cagefs/cagefs.mp (s'il existe déjà, passer à l'étape suivante) et exécuter

cagefsctl --remount-all

résolu le problème

Luka
la source
1
OMG! C'est ce qui l'a réparé pour moi! Il était déjà en /etc/cagefs/cagefs.mpcours mais fonctionnait cagefsctl --remount-allcorrigé. Merci mec!
Alvaro Flaño Larrondo
0

vous devez le définir dans / etc / hosts privé je pense ... ou simplement utiliser 127.0.0.1 parce que c'est la même chose de toute façon, juste un alias.

Shackrock
la source
127.0.0.1 localhost est dans mon fichier d'hôtes.
dcolumbus