MySQL-Verbindung funktioniert nicht: 2002 Keine solche Datei oder kein solches Verzeichnis

105

Ich versuche WordPress einzurichten. Ich habe Apache und MySQL ausgeführt und die Konten und die Datenbank sind alle eingerichtet. Ich habe versucht, eine einfache Verbindung herzustellen:

<?php
    $conn = mysql_connect('localhost', 'USER', 'PASSWORD');
    if(!$conn) {
        echo 'Error: ' . mysql_errno() . ' - ' . mysql_error();
    }
?>

Und das verstehe ich immer:

Fehler: 2002 - Keine solche Datei oder kein solches Verzeichnis

Über welche Datei oder welches Verzeichnis könnte es sprechen?

Ich bin auf einem OS X Snow Leopard und verwende den eingebauten Apache. Ich habe MySQL mit dem x86_64 dmg installiert.

UPDATE: Ich habe festgestellt, dass sich der Socket unter /tmp/mysql.sock befindet. In php.ini habe ich daher alle Vorkommen des falschen Pfads durch dieses ersetzt.

mk12
quelle
2
Bitte fügen Sie die Ausgabe von ein, /etc/init.d/mysql startwenn Sie sich in einer Debian-Basisdistribution befinden. Wenn dies fehlschlägt, überprüfen Sie die /etc/my.cnfDatei auf den richtigen Pfad für die MySQL-Socket-Datei.
September
4
löste das gleiche Problem unter OS X mit XAMPP unter Verwendung von "127.0.0.1" anstelle von "localhost".
Giuseppe Urso

Antworten:

96

Wenn Sie Linux verwenden: Der Pfad zur Datei mysql.sock ist falsch. Dies liegt normalerweise daran, dass Sie (LAMPP) XAMPP verwenden und es nicht in /tmp/mysql.sock enthalten ist

Öffnen Sie die Datei php.ini und suchen Sie diese Zeile:

mysql.default_socket

Und mach es

mysql.default_socket = /path/to/mysql.sock
Alec-Schlucht
quelle
5
Wenn Sie sich nicht sicher sind, versuchen Sie /var/lib/mysql/mysql.sock als neuen Pfad zum Socket.
Jay
1
Hmm. Vielleicht meinten sie Leopard oder Tiger. Auf jeden Fall viel Spaß mit WordPress!
Alec Gorge
3
Beachten Sie, dass Sie möglicherweise mysqli.default_socket = /path/to/mysql.sock festlegen müssen, wenn Sie eine Verbindung mit mysqli
herstellen
2
Der Standardspeicherort für eine Standard-MySQL-Installation ist /tmp/mysql.sock.
Jonathon Hill
4
"Der Hostname localhost hat eine besondere Bedeutung. Er ist an die Verwendung von Unix-Domain-Sockets gebunden. Es ist nicht möglich, eine TCP / IP-Verbindung mit dem Hostnamen localhost zu öffnen. Sie müssen stattdessen 127.0.0.1 verwenden." - php.net/manual/en/mysqli.quickstart.connections.php . Grundsätzlich funktioniert also etwas nicht mit der Verbindung zu den Unix-Domain-Sockets, die localhostfunktionieren, und TCP / IP funktioniert, sodass das Ändern in die TCP / IP-Adresse 127.0.0.1funktioniert.
Edward
154

Ich hatte ein ähnliches Problem und konnte es lösen, indem ich meine MySQL mit 127.0.0.1statt adressierte localhost.

Dies bedeutet wahrscheinlich, dass in meinem Host-Setup etwas nicht stimmt, aber diese schnelle Lösung bringt mich sofort zum Laufen.

bryan kennedy
quelle
2
Du hast mir gerade wertvolle Zeit gespart.
Uchamp
2
Ich habe meine Hosts-Datei überprüft und eine Zeile mit code127.0.0.1 localhost gefunden code. Was mich neugierig macht, warum das Verbinden über localhost nicht funktioniert hat. Wenn mich jemand aufklären könnte, wäre ich glücklich.
Ola
2
Dies liegt daran, dass mysql.default_socket in php.ini falsch ist. Führen Sie "php -i | grep mysql.default_socket"
Jonah
1
Das hat bei mir funktioniert, ich bin auf el Capitan mit MySQL 5.7 installiert über Homebrew. Ich habe versucht, eine WP-Installation durchzuführen, und als ich "localhost" in "127.0.0.1" geändert habe, konnte eine Verbindung hergestellt werden.
Dgig
5
"Der Hostname localhost hat eine besondere Bedeutung. Er ist an die Verwendung von Unix-Domain-Sockets gebunden. Es ist nicht möglich, eine TCP / IP-Verbindung mit dem Hostnamen localhost zu öffnen. Sie müssen stattdessen 127.0.0.1 verwenden." - php.net/manual/en/mysqli.quickstart.connections.php . Grundsätzlich funktioniert also etwas nicht mit der Verbindung zu den Unix-Domain-Sockets, die localhostfunktionieren, und TCP / IP funktioniert, sodass das Ändern in die TCP / IP-Adresse 127.0.0.1funktioniert.
Edward
39

