PDOException SQLSTATE [HY000] [2002] Keine solche Datei oder kein solches Verzeichnis


319

Ich glaube, dass ich meine (sehr einfache) Site erfolgreich für fortrabbit bereitgestellt habe, aber sobald ich mich mit SSH verbinde, um einige Befehle (wie php artisan migrateoder php artisan db:seed) auszuführen, erhalte ich eine Fehlermeldung:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

Irgendwann muss die Migration funktioniert haben, weil meine Tabellen vorhanden sind - aber das erklärt nicht, warum es jetzt bei mir nicht funktioniert.



1
manchmal nur, weil Sie MySQL noch nicht installiert haben
Hassan Gilak

Antworten:


140

Die Fehlermeldung zeigt an, dass eine MySQL-Verbindung über Socket versucht wird (was nicht unterstützt wird).

Im Kontext von Laravel (Handwerker) möchten Sie wahrscheinlich eine andere / die richtige Umgebung verwenden. ZB: php artisan migrate --env=production(oder welche Umgebung auch immer). Siehe hier .


1
Dies war die Lösung für mein Problem. Einer der Entwickler in unserem Unternehmen verwendet Homestead nicht und stellt über Socket eine Verbindung zu MySQL her. Ich habe die Socket-Konfiguration in meiner Datei app / database.php entfernt. Problem gelöst
Borislemke

Ich musste nur die Erweiterung mysqli.so in php.ini
Mehulkumar am

4
Ich musste "'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'" zu config / database.php hinzufügen
Ángel Carlos del Pozo Muela

Hallo Community, ich erhalte diesen Fehler, obwohl ich kein Laravel verwende. Kannst du dir das Problem hier ansehen?
Kiran Patel

655

Laravel 4: Ändern Sie "host" in der app/config/database.phpDatei von "localhost" in "127.0.0.1".

Laravel 5: Ändern Sie "DB_HOST" in der .envDatei von "localhost" in "127.0.0.1".

Ich hatte genau das gleiche Problem. Keine der oben genannten Lösungen hat bei mir funktioniert. Ich habe das Problem gelöst, indem ich den "Host" in der Datei /app/config/database.php von "localhost" in "127.0.0.1" geändert habe.

Ich bin mir nicht sicher, warum "localhost" standardmäßig nicht funktioniert, aber ich fand diese Antwort in einer ähnlichen Frage, die in einem symfony2-Beitrag gelöst wurde. https://stackoverflow.com/a/9251924/1231563

Update: Einige Leute haben gefragt, warum dieses Update funktioniert, deshalb habe ich mich ein wenig mit dem Thema befasst. Es scheint, als würden sie unterschiedliche Verbindungstypen verwenden, wie in diesem Beitrag https://stackoverflow.com/a/9715164/1231563 erläutert

Das hier aufgetretene Problem ist, dass "localhost" einen UNIX-Socket verwendet und die Datenbank nicht im Standardverzeichnis finden kann. "127.0.0.1" verwendet jedoch TCP (Transmission Control Protocol), was im Wesentlichen bedeutet, dass es über das "lokale Internet" auf Ihrem Computer ausgeführt wird und in diesem Fall viel zuverlässiger als der UNIX-Socket ist.


3
seltsam, dass es auch für mich die Lösung war, aber ich kann über die Befehlszeile eine Verbindung mit mysql herstellen --host = localhost - das funktioniert, aber nicht über PDO.
John

26
Ich würde gerne wissen, WARUM localhostnicht funktioniert und 127.0.0.1funktioniert?
Justin

6
Dies funktionierte für mich auf einem MAMP-System, auf dem eine PHP-Datei in der Befehlszeile (Terminal) ausgeführt wurde. Es funktionierte als Webseite, aber nicht als Befehlszeilendatei, bis ich localhost in '127.0.0.1' änderte
Samuel Fullman

1
@ Justin Ich denke, das liegt daran, dass localhost versucht, Socket zu verwenden, während 127.0.0.1 TCP verwendet.
Pebbo

10
A Unix socket file is used if you do not specify a host name or if you specify the special host name localhost. dev.mysql.com/doc/refman/5.7/en/can-not-connect-to-server.html
x-yuri

94

