PDOException SQLSTATE [HY000] [2002] Brak takiego pliku lub katalogu

319

Wierzę, że udało mi się wdrożyć moją (bardzo podstawową) witrynę na fortrabbit, ale jak tylko połączę się z SSH w celu uruchomienia niektórych poleceń (takich jak php artisan migratelub php artisan db:seed) , pojawia się komunikat o błędzie:

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

W pewnym momencie migracja musiała zadziałać, ponieważ moje tabele już tam są - ale to nie wyjaśnia, dlaczego nie działa teraz dla mnie.

Daniel Hollands
źródło
1
czasami to tylko dlatego, że nie zainstalowałeś jeszcze mysql
Hassan Gilak

Odpowiedzi:

142

Komunikat o błędzie wskazuje, że próbowane jest połączenie MySQL przez gniazdo (co nie jest obsługiwane).

W kontekście Laravela (rzemieślnika) prawdopodobnie chcesz użyć innego / właściwego środowiska. Np .: php artisan migrate --env=production(lub dowolne środowisko). Zobacz tutaj .

ukautz
źródło
1
To było rozwiązanie mojego problemu, jeden z programistów w naszej firmie nie używa Homestead i łączy się z mysql przez gniazdo. Usunąłem konfigurację gniazda w pliku app / database.php. Problem rozwiązany
borislemke
Właśnie musiałem włączyć rozszerzenie mysqli.so w php.ini
Mehulkumar 23.04.17
4
Musiałem dodać „'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'” do config / database.php
Ángel Carlos del Pozo Muela
witaj społeczność, otrzymuję ten błąd, mimo że nie używam laravel, czy możesz spojrzeć na problem tutaj, jest on stackoverflow.com/questions/60796332/...
Kiran Patel
655

Laravel 4: Zmień „host” w app/config/database.phppliku z „localhost” na „127.0.0.1”

Laravel 5: Zmień „DB_HOST” w .envpliku z „localhost” na „127.0.0.1”

Miałem dokładnie ten sam problem. Żadne z powyższych rozwiązań nie działało dla mnie. Rozwiązałem problem, zmieniając „host” w pliku /app/config/database.php z „localhost” na „127.0.0.1”.

Nie jestem pewien, dlaczego „localhost” domyślnie nie działa, ale znalazłem tę odpowiedź w podobnym pytaniu rozwiązanym w poście symfony2. https://stackoverflow.com/a/9251924/1231563

Aktualizacja: Niektóre osoby zapytały, dlaczego ta poprawka działa, więc przeprowadziłem trochę badań w tym temacie. Wygląda na to, że używają różnych typów połączeń, jak wyjaśniono w tym poście https://stackoverflow.com/a/9715164/1231563

Problem polega na tym, że „localhost” korzysta z gniazda UNIX i nie może znaleźć bazy danych w standardowym katalogu. Jednak „127.0.0.1” używa protokołu TCP (Transmission Control Protocol), co w istocie oznacza, że ​​działa on przez „lokalny internet” na twoim komputerze i jest w tym przypadku znacznie bardziej niezawodny niż gniazdo UNIX.

stuyam
źródło
3
dziwne, że było to również rozwiązanie dla mnie, ale jestem w stanie połączyć się z wiersza poleceń za pomocą mysql --host = localhost - który działa, ale nie z PDO.
John
26
Chciałbym wiedzieć, DLACZEGO DLACZEGO localhostnie działa i 127.0.0.1działa?
Justin
6
Działa to dla mnie w systemie MAMP, w którym uruchomiono plik php w wierszu poleceń (terminal). Działał jako strona internetowa, ale nie jako plik wiersza poleceń, dopóki nie zmieniłem localhost na „127.0.0.1”
Samuel Fullman
1
@ Justin Myślę, że to dlatego, że localhost próbuje użyć gniazda, podczas gdy 127.0.0.1 używa TCP.
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

Mam ten sam problem i korzystam z systemu Mac OS X 10.10 Yosemite. Włączyłem serwer Apache i PHP, które są już dostarczane z systemem operacyjnym. Potem właśnie skonfigurowałem bibliotekę mCrypt, aby zacząć. Potem, kiedy pracowałem z modelami i DB, dostałem błąd:

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

