it-swarm.com.de

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

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

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

Und ich bekomme das immer:

Fehler: 2002 - Keine solche Datei oder 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 der x86_64 dmg installiert.

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

83
mk12

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

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

mysql.default_socket

Und mach es

mysql.default_socket = /path/to/mysql.sock
86
Alec Gorge

Ich hatte ein ähnliches Problem und konnte dieses Problem lösen, indem ich mein mysql mit 127.0.0.1 anstelle von localhost adressierte.

Dies bedeutet wahrscheinlich, dass ich bei der Konfiguration meiner Hosts etwas falsch gemacht habe, aber diese schnelle Lösung bringt mich sofort in Schwung.

121
bryan kennedy

Dies gilt für Mac OS X mit der native Installation von Apache HTTP und custom Installation von MySQL.

Die Antwort basiert auf der hervorragenden Antwort von @ alec-gorge. Da ich jedoch einige Änderungen vornehmen 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 /etc/Apache2/httpd.conf aktiviert ist.

Bearbeiten Sie die Datei mit Sudo vi /etc/Apache2/httpd.conf (geben Sie das Passwort ein, wenn Sie dazu aufgefordert werden) und entfernen Sie die Kommentarzeile (entfernen Sie ; vom Anfang), um das Modul php5_module zu laden.

LoadModule php5_module libexec/Apache2/libphp5.so

Starten Sie Apache HTTP mit Sudo apachectl start (oder restart, falls es bereits gestartet wurde und neu gestartet werden muss, um die Konfigurationsdatei erneut zu lesen).

Stellen Sie sicher, dass /var/log/Apache2/error_log eine Zeile enthält, die Sie darüber informiert, dass das php5_module aktiviert ist. Sie sollten PHP/5.3.15 (oder ähnliches) sehen.

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

Name der Socket-Datei nachschlagen

Wenn MySQL läuft (mit ./bin/mysqld_safe), sollten Debug-Zeilen an die Konsole ausgegeben werden, die Ihnen mitteilen, wo Sie die Protokolldateien finden können. Beachten Sie den Hostnamen im Dateinamen - in meinem Fall localhost -, der für Ihre Konfiguration möglicherweise anders ist.

Die nach Logging to kommende Datei ist 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.err-Datei (auch hier wird Ihr Name möglicherweise anders benannt), d. H. tail -1 /Users/jacek/apps/mysql/data/localhost.err, um 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, die Sie in php.ini verwenden sollten.

Es gibt einen anderen Weg (einige sagen einen einfacheren Weg), um den Speicherort des Dateinamens des Sockets zu ermitteln, indem Sie sich bei MySQL anmelden und ausführen:

show variables like '%socket%';

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

Apropos php.ini ...

Im /etc-Verzeichnis befindet sich die Datei /etc/php.ini.default. Kopieren Sie es nach /etc/php.ini.

Sudo cp /etc/php.ini.default /etc/php.ini

Öffnen Sie /etc/php.ini und suchen Sie nach mysql.default_socket.

Sudo vi /etc/php.ini

Der Standard von mysql.default_socket ist /var/mysql/mysql.sock. Sie sollten es auf den Wert ändern, den Sie zuvor notiert haben - in meinem Fall war es /tmp/mysql.sock.

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

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 bedeutet, dass Sie fertig sind und PHP5 mit MySQL gut funktionieren sollte. Glückwunsch!

33
Jacek Laskowski

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

13
Oleg

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?

Die anderen 2 Beiträge sind korrekt, da Sie Ihren Socket überprüfen müssen, weil 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

9
Todd Moses

Erweitert auf Matthias Ds Antwort hier Ich konnte diesen 2002-Fehler unter MySQL und MariaDB mit den exakten Pfaden mit den folgenden Befehlen beheben:

Holen Sie sich zuerst den actual-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 mit der -Ausgabe dieser beiden Befehle:

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

Wenn dies No such file or directory zurückgibt, müssen Sie nur den Pfad zur PHP mysql.sock erstellen. Wenn Sie beispielsweise /var/mysql/mysql.sock angeben, würden Sie Folgendes ausführen:

Sudo mkdir -p /var/mysql

Versuchen Sie dann erneut den Befehl Sudo ln.

6
mattbell87