Ich habe das gleiche Problem und verwende Mac OS X 10.10 Yosemite. Ich habe den Apache Server und PHP aktiviert, die bereits mit dem Betriebssystem geliefert werden. Dann habe ich gerade die mCrypt-Bibliothek konfiguriert, um loszulegen. Danach, als ich mit Modellen und DB arbeitete, bekam ich den Fehler:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

Der Grund, den ich gefunden habe, ist nur, dass PHP und MySQL nicht selbst verbunden werden können. Um dieses Problem zu beheben, gehe ich wie folgt vor:

  1. Öffnen Sie ein Terminal und stellen Sie eine Verbindung zum MySQL her mit:

    mysql -u root -p
  2. Sie werden nach dem entsprechenden Passwort gefragt. Sobald Sie die MySQL-Eingabeaufforderung erhalten haben, geben Sie den nächsten Befehl ein:

    mysql> show variables like '%sock%'
  3. Sie werden so etwas bekommen:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
    
  4. Behalten Sie den Wert der letzten Zeile bei:

    /tmp/mysql.sock
  5. Suchen Sie in Ihrem laravelProjektordner nach der Datei database.php, in der Sie die DB-Verbindungsparameter konfigurieren. Im mysql Abschnitt die nächste Zeile am Ende hinzu:

    'unix_socket' => '/tmp/mysql.sock'
  6. Sie müssen so etwas haben:

    'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'SchoolBoard',
            'username'  => 'root',
            'password'  => 'venturaa',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket' => '/tmp/mysql.sock',
        ),
    

Speichern Sie jetzt einfach die Änderungen und laden Sie die Seite neu und es muss funktionieren!


3
Die direkteste Lösung.
Vielen Dank

Danke dafür. Das hat bei mir funktioniert. Verwenden von OSX 10.10.5 MAMP Pro
marknt15

Dies funktionierte auch bei mir mit MAMP Pro und OS X 10.11.x. Am Ende war:/Applications/MAMP/tmp/mysql/mysql.sock
Bort License Plate

1
+1. Die Verwendung von "127.0.0.1" in der Konfiguration anstelle von "localhost", wie Yamartino in seiner Antwort sagte, funktioniert gut, aber mit einem Socket geht es schneller und diese Antwort löst das Problem. Es ist eine Schande, dass MySQL "localhost" so eigenartig behandelt, wenn unix_socket definiert ist ...
Shautieh

@ GregFerrell Ja, das stimmt, aber gut ... Ich hoffe, es könnte nützlich sein
alexventuraio

51

Ich bin [PDOException] SQLSTATE[HY000] [2002] No such file or directoryaus einem anderen Grund auf den Fehler gestoßen . Ich hatte gerade einen brandneuen LAMP-Stack unter Ubuntu 12.04 mit Apache 2.4.7, PHP v5.5.10 und MySQL 5.6.16 erstellt. Ich habe meine Websites wieder verschoben und sie gestartet. Aus den [PDOException]oben genannten Gründen konnte ich meine Laravel 4.2.x-basierte Site jedoch nicht laden . Also habe ich php -i | grep pdodiese Zeile überprüft und bemerkt:

pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock

Aber in meiner /etc/my.cnf befindet sich die Sockendatei tatsächlich in /var/run/mysqld/mysqld.sock.

Also öffnete ich meine php.ini und stellte den Wert ein für pdo_mysql.default_socket:

pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

Dann habe ich Apache neu gestartet und überprüft php -i | grep pdo:

pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock

Das hat es für mich behoben.


Dies war das Update, das für mich funktioniert hat. Das Problem war, dass ich zwei Versionen von MySQL installiert und eine entfernt habe. Die Änderung von 127.0.0.1 hat nicht funktioniert oder die Socke in der Konfiguration hinzugefügt. Danke! @ Dcarrith
Luis

2
Dies half mir, mein Problem zu finden - nämlich, dass ich OSX-gebündeltes PHP verwendete, nicht die MAMP-PHP-Binärdatei. Stellen Sie also sicher, dass Sie die richtige Version von PHP verwenden, die auf die richtige PHP.ini usw. verweist. Definitiv "doh!" Moment.
Libelle

Die einzige Antwort, die für mich funktioniert hat. Vielen Dank.
Shahrukh Anwar

43

Die Antwort von @stuyam löste das Problem "Keine solche Datei oder kein solches Verzeichnis" für mich