Powodem jest to, że PHP i MySQL nie mogą się połączyć. Aby rozwiązać ten problem, wykonuję następujące kroki:

  1. Otwórz terminal i połącz się z mysql za pomocą:

    mysql -u root -p
  2. Zostaniesz poproszony o podanie hasła. Następnie, gdy pojawi się komunikat mysql, wpisz następną komendę:

    mysql> show variables like '%sock%'
  3. Otrzymasz coś takiego:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
    
  4. Zachowaj wartość ostatniego wiersza:

    /tmp/mysql.sock
  5. W laravelfolderze projektu poszukaj pliku database.php tam, gdzie konfigurujesz parametry połączenia DB. W sekcji mysql dodaj następny wiersz na końcu:

    'unix_socket' => '/tmp/mysql.sock'
  6. Musisz mieć coś takiego:

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

Teraz po prostu zapisz zmiany i ponownie załaduj stronę, a to musi działać!

alexventuraio
źródło
3
Najbardziej „proste do wydania” rozwiązanie. Dzięki, to naprawiło mnie na uruchomieniu Laravela z MAMP pro
animaacija
Dzięki za to. To zadziałało dla mnie. Korzystanie z OSX 10.10.5 MAMP Pro
marknt15
Działa to również dla mnie z MAMP pro i OS X 10.11.x. Skończyło się na:/Applications/MAMP/tmp/mysql/mysql.sock
Tablicy rejestracyjnej Bort
1
+1. Używanie „127.0.0.1” w konfiguracji zamiast „localhost”, jak powiedział Yamartino w swojej odpowiedzi, działa dobrze, ale jest szybsze z gniazdem i ta odpowiedź rozwiązuje problem. Szkoda, że ​​mysql traktuje „localhost” w taki szczególny sposób, gdy zdefiniowano
unix_socket
@GregFerrell Tak, to prawda, ale dobrze ... Mam nadzieję, że może się przydać
alexventuraio
51

Wystąpił [PDOException] SQLSTATE[HY000] [2002] No such file or directorybłąd z innego powodu. Właśnie skończyłem budować nowy stos LAMP na Ubuntu 12.04 z Apache 2.4.7, PHP v.5.5.10 i MySQL 5.6.16. Przeniosłem moje strony z powrotem i uruchomiłem je. Ale nie mogłem załadować mojej witryny opartej na Laravel 4.2.x z powodu [PDOException]powyższego. Więc sprawdziłem php -i | grep pdoi zauważyłem ten wiersz:

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

Ale w moim /etc/my.cnf plik skarpety jest w rzeczywistości /var/run/mysqld/mysqld.sock.

Więc otworzyłem swój php.ini i ustawiłem wartość dla pdo_mysql.default_socket:

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

Następnie zrestartowałem apache i sprawdziłem php -i | grep pdo:

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

To naprawiło to dla mnie.

dcarrith
źródło
To była poprawka, która działała dla mnie, problem polegał na tym, że zainstalowałem dwie wersje mysql i usunąłem jedną, zmiana 127.0.0.1 nie działała lub dodałem skarpetę do konfiguracji, dzięki! @dcarrith
Luis
2
Pomogło mi to znaleźć mój problem - polegałem na tym, że korzystałem z pakietu php OSX, a nie pliku binarnego MAMP php. Upewnij się więc, że używasz odpowiedniej wersji php, która wskazuje prawidłowy plik php.ini itp. Zdefiniuj „doh!” za chwilę.
ważka
43

Odpowiedź @stuyam rozwiązała dla mnie problem „Brak takiego pliku lub katalogu”

Krótka odpowiedź: zmień „host” w pliku /app/config/database.php z „localhost” na „127.0.0.1”

Ale potem wystąpił błąd „Odmowa połączenia”. Jeśli ktoś miał ten sam problem, moim rozwiązaniem było zaktualizowanie pliku app / config / local / database.php, aby port miał numer 8889:

'mysql' => array(
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'port'      => '8889',
        'database'  => 'databaseName',
        'username'  => 'root',
        'password'  => 'root',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),
Marlow
źródło
4
W moim przypadku tak było, 'port' => '33060'ale ta odpowiedź mnie tam doprowadziła!
mopo922
25

Jeśli korzystasz z Laravel Homestead, upewnij się, że wywołujesz polecenia na serwerze.

homestead ssh

Następnie po prostu przejdź do odpowiedniego katalogu i uruchom tam swoje polecenie.

Koen B.
źródło
2
To działało, najpierw uruchomiłem polecenie z mojego komputera zamiast ssh na maszynie wirtualnej i uruchomiłem tam polecenie.
cmac
Zawsze zapominam o tym kroku. Heh 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel
1
vagrant sshw moim przypadku
Marcos Curvello
22