Dies ist für Mac OS X mit der nativen Installation von Apache HTTP und der benutzerdefinierten Installation von MySQL .

Die Antwort basiert auf der hervorragenden Antwort von @ alec-Canyon. Da ich jedoch einige spezifische Änderungen googeln musste, um sie in meiner Konfiguration zu konfigurieren, hauptsächlich Mac OS X-spezifisch, dachte ich, ich würde sie der Vollständigkeit halber hier hinzufügen.

Aktivieren Sie die PHP5-Unterstützung für Apache HTTP

Stellen Sie sicher, dass die PHP5-Unterstützung in aktiviert ist /etc/apache2/httpd.conf.

Bearbeiten Sie die Datei mit sudo vi /etc/apache2/httpd.conf(geben Sie das Passwort ein, wenn Sie dazu aufgefordert werden) und kommentieren Sie ;die Zeile aus (entfernen Sie sie vom Anfang), um die zu laden kommentieren Sie Modul php5_module .

LoadModule php5_module libexec/apache2/libphp5.so

Starten Sie Apache HTTP mit sudo apachectl start(oder restartwenn es bereits gestartet ist und neu gestartet werden muss, um die Konfigurationsdatei erneut zu lesen).

/var/log/apache2/error_logStellen Sie sicher, dass eine Zeile enthält, die angibt, dass das php5_module aktiviert ist - das sollten Sie sehenPHP/5.3.15 (oder ähnliches).

[notice] Apache/2.2.22 (Unix) DAV/2 PHP/5.3.15 with Suhosin-Patch configured -- resuming normal operations

Nachschlagen des Namens der Socket-Datei

Wenn MySQL läuft (mit ./bin/mysqld_safe ), sollten Debug-Zeilen auf der Konsole ausgedruckt werden, die Ihnen mitteilen, wo Sie die Protokolldateien finden. Notieren Sie den Hostnamen im Dateinamen - localhostin meinem Fall - der für Ihre Konfiguration unterschiedlich sein kann.

Die folgende Datei Logging toist wichtig. Hier protokolliert MySQL seine Arbeit.

130309 12:17:59 mysqld_safe Logging to '/Users/jacek/apps/mysql/data/localhost.err'.
130309 12:17:59 mysqld_safe Starting mysqld daemon with databases from /Users/jacek/apps/mysql/data

Öffnen Sie die localhost.errDatei (auch hier kann Ihre Datei anders benannt sein), dh tail -1 /Users/jacek/apps/mysql/data/localhost.errum den Namen der Socket-Datei herauszufinden - es sollte die letzte Zeile sein.

$ tail -1 /Users/jacek/apps/mysql/data/localhost.err
Version: '5.5.27'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)

Beachten Sie den socket:Teil - das ist die Socket-Datei, in der Sie verwenden solltenphp.ini .

Es gibt eine andere Möglichkeit (einige sagen eine einfachere Möglichkeit), den Speicherort des Dateinamens des Sockets zu bestimmen, indem Sie sich bei MySQL anmelden und ausführen:

show variables like '%socket%';

Konfigurieren von PHP5 mit MySQL-Unterstützung - /etc/php.ini

Apropos php.ini ...

Im /etcVerzeichnis befindet sich die Datei /etc/php.ini.default . Kopieren Sie es in /etc/php.ini .

sudo cp /etc/php.ini.default /etc/php.ini

Öffnen Sie /etc/php.iniund suchen Sie nach mysql.default_socket .

sudo vi /etc/php.ini

Der Standardwert mysql.default_socketist /var/mysql/mysql.sock. Sie sollten es auf den Wert ändern, den Sie zuvor notiert haben - es war /tmp/mysql.sockin meinem Fall.

Ersetzen Sie die /etc/php.iniDatei, um den Namen der Socket-Datei wiederzugeben:

mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock

Endgültige Überprüfung

Starten Sie Apache HTTP neu.

sudo apachectl restart 