in meinem Fall habe ich ein Problem mit mysqli_connect.
wenn ich eine Verbindung herstellen möchte
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error () gibt mir diesen Fehler "Keine solche Datei oder Verzeichnis" zurück

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

6
masoud2011

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

6
JackSun

Ich überprüfe Ihre php.ini-Datei und vergewissere mich, dass mysql.default_socket richtig eingestellt ist, und vergewissern Sie sich auch, dass Ihre mysqld mit einer Socket-Datei konfiguriert ist, auf die sie zugreifen kann. Die Standardeinstellung ist "/tmp/mysql.sock".

6
Myles

Nicht, dass es Ihnen sehr hilft, aber in den letzten Versionen (und sogar weniger jüngeren ) von MySQL bedeutet der Fehlercode 2002: "Verbindung zum lokalen MySQL-Server kann nicht über Socket [Name-of-Socket" hergestellt werden ] “, Das könnte Ihnen etwas mehr sagen.

6

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

service mysql restart

P.S.- use Sudo service mysql restart für Benutzer ohne Rootberechtigung.

5
Avani Khabiya

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

Um herauszufinden, wo sich Ihre Socket-Datei befindet, führen Sie Folgendes aus:

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 existiert, können Sie ihn symbolisch verknüpfen, zum Beispiel:

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

oder korrigieren Sie Ihre Konfigurationsdatei (z. B. 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 abweichen kann.

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

Siehe: Fehlerbehebung bei Verbindungsproblemen mit MySQL


Andere Hilfsprogramme/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=1 In Ihrem xdebug.ini
  • Unter OS X versuchen Sie Sudo dtruss -fn mysqld, Unter Linux debuggen Sie mit strace
  • Überprüfen Sie die Berechtigungen für den Unix-Socket: stat $(mysql_config --socket) und ob genügend Speicherplatz vorhanden ist (df -h).
  • Starten Sie Ihr MySQL neu.
  • Überprüfen Sie net.core.somaxconn .
3
kenorb

Stellen Sie sicher, dass Ihr lokaler Server (MAMP, XAMPP, WAMP usw.) läuft.

2
Husain Al Faraj

Ich verwende PHP-FPM oder mehrere PHP-Versionen auf meinem Server. In meinem Fall aktualisiere ich den mysqli-Wert, da es keinen Standard-Socket-Parameter für mysql gibt: 

mysqli.default_socket

zu: 

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

danke an @Alec Gorge 

0
navotera

Ich hatte ein ähnliches Problem.
Grundsätzlich besteht das Problem darin, dass wahrscheinlich zwei Instanzen von mysql ausgeführt werden.
A) Einer läuft unter /etc/init.d 
B) Lampe bei/opt/lamp installiert 
Lösung:
Schritt 1: - Suchen Sie nach allen MySQL-Instanzen, die mit dem Befehl "find/| grep mysqld" ausgeführt werden.
Schritt 2: - Beenden Sie die Dienste, die unter /etc/init.d ausgeführt werden, mit dem Dienst mysql stop
Schritt 3: - Starten Sie Ihre Lampendienste mit/opt/lamp/lamp restart neu 

Du solltest gut sein :)

0
Jignesh Rawal

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

Ich manuell erstellt das "Daten" -Verzeichnis unter "C:\Programme\MySQL\MySQL Server 8.0". Und es funktionierte (das Root-Passwort wurde nach den Schritten geändert, die auf https://dev.mysql.com/doc/mysql-windows-excerpt/5.7/de/resetting-permissions-windows.html vorgeschlagen wurden.

0
Park JongBum

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, als ich die Seite "Server Status" in MySQL Workbench durchgesehen habe. Wenn sich Ihr Socket nicht in /tmp/mysql.sock befindet, könnte MySQL Workbench Ihnen vielleicht sagen, wo er ist? (Zugegeben, Sie verwenden MySQL Workbench ...)

0
Fom

Überprüfen Sie auf einem Mac vor der harten Arbeit einfach Ihre Einstellungen in System Preferences > MySQL. Meistens habe ich das Team seit The MySQL Server Instance is stopped mit diesem Problem konfrontiert.

Klicken Sie auf die Schaltfläche Start MySQL Server. Die Magie wird geschehen.

0