W moim przypadku nie miałem żadnego problemu, po prostu zapomniałem uruchomić usługę mysql ...

sudo service mysqld start
Carlos ABS
źródło
19

Opcja włączenia użytkownika Mampa Zezwól na dostęp sieciowy do MYSQL

wprowadź opis zdjęcia tutaj

George John
źródło
18

Dodaj ścieżkę mysql.sock w pliku database.php jak w poniższym przykładzie

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

Na przykład

'mysql' => [
        'driver' => 'mysql',
        'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '8889'),
RaviNila
źródło
18

To działało po zmianie I od DB_HOST=localhostdo DB_HOST=127.0.0.1w .env pliku

NuOne
źródło
2
To działało, masz rację. Czy masz jakieś pomysły wyjaśniające, dlaczego localhostnie działa?
Fusion
1
@Fusion, jeśli uruchamiasz aplikację w kontenerze, będzie on rozumiał „localhost” jako kontener, 127.0.0.1 mówi, aby używał
bazy
Miałem też taki problem, nie mogłem wyczyścić pamięci podręcznej ani uruchomić serwowania rzemieślnika
Tom Mwenda
17

Wynika to z tego, że PDO traktuje hosta „localhost” specjalnie:

Uwaga: Tylko Unix: Gdy nazwa hosta jest ustawiona na „localhost”, połączenie z serwerem jest nawiązywane przez gniazdo domeny. Jeśli PDO_MYSQL jest skompilowany z libmysqlclient, wówczas lokalizacja pliku gniazda znajduje się w lokalizacji libmysqlclient. Jeśli PDO_MYSQL jest skompilowany z mysqlnd, można ustawić domyślne gniazdo poprzez ustawienie pdo_mysql.default_socket.

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

Zmiana localhost na 127.0.0.1 „wymusi” użycie TCP.

Uwaga: mysqli_connect działa poprawnie z localhost.

Thomas Decaux
źródło
12

Opierając się na odpowiedzi od @dcarrith ...

Zamiast edytować pliki konfiguracyjne, utworzyłem alias w miejscu, w którym szuka PHP, który łączy się z prawdziwym mysql.sock. ( źródło )

Po prostu uruchom te dwa polecenia (nie trzeba restartować):

mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
Justin
źródło
11

Krok 1

Znajdź ścieżkę do swojego unix_socket, aby to zrobić, po prostu uruchom netstat -ln | grep mysql

Powinieneś dostać coś takiego

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

Krok 2

Weź to i dodaj do swojego parametru unix_socket

'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' <-----
            ),
        ),

Mam nadzieję, że to pomoże !!

cyber8200
źródło
8

Korzystam z MAMP Pro i miałem podobny problem podczas próby migracji (tworzenie tabel db). Wypróbowałem kilka z tych sugestii, ale nie zrobiłem tego dla mnie.

Po prostu (po godzinie googlingu) dodałem dwie rzeczy do pliku /config/database.php.

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

Działa dobrze teraz!

anoraq
źródło
4

Sprawdź dokładnie swój port. W moim przypadku było 8889 i używam 8888. zmień „DB_HOST” z „localhost” na „127.0.0.1” i odwrotnie

Ahmed Awan
źródło
Świetnie, dziękuję, mój port to 3306, ale mój prawdziwy port to 8889
David
4

Miałem te problemy, kiedy działałem z wykorzystaniem kontenerów dokerów.

Rozwiązaniem było umieszczenie nazwy kontenera usługi MySQL, którego docker_compose.ymlużywałem w DB_HOST. W moim przypadku było to db:

DB_HOST=db

Mam nadzieję, że to pomoże.

Lano
źródło
2

Od wersji Laravel 5 nazwa użytkownika i hasło do bazy danych znajduje się w pliku .env, który istnieje w katalogu projektu, np

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

Jak widać, zmienne środowiskowe zastępują ciągi „forge” tutaj, więc ich zmiana nie ma wpływu:

    '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,
    ],

Więcej informacji znajduje się tutaj https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables

malhal
źródło
2

Natknąłem się na ten problem podczas uruchamiania PHPUnit w Elixir / Gulp i Homestead jako moim środowisku Vagrant.

W moim przypadku edytowany plik .env od DB_HOST=localhostcelu DB_HOST=192.168.10.10, gdzie 192.168.10.10jest moje IP hosta Vagrant / Homestead.


źródło
2

Próba połączenia z hostem lokalnym:

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

Próba połączenia z 127.0.0.1:

