MySQL kann keine Verbindung über "localhost" herstellen, nur 127.0.0.1

27

Das ist mir ein Rätsel. Die einzige Möglichkeit, eine Verbindung zu MySQL herzustellen, besteht darin, dass ich sie über "127.0.0.1" aufrufe. Mein PHP-Verbindungsskript funktioniert beispielsweise NICHT mit localhost

Ich verwende Mac OS X Lion, Apache2, MySQL, PHP und 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
quelle
1
Dies ist wahrscheinlich eher auf einen Serverfehler zurückzuführen, stellen Sie jedoch sicher, dass Ihre Hosts-Datei über den Alias ​​localhost verfügt.
Matt
127.0.0.1 localhost befindet sich in meiner hosts-Datei.
Dcolumbus
Öffnen Sie die Eingabeaufforderung und geben Sie Folgendes ein, um zu ping localhostsehen, was darin steht.
Steve Robbins
64 Bytes von 127.0.0.1: icmp_seq = 0 ttl = 64 time = 0.100 ms 64 Bytes von 127.0.0.1: icmp_seq = 1 ttl = 64 time = 0.102 ms 64 Bytes von 127.0.0.1: icmp_seq = 2 ttl = 64 time = 0.096 ms
dcolumbus

Antworten:

26

MySQL versucht, eine Verbindung zum Unix-Socket herzustellen, wenn Sie ihm mitteilen, dass er eine Verbindung zu "localhost" herstellen soll. Wenn Sie ihm mitteilen, dass er eine Verbindung zu 127.0.0.1 herstellen soll, wird er gezwungen, eine Verbindung zum Netzwerk-Socket herzustellen. Wahrscheinlich haben Sie MySQL so konfiguriert, dass nur der Netzwerk-Socket und nicht der Dateisystem-Socket abgehört wird.

Was genau mit deinem Unix-Socket los ist, ist schwer zu sagen. Ich empfehle Ihnen jedoch, diese Seite im MySQL-Referenzhandbuch zu lesen . Dies sollte Ihnen helfen.

UPDATE: Basierend auf der aktualisierten Frage: Der Parameter "socket" sollte ungefähr so ​​lauten: "/var/lib/mysql/mysql.sock". Diese Seite im Referenzhandbuch enthält weitere Informationen.

Hier haben Sie den Anfang meiner /etc/my.cnf-Datei:

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

Ihre Datei sollte ähnlich sein. Dann sollte Ihr Problem gelöst sein. Vergessen Sie nicht, den MySQL-Server neu zu starten, bevor Sie ihn testen.

Raffael Luthiger
quelle
1
Wow: "Eine Unix-Socket-Datei wird verwendet, wenn Sie keinen Hostnamen oder den speziellen Hostnamen localhost angeben." Das scheint ... nicht intuitiv zu sein. Daher alle anderen Antworten.
Mark Wagner
Das ist gut zu wissen +1
Matt
Ich schätze die Theorie ... weiß nur nicht, wie die Antwort lautet.
Dcolumbus
@dcolumbus: Wie ich bereits schrieb, ist es schwer zu sagen. Ich kann Ihnen nur empfehlen, eine Konsole zu öffnen und einfach den Befehl "mysql" zu schreiben. Vielleicht bekommen Sie dann mehr Informationen. Eine andere Sache ist, in die Protokolldatei zu schauen. Meins befindet sich im Verzeichnis / var / log / und heißt mysql.log. Ihre könnte einen anderen Namen oder einen anderen Ort haben. Wenn Sie uns mehr Informationen geben können, können wir Ihnen wahrscheinlich besser helfen.
Raffael Luthiger
2
php.ini enthält Verweise auf "/var/mysql/mysql.sock" (3 Stellen, um genau zu sein), die in "/tmp/mysql.sock" geändert werden müssen ... Vielen Dank für Ihre Hilfe!
dcolumbus
8

Möglicherweise haben Sie IPv6 aktiviert. Der sehr mögliche Localhost wird in den IPv6-Localhost aufgelöst, der in Ihrer msql-Konfiguration nicht definiert ist.