Überprüfen Sie die Protokolle, wenn kein Fehler in Bezug auf PHP5 vorliegt. Keine Fehler bedeuten, dass Sie fertig sind und PHP5 mit MySQL gut funktionieren sollte. Glückwunsch!

Jacek Laskowski
quelle
Diese Antwort hilft
Vigneshwaran
Diese Antwort ist Mist. Es hat nichts mit der gestellten Frage zu tun und ist im Grunde nur ein (acos) Amp-Tutorial, das - wenn es gut ist - noch mehr verschwendet wird, wenn es hier platziert wird und nicht an einem Ort, an dem Leute, die tatsächlich nach dem Einrichten eines Amp-Stacks suchen Macos schauen. In Bezug auf die gestellte Frage: Diese Antwort erklärt nicht, warum der Fehler auftritt und warum PHP versucht, eine Verbindung über den Socket anstelle des Hostnamens herzustellen, obwohl dies an übergeben wird. Dies mysql_connectist das eigentliche Problem der ursprünglichen Frage und kein generisches Missverständnis der Installation von Software.
Ohcibi
@ohcibi Ich schrieb "Ich dachte, ich würde es der Vollständigkeit halber hier hinzufügen." und dachte, es wäre genug (und angesichts der positiven Stimmen mochten es einige Leute). Ich mag Ihre Idee, die Antwort leichter zu finden, aber ich weiß nicht wie. Könnten Sie Ihre Gedanken teilen und mir helfen ... wieder? Vielen Dank!
Jacek Laskowski
@JacekLaskowski im Allgemeinen: Schreiben Sie einen Blog-Beitrag und kommentieren Sie einen Link zu der akzeptierten / am besten bewerteten Antwort mit der gleichen Absicht, die Sie hier hatten ("der Vollständigkeit halber hinzufügen"). Aber in diesem Thread sehe ich nicht einmal einen Grund, diesen Link zu posten. Das OP sagte, dass er macOS verwendet, aber dieses Problem hat überhaupt nichts mit einem Betriebssystem zu tun, außer mit der Art und Weise, wie mySQL interpretiert localhost. Niemand, der Hilfe beim Einrichten von xamp auf Macos sucht, wird durch Googeln hierher kommen. Daher habe ich den Begriff "Mist" verwendet. Dieser Thread hat überhaupt nichts mit Macos zu tun, sondern nur mit MySQL (nicht einmal PHP).
Ohcibi
14

Das Ersetzen von 'localhost' durch '127.0.0.1' in der Konfigurationsdatei (Datenbankverbindung) hat geholfen!

Oleg
quelle
1
aber warum sollte es geholfen werden?
Enamul Hassan
"Ersetzen von 'localhost' durch '127.0.0.1'" oder 127.0.0.1 durch die tatsächliche MySQL-Serveradresse, dh u55151.mysql.someserver.eu.
user2812532
13

Ein Neustart des MySQL-Servers kann hilfreich sein. In meinem Fall hat der Neustart des Servers viel Zeit gespart.

service mysql restart

PS-Verwendung sudo service mysql restartfür Nicht-Root-Benutzer.

Avani Khabiya
quelle
2
Es ist so toll, wenn die einfache Lösung tatsächlich funktioniert.
Abalter
10

Stellen Sie zunächst sicher, dass MySQL ausgeführt wird. Befehl: mysqld start

Wenn Sie immer noch keine Verbindung herstellen können: Wie sieht Ihre /etc/my.cnf aus? (oder /etc/msyql/my.cnf)

Die anderen 2 Beiträge sind insofern korrekt, als Sie Ihren Socket überprüfen müssen, da 2002 ein Socket-Fehler ist.

Ein großartiges Tutorial zum Einrichten von LAMP ist: http://library.linode.com/lamp-guides/centos-5.3/index-print

Todd Moses
quelle
Das Installationsprogramm hat keine my.cnf-Datei abgelegt, es gibt jedoch eine /usr/local/mysql/mysql-test/include/default_my.cnf, sollte ich diese als my.cnf kopieren /etc?
mk12
Ja, aber möglicherweise müssen Sie es später ändern.
Todd Moses
7

Nicht, dass es Ihnen viel hilft, aber in den neueren Versionen (und noch weniger neueren Versionen ) von MySQL bedeutet Fehlercode 2002 "Keine Verbindung zum lokalen MySQL-Server über Socket [Name des Sockets] möglich" ein bisschen mehr.

