it-swarm.com.de

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

das ist mir ein Rätsel. Die einzige Möglichkeit, eine Verbindung zu MySQL herzustellen, besteht darin, sie über "127.0.0.1" aufzurufen. Beispielsweise funktioniert mein Verbindungsskript PHP connect) NICHT mit localhost

Ich verwende Mac OS X Lion, integriertes Apache2, 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)
27
dcolumbus

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, müssen Sie eine Verbindung zum Netzwerk-Socket herstellen. Wahrscheinlich haben Sie MySQL so konfiguriert, dass es nur den Netzwerk-Socket und nicht den Dateisystem-Socket abhört.

Was genau mit Ihrem Unix-Socket nicht stimmt, 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 Datei /etc/my.cnf:

[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.

26

Möglicherweise ist IPv6 aktiviert. Der sehr mögliche lokale Host wird in den ipv6-lokalen Host aufgelöst, der in Ihrer msql-Konfiguration nicht definiert ist.

ich 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. Ich verstehe nicht warum (ich habe ipv4 verwendet und es war vor einer Weile), aber es ist einen Versuch wert.

8
Silverfire

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

Ich habe es mit einem schnellen Hack behoben, indem ich den konfigurierten Socket-Pfad von PHP mit dem verknüpften verknüpft habe, der auf den tatsächlich verwendeten MySQL-Pfad verweist.

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

Die folgenden Diagnosebefehle waren sehr hilfreich.

Überprüfen Sie die Standard-Socket-Pfade, die von PHP und MySQL verwendet werden:

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

Verbinden Sie sich mit einem angegebenen Socket:

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 für die Verbindung verwendet wird:

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

PHP versucht immer noch, den Standard-Socket-Speicherort zu verwenden. Dieses Problem kann auftreten, wenn Sie den Ordner MariaDB/MySQL verschoben haben 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

Je nachdem, welchen Treiber Sie verwenden, müssen Sie möglicherweise den pdo_mysql.default_socket = angeben!

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

select @@datadir;
2
joelschmid

Könntest du prüfen mysql/conf/my.conf (die Verzeichnisstruktur sollte unter OSx ziemlich gleich sein), um zu sehen, ob skip-networking ist unkommentiert? Wenn ja, fügen Sie ein # vor der Zeile und starten Sie den MySQL-Server neu.

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

2
karllindmark

Ich konnte dieselben Symptome auf meiner Testbox nachbilden, hoffentlich hilft dies.

In MySQL werden Benutzer durch zwei Teile definiert (Name und Host). Standardmäßig hat MySQL 3 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 Kennwort für einen bestimmten Benutzer festlegen, werden nicht alle automatisch aktualisiert, da MySQL sie als unterschiedliche Benutzer betrachtet.

Zum Beispiel:

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 Variable skip_name_resolve An:

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

Standardmäßig ist skip_name_resolveOFF und versucht, alle IP-Adressen in Hostnamen aufzulösen. Wenn Sie beispielsweise eine Verbindung als 'root'@'127.0.0.1' Herstellen, ändert MySQL die Verbindung als 'root'@'localhost'.

Wenn es ON ist, sieht und verbindet MySQL 'root'@'127.0.0.1' Und 'root'@'localhost' Als separate Benutzer. Und sie können unterschiedliche Passwörter haben oder nicht, je nachdem, wie sie festgelegt wurden.


Also würde ich zuerst nach Passwortunterschieden suchen: 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 skip_name_resolve Überprüfen: mysql> show variables like 'skip_name_resolve';

Wenn es ON ist, würde ich herausfinden, wo es gesetzt ist (zum Beispiel /etc/my.cnf) Und es entfernen, es sei denn, es besteht Bedarf.

Hoffentlich hilft dir das!

1
pferate

Ist localhost in Ihrem /private/etc/hosts Datei?

Für Benutzer von CageFS mit CloudLinux:

Ich habe /var/lib/mysql weil ich den MySQL Server von Grund auf neu aufgebaut habe ...

was den Pfad von Cagefs abmontierte. 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 von /var/lib/mysql bis /etc/cagefs/cagefs.mp (falls bereits vorhanden, weiter mit dem nächsten Schritt) und Ausführen

cagefsctl --remount-all

das Problem wurde behoben

1
Luka

Durch Ändern der Berechtigungen, die im übergeordneten Verzeichnis von mysql.sock öffentlich lesbar sind, wurde das Problem behoben:

chmod 755 /var/lib/mysql
1
zmonteca

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

Ich fand heraus, dass ich eine .netrc in/root/hatte, die Informationen enthielt.

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

Kann sich jetzt ohne Probleme mit mysql -uroot -p bei mysql anmelden.

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

1
Terry

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

0
Shackrock