ive hatte auch ein Problem, bei dem ich 'localhost' anstelle von '127.0.0.1' zu den zulässigen Subnetzen für diesen Benutzer hinzufügen musste.

Silberfeuer
quelle
Sie können dies überprüfen, indem Sie prüfen, ob 'host localhost' in der Befehlszeile :: 1 sowie 127.0.0.1 zurückgibt. In diesem Fall können Sie entweder die :: 1-Zuordnung aus / private / etc / hosts entfernen oder MySQL neu konfigurieren, um die IPv6 :: 1-Adresse sowie 127.0.0.1
David North,
Ich erinnere mich, dass ich irgendwo gelesen habe, dass IPv6 unter Mac OS X standardmäßig aktiviert ist. Ist das der Fall?
Dcolumbus
ipv6 ist heutzutage für so ziemlich alle modernen Betriebssysteme aktiviert, ich bin auf osx10.6 und es ist standardmäßig aktiviert.
Silverfire
falsch. Localhost hat eine besondere Bedeutung für MySQL-Clients - siehe serverfault.com/a/295300/67675
poige
5

Für mich ist das in OSX integrierte PHP so konfiguriert, dass es einen anderen Unix-Socket als das MySQL von Homebrew verwendet. Daher kann keine Verbindung über localhost hergestellt werden, der diesen Socket verwendet.

Ich habe es mit einem schnellen Hack behoben, indem ich den von PHP konfigurierten Socket-Pfad so verknüpft habe, dass er auf den zeigt, den MySQL tatsächlich verwendet.

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

Die folgenden Diagnosebefehle waren sehr hilfreich.

Überprüfen Sie die von PHP und MySQL verwendeten Standard-Socket-Pfade:

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

Stellen Sie eine Verbindung über eine bestimmte Steckdose her:

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

Bestimmen Sie, welche Art von Socket-MySQL-Client verwendet, um eine Verbindung herzustellen:

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

Könnten Sie überprüfen mysql/conf/my.conf(die Verzeichnisstruktur sollte unter OSx ziemlich gleich sein), ob keine Kommentare vorhanden skip-networkingsind? #Fügen Sie in diesem Fall ein vor der Zeile ein und starten Sie den mysql-server neu.

Ich hatte tatsächlich vor einiger Zeit ein ähnliches Problem (obwohl das nicht in OSx war), also dachte ich, dass es einen Versuch wert sein könnte.

karllindmark
quelle
1
Warum wurde dies abgelehnt? Eine Erklärung wäre hilfreich.
Karllindmark
Ich habe Sie nicht herabgestimmt, aber Ihre Antwort ist eigentlich das Gegenteil von dem, was das OP verlangt. Aber ich habe dich beleidigt, weil ich mit der gegenteiligen Bedingung zu kämpfen hatte - würde über eine Steckdose verbinden, aber NICHT über ein Netzwerk. Übrigens, ich konnte das NICHT über my.conf reparieren. Ich musste es in die Befehlszeile schreiben: "mysqlf --skip_networking = 0 ..."
Jan Steinman
2

PHP versucht immer noch, den Standard-Socket-Speicherort zu verwenden. Dieses Problem kann auftreten, wenn Sie den Ordner MariaDB / MySQL von / var / lib / mysql an einen anderen Speicherort verschoben haben . Um das Problem zu lösen, müssen Sie den Speicherort des neuen Sockets in der Datei /etc/php.ini definieren .

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

Achten Sie darauf, je nachdem, welchen Treiber Sie verwenden, müssen Sie möglicherweise pdo_mysql.default_socket = angeben !

Um Ihr aktuelles Verzeichnis zu überprüfen, führen Sie den folgenden Befehl in mysql aus:

select @@datadir;
joelschmid
quelle
1

Ist localhost in Ihrer /private/etc/hostsDatei definiert ?

Justin ᚅᚔᚈᚄᚒᚔ
quelle
127.0.0.1 localhost befindet sich in meiner hosts-Datei.
Dcolumbus
4
/private? Noch nie zuvor gesehen
TheLQ
@TheLQ: Es ist eine Mac-Sache. Es gibt zwar einen Symlink von / etc zu / private / etc, aber aus irgendeinem Grund rät Apple im Allgemeinen dazu, den "wahren" Pfad zu verwenden: support.apple.com/kb/TA27291
Justin ᚅᚔᚈᚄᚒᚔ
1