Kurze Antwort: Ändern Sie "host" in der Datei /app/config/database.php von "localhost" in "127.0.0.1".

Aber dann hatte ich einen Fehler "Verbindung abgelehnt". Wenn jemand das gleiche Problem hatte, bestand meine Lösung darin, die Datei app / config / local / database.php so zu aktualisieren, dass der Port 8889 lautet:

'mysql' => array(
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'port'      => '8889',
        'database'  => 'databaseName',
        'username'  => 'root',
        'password'  => 'root',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),

4
In meinem Fall war es 'port' => '33060'aber diese Antwort brachte mich dorthin!
Mopo922

25

Wenn Sie Laravel Homestead verwenden, stellen Sie sicher, dass Sie die Befehle auf dem Server aufrufen.

homestead ssh

Dann cd einfach in das richtige Verzeichnis und feuere dort deinen Befehl ab.


2
Dies funktionierte, ich führte zuerst einen Befehl von meinem Computer aus, anstatt ssh in VM, und führte dort einen Befehl aus.
cmac

Ich vergesse diesen Schritt immer. Heh. 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel

1
vagrant sshin meinem Fall
Marcos Curvello

22

In meinem Fall hatte ich überhaupt kein Problem, habe nur vergessen, den MySQL-Dienst zu starten ...

sudo service mysqld start


18

Fügen Sie den Pfad mysql.sock wie im folgenden Beispiel in die Datei database.php ein

'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',

Beispiel