Arthur Reutenauer
quelle
1
Unter OSX 10.9.x mit MySQL 5.5.38, das von der Quelle installiert wurde, wurde dieser Fehler angezeigt. Dieser Tipp war richtig: Es handelt sich um ein Socket-Problem, obwohl mysqli_connect_errno () und mysqli_connect_error ()) die Meldung "Datei 2002 nicht gefunden" angaben. Ich konnte dies beheben, indem ich meine Datei /etc/php.ini bearbeitete und mysql.default_socket AND mysqli.default_socket auf den korrekten Socket-Wert setzte (da meine Anwendung mysqli für Verbindungen verwendete)
Ronnie
7

Als ich die Antwort von Matthias D hier erweiterte, konnte ich diesen Fehler von 2002 sowohl auf MySQL als auch auf MariaDB mit genauen Pfaden mithilfe der folgenden Befehle beheben :

Holen Sie sich zuerst den tatsächlichen Pfad zum MySQL-Socket:

netstat -ln | grep -o -m 1 '/.*mysql.sock'

Dann holen Sie sich den PHP-Pfad :

php -r 'echo ini_get("mysql.default_socket") . "\n";'

Verknüpfen Sie sie mithilfe der Ausgabe dieser beiden Befehle :

sudo ln -s /actualpath/mysql.sock /phppath/mysql.sock

Wenn dies zurückkehrt, müssen No such file or directorySie nur den Pfad zu PHP mysql.sock erstellen. Wenn Sie beispielsweise Ihren Pfad /var/mysql/mysql.sockhätten, würden Sie Folgendes ausführen:

sudo mkdir -p /var/mysql

Versuchen Sie dann den Befehl sudo ln erneut.

mattbell87
quelle
6

Ich würde Ihre php.ini-Datei überprüfen und überprüfen, ob mysql.default_socket richtig eingestellt ist und ob Ihre mysqld korrekt mit einer Socket-Datei konfiguriert ist, auf die sie zugreifen kann. Typische Standardeinstellung ist "/tmp/mysql.sock".

Myles
quelle
Ok, es heißt /var/mysql/mysql.sock, aber dieser Weg existiert nicht.
mk12
6

Ich bin auch auf dieses Problem gestoßen, dann habe ich 'localhost' in '127.0.0.1' geändert, es funktioniert.

JackSun
quelle
6

In meinem Fall habe ich ein Problem mit mysqli_connect.
wenn ich mich verbinden will
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error () erhalte ich den Fehler "Keine solche Datei oder kein solches Verzeichnis".

das hat bei mir funktioniert mysqli_connect('localhost:3306', 'myuser','mypassword')

masoud2011
quelle
Das hat bei mir gut funktioniert; Es war die Änderung, die ich brauchte, um das American Football-Statistikpaket von Armchair Analysis in eine lokale OS X-MySQL-Installation zu laden. Vielen Dank!
Michael Scott Cuthbert
froh das zu hören :)
masoud2011
4

Der Fehler 2002 bedeutet, dass MySQL über die Socket-Datei keine Verbindung zum lokalen Datenbankserver herstellen kann (z /tmp/mysql.sock . ) .

Führen Sie Folgendes aus, um herauszufinden, wo sich Ihre Socket-Datei befindet:

mysql_config --socket

Überprüfen Sie anschließend, ob Ihre Anwendung die richtige Unix-Socket-Datei verwendet, oder stellen Sie stattdessen eine Verbindung über den TCP / IP-Port her.

Überprüfen Sie dann noch einmal, ob Ihr PHP das richtige MySQL-Socket-Setup hat:

php -i | grep mysql.default_socket

und stellen Sie sicher, dass die Datei vorhanden ist .

Testen Sie die Steckdose:

mysql --socket=/var/mysql/mysql.sock

Wenn der Unix-Socket falsch ist oder nicht vorhanden ist, können Sie ihn mit einem Symlink verknüpfen, zum Beispiel:

ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

oder korrigieren Sie Ihre Konfigurationsdatei (zB php.ini).

Um die PDO- Verbindung direkt von PHP aus zu testen , können Sie Folgendes ausführen:

php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"

Überprüfen Sie auch die Konfiguration zwischen Apache und CLI (Befehlszeilenschnittstelle), da die Konfiguration unterschiedlich sein kann.

Möglicherweise wird der Server ausgeführt, aber Sie versuchen, eine Verbindung über einen TCP / IP-Port, eine Named Pipe oder eine Unix-Socket-Datei herzustellen, die sich von der unterscheidet, auf der der Server empfangsbereit ist. Um dies zu korrigieren, müssen Sie ein Client-Programm aufrufen (z. B. --portOption angeben), um die richtige Portnummer oder die richtige Named Pipe- oder Unix-Socket-Datei (z --socket. B. Option) anzugeben .