Ich konnte die gleichen Symptome auf meiner Testbox nachvollziehen, dies wird hoffentlich helfen.

In MySQL werden Benutzer durch zwei Teile (Name und Host) definiert. Standardmäßig hat MySQL drei Root-Benutzer:

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                  |
+-----------------------+------+-------------------------------------------+

Das Passwortfeld ist entweder leer (kein Passwort) oder es ist ein Hash gespeichert. Wenn Sie das Passwort für einen bestimmten Benutzer festlegen, werden nicht alle automatisch aktualisiert, da MySQL sie als unterschiedliche Benutzer ansieht.

Beispielsweise:

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

aktualisiert das Passwort für 'root'@'127.0.0.1', aber nicht für 'root'@'localhost'oder'root'@'localhost.localdomain'

Schauen Sie sich die skip_name_resolveVariable an:

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

Standardmäßig skip_name_resolveist OFFund versucht, alle IP-Adressen in Hostnamen aufzulösen. Wenn Sie sich beispielsweise als verbinden 'root'@'127.0.0.1', ändert MySQL Ihre Verbindung als 'root'@'localhost'.

Wenn es ONwird MySQL sehen und verbinden 'root'@'127.0.0.1'und 'root'@'localhost'als separater Benutzer. Je nachdem, wie sie festgelegt wurden, können sie unterschiedliche Kennwörter haben oder auch nicht.


Daher würde ich zuerst prüfen, ob sich das Passwort unterscheidet: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

Wenn dies der Fall ist, können Sie sie beheben oder die Untersuchung fortsetzen.

Dann würde ich prüfen skip_name_resolve: mysql> show variables like 'skip_name_resolve';

Wenn dies der Fall ist ON, würde ich herausfinden, wo es festgelegt ist (zum Beispiel /etc/my.cnf) und es entfernen, sofern es nicht erforderlich ist.

Hoffentlich hilft dir das!

pferieren
quelle
1

Ich hatte dieses Problem und konnte es nicht herausfinden. Ich habe alles versucht, was ich konnte, ohne Erfolg.

Ich stellte fest, dass ich ein .netrc in / root / hatte, das Informationen enthielt.

Ich habe es gelöscht und das Problem ist weg.

Es ist jetzt möglich, sich mit mysql -uroot -p ohne Probleme bei mysql anzumelden.

Ich weiß, dass dies ein alter Beitrag ist, hoffe aber, dass dies jemandem hilft.

Terry
quelle
1

Für mich hat das Ändern der Berechtigungen, die für das übergeordnete Verzeichnis von mysql.sock öffentlich lesbar sein sollen, das Problem behoben:

chmod 755 /var/lib/mysql
zmonteca
quelle
1

Für Benutzer von CageFS mit CloudLinux:

Ich habe es neu erstellt, /var/lib/mysqlweil ich den MySQL-Server von Grund auf neu erstellt habe ...

welches den Pfad von cagefs ausgehängt hat. Ich weiß, dass es nichts damit zu tun hat, aber ich habe cPanel und CloudLinux verwendet. Ich konnte nicht überprüfen, warum die Socket-Verbindung nicht funktioniert, und schließlich wurde mir klar.

Hinzufügen /var/lib/mysqlzu /etc/cagefs/cagefs.mp (falls bereits vorhanden, fahren Sie mit dem nächsten Schritt fort) und Ausführen

cagefsctl --remount-all

Problem behoben

Luka
quelle
1
OH MEIN GOTT! Das hat es für mich behoben! Es war schon drin /etc/cagefs/cagefs.mpaber es wurde repariert cagefsctl --remount-all. Danke, Mann!
Alvaro Flaño Larrondo
0

Sie müssen es in private / etc / hosts definieren, denke ich ... oder verwenden Sie einfach 127.0.0.1, weil es sowieso dasselbe ist, nur ein Alias.

Shackrock
quelle
127.0.0.1 localhost befindet sich in meiner hosts-Datei.
Dcolumbus