'mysql' => [
        'driver' => 'mysql',
        'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '8889'),

18

Es hat funktioniert, nachdem ich von DB_HOST=localhostzu DB_HOST=127.0.0.1.env-Datei gewechselt habe


2
Das hat funktioniert, du hast recht. Haben Sie Ideen, warum localhostdas nicht funktioniert?
Fusion

1
@Fusion Wenn Sie Ihre App in einem Container ausführen, wird 'localhost' als Container verstanden. 127.0.0.1 weist ihn an, die
Datenbank

Ich hatte auch ein solches Problem, konnte den Cache nicht leeren oder den Handwerkeraufschlag ausführen
Tom Mwenda

17

Dies liegt daran, dass PDO den "localhost" -Host speziell behandelt:

Hinweis: Nur Unix: Wenn der Hostname auf "localhost" gesetzt ist, wird die Verbindung zum Server über einen Domain-Socket hergestellt. Wenn PDO_MYSQL gegen libmysqlclient kompiliert wird, befindet sich der Speicherort der Socket-Datei am Speicherort von libmysqlclient. Wenn PDO_MYSQL für mysqlnd kompiliert wird, kann über die Einstellung pdo_mysql.default_socket ein Standard-Socket festgelegt werden.

(von http://php.net/manual/en/ref.pdo-mysql.connection.php )

Wenn Sie localhost in 127.0.0.1 ändern, wird die Verwendung von TCP "erzwungen".

Hinweis: mysqli_connect funktioniert einwandfrei mit localhost.


12

Aufbauend auf der Antwort von @dcarrith ...

Anstatt die Konfigurationsdateien zu bearbeiten, habe ich an dem von PHP gesuchten Speicherort einen Alias ​​erstellt, der eine Verbindung zum echten mysql.sock herstellt. ( Quelle )

Führen Sie einfach diese beiden Befehle aus (kein Neustart erforderlich):

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

11

Schritt 1

Suchen Sie den Pfad zu Ihrem unix_socket, um dies zu tun, führen Sie es einfach aus netstat -ln | grep mysql

Sie sollten so etwas bekommen

unix  2      [ ACC ]     STREAM     LISTENING     17397    /var/run/mysqld/mysqld.sock

Schritt 2

Nehmen Sie das und fügen Sie es in Ihren unix_socket- Parameter ein

'mysql' => array(
            'driver'    => 'mysql',
            'host'      => '67.25.71.187',
            'database'  => 'dbname',
            'username'  => 'username',
            'password'  => '***',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket'    => '/var/run/mysqld/mysqld.sock' <-----
            ),
        ),

Ich hoffe es hilft !!


8

Ich arbeite mit MAMP Pro und hatte dieses ähnliche Problem beim Versuch zu migrieren (DB-Tabellen erstellen). Versuchte auch einige dieser erwähnten Vorschläge, tat es aber nicht für mich.

Also habe ich einfach (nach einer Stunde googeln) der /config/database.php zwei Dinge hinzugefügt.

'port' => '1234',
'unix_socket' => '/path/to/my/socket/mysqld.sock'

Funktioniert jetzt gut!


4

Überprüfen Sie Ihren Port sorgfältig. In meinem Fall war es 8889 und ich verwende 8888. Ändern Sie "DB_HOST" von "localhost" in "127.0.0.1" und umgekehrt


Großartig, danke, mein Hafen war 3306, aber mein richtiger Hafen ist 8889
David

4

Ich hatte diese Probleme, als ich meine Anwendung mit Docker-Containern ausführte.

Die Lösung wurde mit dem Namen des MySQL- docker_compose.ymlDienstcontainers versehen, den ich in DB_HOST verwendet habe. In meinem Fall war es db:

DB_HOST=db

Ich hoffe es hilft.


2

Ab Laravel 5 werden der Benutzername und das Kennwort der Datenbank in der .env-Datei gespeichert, die im Projektverzeichnis vorhanden ist, z

DB_HOST=127.0.0.1
DB_DATABASE=db1
DB_USERNAME=user1
DB_PASSWORD=pass1

Wie Sie sehen können, überschreiben diese Umgebungsvariablen hier die 'Forge'-Zeichenfolgen, sodass eine Änderung keine Auswirkungen hat:

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => env('DB_DATABASE', 'forge'),
        'username'  => env('DB_USERNAME', 'forge'),
        'password'  => env('DB_PASSWORD', ''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

Weitere Informationen finden Sie hier https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables


2

Ich bin auf dieses Problem gestoßen, als ich PHPUnit in Elixir / Gulp und Homestead als meine Vagrant-Umgebung ausgeführt habe.

In meinem Fall habe ich die .env-Datei von dort bearbeitet DB_HOST=localhost, DB_HOST=192.168.10.10wo 192.168.10.10sich die IP meines Vagrant / Homestead-Hosts befindet.


2

Versuch, eine Verbindung zu localhost herzustellen:

SQLSTATE[HY000] [2002] No such file or directory

Versuch, eine Verbindung zu 127.0.0.1 herzustellen:

SQLSTATE[HY000] [2002] Connection refused

OK, kommentieren / entfernen Sie einfach die folgende Einstellung aus my.cnf (unter OS X 10.5 :) /opt/local/etc/mysqlxx/my.cnf, um zu erhalten:

[mysqld]
# skip-networking

Stoppen und starten Sie MySQL Server.


2

Ich hatte ähnliche Probleme beim Zugriff auf meine Drupal-Website. Ich habe das Problem behoben, indem ich die Befehlszeile geöffnet und meinen MySQL-Server oder -Dienst neu gestartet habe:

service mysqld restart

Das sollte funktionieren. Wenn dies nicht der Fall ist, starten Sie Ihren lokalen Webserver neu:

service httpd restart

Das sollte genug sein. Hoffe, es funktioniert auch für andere Umgebungen. Beachten Sie, dass diese Befehle im Allgemeinen Superuser-Berechtigungen erfordern.


1

Wenn Sie Laravel Homestead verwenden, finden Sie hier Einstellungen

(einschließlich Vagrant-Virtual Machine)

.bash-Profil

alias vm="ssh vagrant@127.0.0.1 -p 2222"

database.php

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', '127.0.0.1'),
        'database'  => env('DB_DATABASE', 'homestead'),
        'username'  => env('DB_USERNAME', 'homestead'),
        'password'  => env('DB_PASSWORD', 'secret'),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

Terminal

vm

vagrant@homestead:~/Code/projectFolder  php artisan migrate:install

1

Wenn noch jemand nach der Antwort sucht, überprüfen Sie einfach Ihre .env-Datei. Aus irgendeinem Grund hat laravel eine .env.example-Datei erstellt, sodass all diese Antworten bei mir nicht funktionierten. Ich habe mein Problem behoben, indem ich .env.example in .env umbenannt habe


Es gibt keine einzige richtige Antwort auf diese Frage, da verschiedene Fehler gemacht werden können. Dies ist einer von ihnen, da die .env-Datei nicht auf einen Remote-Server kopiert werden kann. Es lohnt sich daher, die ENV-Datei auf dem Server zu überprüfen, auf dem Sie die Abfrage ausführen möchten, um sicherzustellen, dass beide vorhanden sind und die zum Herstellen einer Verbindung erforderlichen Informationen enthalten.
Petercoles

1

Das ist mir passiert, weil MySQL nicht lief. MySQL konnte nicht gestartet werden, da ein /usr/local/etc/my.cnf.d/Verzeichnis fehlte .

Dies wurde von meiner /usr/local/etc/my.cnfKonfigurationsdatei als glob include ( include /usr/local/etc/my.cnf.d/*.cnf) benötigt.

Das Ausführen mkdir /usr/local/etc/my.cnf.dund anschließende Starten von MySQL hat das Problem behoben.


1

In meinem Fall habe ich PHP Artisan Migrate auf meinem Mac-Terminal ausgeführt, als ich in Vagabund ssh musste und es von dort aus ausführen musste. Hoffe das hilft jemandem die Kopfschmerzen.


1

Ich hatte das gleiche Problem bei der Verwendung des dbDocker- und MySQL- Dienstnamens in der Datei docker_compose.yml:

Ich habe folgendes in die .envDatei eingefügt :

DB_HOST=db

Sie sollten auch sicherstellen, dass Ihr Host über die PHP-App erkennbar ist.

Dies lag daran, dass PHP nicht herausgefunden hat, mit welchem ​​Host eine Verbindung hergestellt werden soll.


0

Wenn Sie eine VirtualMachine verwenden, stellen Sie sicher, dass Sie sich auf diesem Computer befinden, zu Ihrem App-Ordner navigieren und von dort aus den Befehl php artisan migrate aufrufen.


0

Im Mai hatte ich einfach verwendet

vagrant up

anstatt

homestead up

für meine Schmiede Larven Setup mit Homestead. Ich gehe davon aus, dass dies bedeutete, dass die Site bereitgestellt wurde, aber der MySQL-Server wurde nie gestartet. Als ich den letzteren Befehl verwendete, um meine Vagabundbox zu starten, verschwand der Fehler.


0

All diese Antworten scheinen schwer zu heben ...

Ich habe gerade eine .envDatei erstellt. bearbeitete meine bootstrap/app.phpDatei und kommentierte die folgende Zeile aus ...

Dotenv::load(__DIR__.'/../');

Hoffe das hilft jemandem


0

Für alle, die versuchen, eine neue Datenbankverbindung zu erstellen, nicht auf Laravel, sondern hier auf der Suche nach Antworten, um PDO vom Terminal aus auszuführen. Dies würde Ihnen helfen. Und Sie können es so umgestalten, dass es am besten für Sie funktioniert.

<?php

class db
{
   private $DBHOST = 'localhost'; // you don't need 127.0.0.1
   private $DRIVER = 'mysql';
   private $PORT   = '8888'; // database port. 8888 is mine
   private $DB     = 'example-db';
   private $PASS   = 'example-pass';
   private $USER   = 'root';
   private $SOCKS  = ''; // can fill this or leave blank.


   // - connect (dummy connection)
   private function con()
   {
       if ($this->SOCKS == '')
       {
           // run shell command to get 
           $socks = shell_exec('netstat -ln | grep mysql');
           $socks = trim(substr($socks, strpos($socks, '/')));

           $this->SOCKS = strlen($socks) > 0 ? ';unix_socket='.$socks : '';
       }
       else
       {
          $this->SOCKS = ';unix_socket='.$this->SOCKS;
       }

       $dsn = $this->DRIVER.':host='.$this->DBHOST.';dbname='.$this->DB;

       // add socks
       $dsn .= $this->SOCKS;

       // add port
       $dsn .= (strlen($this->PORT) > 0) ? ';port='.$this->PORT : '';

       // extablish connection
       $con = new PDO($dsn, $user, $pass);

       // return PDO instance.
       return $con;
   }
   // - ends here

   // now you can call $this->con() within class to use connection 
   // would run fine on any terminal

} 

ich hoffe es hilft!


0

In meinem Fall musste ich den Bootstrap / Cache-Ordner entfernen und es erneut versuchen.

Mein Szenario war nach einer Servermigration.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.