SQLSTATE[HY000] [2002] Connection refused

OK, po prostu skomentuj / usuń następujące ustawienie z my.cnf (w OS X 10.5:), /opt/local/etc/mysqlxx/my.cnfaby uzyskać:

[mysqld]
# skip-networking

Oczywiście zatrzymaj i uruchom MySQL Server.

Anna Logg
źródło
2

Miałem podobne problemy z dostępem do mojej witryny Drupal. Naprawiłem to, otwierając wiersz poleceń i ponownie uruchamiając mój serwer lub usługę MySQL:

service mysqld restart

To powinno działać. Jeśli nie, zrestartuj lokalny serwer WWW:

service httpd restart

To powinno wystarczyć. Mam nadzieję, że działa również w innych środowiskach. Zauważ, że te polecenia zazwyczaj wymagają uprawnień administratora.

RAWGIT
źródło
1

Jeśli korzystasz z Laravel Homestead, oto ustawienia

(w tym Vagrant-Virtual Machine)

.bash-profil

alias vm="ssh [email protected] -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
ErcanE
źródło
1

Jeśli ktoś nadal szuka odpowiedzi, po prostu sprawdź plik .env. Z jakiegoś powodu laravel tworzy plik .env.example, więc wszystkie te odpowiedzi nie działały dla mnie. Naprawiłem problem ze zmianą nazwy pliku .env. Na .env

Alberto Alegria
źródło
Nie ma jednej poprawnej odpowiedzi na to pytanie, ponieważ można popełnić wiele błędów. To jeden z nich, ponieważ nie można skopiować pliku .env na zdalny serwer. Warto więc sprawdzić plik .env na serwerze, na którym próbujesz uruchomić zapytanie, aby upewnić się, że istnieje i zawiera niezbędne informacje do nawiązania połączenia.
petercoles
1

Stało się tak, ponieważ MySQL nie działał. Uruchomienie MySQL nie powiodło się, ponieważ brakowało mi /usr/local/etc/my.cnf.d/katalogu.

Było to wymagane przez mój /usr/local/etc/my.cnfplik konfiguracyjny jako glob include ( include /usr/local/etc/my.cnf.d/*.cnf).

Uruchomienie mkdir /usr/local/etc/my.cnf.d, a następnie uruchomienie MySQL rozwiązało problem.

james2doyle
źródło
1

W moim przypadku uruchomiłem migrację php rzemieślnika na terminalu Mac, kiedy musiałem ssh na włóczęgę i uruchomić go stamtąd. Mam nadzieję, że to pomaga komuś na ból głowy.

Ćwiek
źródło
1

Miałem ten sam problem przy użyciu Docker i nazwy usługi MySQL dbw pliku docker_compose.yml:

W .envpliku dodałem następujące elementy :

DB_HOST=db

powinieneś także upewnić się, że twój host jest wykrywalny z aplikacji php.

Było tak, ponieważ PHP nie wymyśliło, którego hosta użyć do połączenia.

Oscar David
źródło
0

Podczas korzystania z VirtualMachine upewnij się, że ssh na tym komputerze i przejdź do folderu aplikacji i stamtąd wywołać polecenie php artisan migrate.

cmac
źródło
0

W przeciwnym razie po prostu użyłem

vagrant up

zamiast

homestead up

dla mojej konfiguracji larwy kuźni za pomocą zagrody. Zakładam, że oznaczało to, że witryna była obsługiwana, ale serwer MySQL nigdy nie był uruchamiany. Kiedy użyłem tego ostatniego polecenia, aby uruchomić moje błędne pudełko, błąd zniknął.

Ben Wilson
źródło
0

Wszystkie te odpowiedzi wydają się jak podnoszenie ciężarów ...

Właśnie utworzyłem .envplik; edytowałem mój bootstrap/app.phpplik i odkomentowałem następujący wiersz ...

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

Mam nadzieję, że to komuś pomoże

MrMesees
źródło
0

Dla każdego, kto próbuje utworzyć nowe połączenie db nie na laravel, ale natknął się tutaj, szukając odpowiedzi na uruchomienie PDO z terminala. To by ci pomogło. Możesz go zmienić tak, aby działał najlepiej dla Ciebie.

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

} 

mam nadzieję, że to pomoże!

Ifeanyi Amadi
źródło
0

W moim przypadku musiałem usunąć folder bootstrap / cache i spróbować ponownie.

Moje cenario było po migracji serwera.

Raphael Cangucu
źródło