Siehe: Fehlerbehebung beim Herstellen einer Verbindung zu MySQL


Andere Dienstprogramme / Befehle, die helfen können, das Problem zu verfolgen:

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • Verwenden Sie XDebug mit xdebug.show_exception_trace=1in Ihremxdebug.ini
  • Unter OS X versuchen sudo dtruss -fn mysqld, unter Linux mit zu debuggenstrace
  • Überprüfen Sie die Berechtigungen für den Unix-Socket: stat $(mysql_config --socket)und ob Sie über genügend freien Speicherplatz verfügen (df -h ).
  • Starten Sie MySQL neu.
  • Überprüfen Sie net.core.somaxconn.
Kenorb
quelle
3

Stellen Sie sicher, dass Ihr lokaler Server (MAMP, XAMPP, WAMP usw.) ausgeführt wird.

Husain Al Faraj
quelle
Wenn Sie MAMP unter MacOS verwenden (offensichtlich!), Wird dieser Fehler außerdem angezeigt, wenn Sie unmittelbar nach dem Aufwecken Ihres Mac aus dem Ruhezustand auf Ihre Website zugreifen. Die Lösung besteht natürlich darin, einfach zu warten und es erneut zu versuchen. :-)
Texelate
0

Ich hatte ein ähnliches Problem.
Grundsätzlich besteht hier das Problem darin, dass wahrscheinlich zwei Instanzen von MySQL ausgeführt werden.
A) Eine
Lampe, die unter /etc/init.d ausgeführt wird. B) Lampe, die unter / opt / lamp installiert wird.
Lösung:
Schritt 1: - Finden Sie alle MySQL-laufenden Instanzen mit dem Befehl "find / | grep mysqld".
Schritt 2: - Fahren Sie die Dienste herunter, die unter ausgeführt werden /etc/init.d using service mysql stop
Schritt 3: - Starten Sie Ihre / opt / lamp / lamp neu

Du solltest gut gehen :)

Jignesh Rawal
quelle
0

Überprüfen Sie auf einem Mac einfach Ihre Einstellungen, bevor Sie die ganze harte Arbeit erledigen System Preferences > MySQL. Meistens habe ich erlebt, dass das Team seitdem auf dieses Problem gestoßen ist The MySQL Server Instance is stopped.

Klicken Sie auf die Start MySQL ServerSchaltfläche und Magie wird passieren.

Steven Ventimiglia
quelle
0

Ich benutze PHP-FPM oder mehrere PHP-Version in meinem Server. In meinem Fall aktualisiere ich den mysqli-Wert, da es keinen mysql-Standard-Socket-Parameter gibt:

mysqli.default_socket

zu:

mysql.default_socket = /path/to/mysql.sock

danke an @Alec Gorge

Navotera
quelle
0

Ich hatte das gleiche Problem. Mein Socket wurde schließlich in /tmp/mysql.sock gefunden. Dann habe ich diesen Pfad zu php.ini hinzugefügt. Ich habe den Socket dort gefunden, indem ich die Seite "Serverstatus" in MySQL Workbench überprüft habe. Wenn sich Ihr Socket nicht in /tmp/mysql.sock befindet, kann MySQL Workbench Ihnen möglicherweise sagen, wo er sich befindet? (Zugegeben, Sie verwenden MySQL Workbench ...)

Fom
quelle
0

Ich habe MySQL mit dem Installationsprogramm installiert. Tatsächlich gab es neben dem Verzeichnis 'bin' kein Datenverzeichnis.

Daher habe ich das Verzeichnis 'data' manuell unter "C: \ Programme \ MySQL \ MySQL Server 8.0" erstellt. Und es hat funktioniert (Ändern des Root-Passworts gemäß den unter https://dev.mysql.com/doc/mysql-windows-excerpt/5.7/de/resetting-permissions-windows.html vorgeschlagenen Schritten .

Park JongBum
quelle
0

Digital Ocean MySql 2002-keine-solche-Datei-oder-Verzeichnis

Fügen Sie dieses Dateiende hinzu /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

Starten Sie MySql neu

service mysql restart

Ajmirani
quelle
-1

Ich hatte auch das gleiche Problem auf einem Linux-Server. Was mir geholfen hat, ist der Befehl ' sudo reboot ', mit dem der Linux-Server neu gestartet wird.

SumitK
quelle
-2

Aktivieren und Starten des Mariadb-Dienstes

sudo systemctl aktivieren mariadb.service

sudo systemctl start mariadb.service

Anil K Shrestha
quelle