PDOException SQLSTATE [HY000] [2002] 해당 파일 또는 디렉토리가 없습니다.


319

나는 성공적으로 fortrabbit 내 (아주 기본) 사이트를 구축했지만, 최대한 빨리 SSH 연결로 등 일부 명령 (실행하는 데 있다고 생각 php artisan migrate또는php artisan db:seed 오류 메시지가 나타납니다.

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

어떤 시점에서 내 테이블이 있기 때문에 마이그레이션이 작동해야했지만 지금은 왜 그것이 나를 위해 작동하지 않는지 설명하지 않습니다.



1
때로는 mysql을 아직 설치하지 않았기 때문에
Hassan Gilak

답변:


142

오류 메시지는 소켓을 통한 MySQL 연결이 시도되었음을 나타냅니다 (지원되지 않음).

Laravel (artisan)의 맥락에서 아마도 다른 / 올바른 환경을 사용하고 싶을 것입니다. 예 : php artisan migrate --env=production(또는 어떤 환경). 여기를 참조 하십시오 .


1
이것은 내 문제에 대한 해결책이었습니다. 우리 회사의 개발자 중 하나는 Homestead를 사용하지 않고 소켓을 통해 mysql에 연결합니다. app / database.php 파일에서 소켓 설정을 제거했습니다. 문제 해결
borislemke

방금 php.ini에서 mysqli.so 확장을 활성화해야했습니다
Mehulkumar

4
" 'unix_socket'=> '/Applications/MAMP/tmp/mysql/mysql.sock'"을 config / database.php에 추가해야했습니다
Ángel Carlos del Pozo Muela

안녕하세요 커뮤니티, laravel을 사용하지 않더라도이 오류가 발생합니다. 여기서 문제를 볼 수 있습니까? stackoverflow.com/questions/60796332/…
Kiran Patel

655

라 라벨 4 :app/config/database.php 파일의 "host" 를 "localhost"에서 "127.0.0.1"로 변경

라 라벨 5 :.env 파일의 "DB_HOST" 를 "localhost"에서 "127.0.0.1"로 변경

나는 똑같은 문제가 있었다. 위의 해결책 중 어느 것도 나를 위해 일하지 않았습니다. /app/config/database.php 파일의 "host"를 "localhost"에서 "127.0.0.1"로 변경하여 문제를 해결했습니다.

왜 "localhost"가 기본적으로 작동하지 않는지 확실하지 않지만 symfony2 게시물에서 해결 된 비슷한 질문에서이 답변을 찾았습니다. https://stackoverflow.com/a/9251924/1231563

업데이트 : 일부 사람들은이 픽스가 왜 작동하는지 묻기 때문에 주제에 대해 약간의 연구를했습니다. 이 게시물 https://stackoverflow.com/a/9715164/1231563에 설명 된 것처럼 다른 연결 유형을 사용하는 것처럼 보입니다.

여기서 발생한 문제는 "localhost"가 UNIX 소켓을 사용하고 표준 디렉토리에서 데이터베이스를 찾을 수 없다는 것입니다. 그러나 "127.0.0.1"은 TCP (Transmission Control Protocol)를 사용합니다. 이는 본질적으로이 경우 UNIX 소켓보다 훨씬 안정적인 컴퓨터의 "로컬 인터넷"을 통해 실행됨을 의미합니다.


3
그것은 나에게도 해결책이라는 것이 이상하지만, 명령 줄에서 mysql --host = localhost로 연결할 수는 있지만 PDO에서는 작동하지 않습니다.
John

26
localhost작동하지 않는지 알고 싶습니다 127.0.0.1.
Justin

6
이것은 커맨드 라인 (터미널)에서 PHP 파일을 실행하는 MAMP 시스템에서 나를 위해 일했습니다. 로컬 호스트를 '127.0.0.1'로 변경하기 전까지는 웹 페이지로 작동했지만 명령 줄 파일로는 작동하지 않았습니다.
Samuel Fullman

1
@Justin 로컬 호스트가 소켓을 사용하려고 시도하고 127.0.0.1이 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

같은 문제가 발생하여 Mac OS X 10.10 Yosemite를 실행하고 있습니다. 이미 OS와 함께 제공되는 Apache 서버 및 PHP를 활성화했습니다. 그런 다음 mCrypt 라이브러리를 시작하도록 구성했습니다. 그 후 모델과 DB로 작업 할 때 오류가 발생했습니다.

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

내가 찾은 이유는 PHP와 MySQL을 연결할 수 없기 때문입니다. 이 문제를 해결하려면 다음 단계를 따르십시오.

  1. 터미널을 열고 다음을 사용하여 mysql에 연결하십시오.

    mysql -u root -p
  2. 관련 비밀번호를 묻습니다. 그런 다음 mysql promt를 받으면 다음 명령을 입력하십시오.

    mysql> show variables like '%sock%'
  3. 다음과 같은 것을 얻을 것입니다 :

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
  4. 마지막 행의 값을 유지하십시오.

    /tmp/mysql.sock
  5. 당신의에서 laravel프로젝트 폴더의 대한 모습 database.php의 당신은 DB 연결 매개 변수를 구성 할 경우 파일이 있습니다. 에서 MySQL의 섹션 끝에 다음 줄을 추가합니다 :

    'unix_socket' => '/tmp/mysql.sock'
  6. 다음과 같은 것이 있어야합니다.

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

이제 변경 사항을 저장하고 페이지를 새로 고침하면 작동합니다!


3
가장 "발급 직진"솔루션. 감사합니다, 이것은 MAMP 프로와 라 라벨을 실행하는 나를 고쳤습니다
animaacija

고마워 이것은 나를 위해 일했습니다. OSX 10.10.5 MAMP Pro 사용
marknt15

이것은 MAMP pro 및 OS X 10.11.x에서도 효과적이었습니다. 종료 :/Applications/MAMP/tmp/mysql/mysql.sock
Bort 번호판

1
+1. Yamartino의 답변에서 "localhost"대신 구성에서 "127.0.0.1"을 사용하면 잘 작동하지만 소켓을 사용하면 더 빠르며이 답변은 문제를 해결합니다. unix_socket이 정의 될 때 mysql이 "localhost"를 특별한 방식으로 취급하는 것은 부끄러운
Shautieh

@GregFerrell 그래, 그건 사실입니다하지만 음 ... 나는 그것이 도움이 될 수있는 희망
alexventuraio

51

[PDOException] SQLSTATE[HY000] [2002] No such file or directory다른 이유로 오류 가 발생했습니다 . 우분투 12.04에서 Apache 2.4.7, PHP v5.5.10 및 MySQL 5.6.16으로 완전히 새로운 LAMP 스택을 완성했습니다. 사이트를 다시 옮겨서 해고했습니다. 그러나 [PDOException]위의 이유로 Laravel 4.2.x 기반 사이트를로드 할 수 없습니다 . 그래서이 php -i | grep pdo줄을 확인 하고 알았습니다.

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

그러나 내 /etc/my.cnf에서 양말 파일은 실제로에 /var/run/mysqld/mysqld.sock있습니다.

그래서, 나는 php.ini를 열어서 값을 설정했습니다 pdo_mysql.default_socket:

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

그런 다음 아파치를 다시 시작하고 확인했습니다 php -i | grep pdo.

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

그것은 나를 위해 그것을 고쳤다.


이것은 나를 위해 일한 수정 사항입니다. 문제는 두 가지 버전의 mysql을 설치하고 하나를 제거했다는 것입니다 .127.0.0.1 변경 사항이 작동하지 않거나 구성에 양말을 추가했습니다. 감사합니다! @dcarrith
Luis

2
이것은 내 문제를 찾는 데 도움이되었습니다 .MAMP PHP 바이너리가 아닌 OSX 번들 PHP를 사용하고있었습니다. 올바른 php.ini 등을 가리키는 올바른 버전의 php를 사용하고 있는지 확인하십시오. "doh!" 순간.
dragonflyesque

43

@stuyam의 답변으로 "No such file or directory"문제가 해결되었습니다.

짧은 대답 : /app/config/database.php 파일의 "host"를 "localhost"에서 "127.0.0.1"로 변경하십시오.

그러나 "연결이 거부되었습니다"라는 오류가 발생했습니다. 누구든지 같은 문제가 발생하면 app / config / local / database.php 파일을 업데이트하여 포트가 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'    => '',
    ),

4
내 경우에는 그랬지만 'port' => '33060'이 대답은 나를 거기에 데려 갔다!
mopo922

25

Laravel Homestead를 사용하는 경우 서버에서 명령을 호출하고 있는지 확인하십시오.

homestead ssh

그런 다음 올바른 디렉토리로 cd하고 명령을 실행하십시오.


2
이것은 효과가 있었으며 먼저 ssh 대신 VM에서 컴퓨터로 명령을 실행하고 거기에서 명령을 실행했습니다.
cmac

나는 항상이 단계를 잊었다. 허. 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel

1
vagrant ssh내 경우에
Marcos Curvello

22

내 경우에는 전혀 문제가 없었으며 mysql 서비스를 시작하는 것을 잊어 버렸습니다 ...

sudo service mysqld start

19

사용자 활성화 옵션 MYSQL에 대한 네트워크 액세스 허용

여기에 이미지 설명을 입력하십시오


18

아래 예제와 같이 database.php 파일에 mysql.sock 경로를 추가하십시오.

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

예플

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

18

그것은에서 나는 변경 후 일 DB_HOST=localhostDB_HOST=127.0.0.1.env의 파일에서


2
이것은 효과가 있습니다. 왜 localhost작동하지 않는지 설명하는 아이디어 가 있습니까?
Fusion

1
당신이 컨테이너로 'localhost를'이해 컨테이너 내부의 앱을 실행하는 경우 @Fusion, 127.0.0.1은 호스트의 DB를 사용하도록 지시
deathemperor

나도 그런 문제가 있었고, 캐시를 지우거나 장인을 섬길 수 없었습니다
Tom Mwenda

17

PDO가 "localhost"호스트를 특수하게 처리하기 때문입니다.

참고 : Unix 전용 : 호스트 이름이 "localhost"로 설정되면 도메인 소켓을 통해 서버에 연결됩니다. PDO_MYSQL이 libmysqlclient에 대해 컴파일되면 소켓 파일의 위치는 libmysqlclient의 컴파일 위치에 있습니다. PDO_MYSQL이 mysqlnd에 대해 컴파일되면 pdo_mysql.default_socket 설정을 통해 기본 소켓을 설정할 수 있습니다.

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

localhost를 127.0.0.1로 변경하면 TCP 사용이 "강제"됩니다.

참고 : mysqli_connect는 localhost와 잘 작동합니다.


12

@dcarrith의 답변을 바탕으로 ...

설정 파일을 편집하는 대신 PHP가 찾고있는 위치에 실제 mysql.sock에 연결되는 별칭을 만들었습니다. ( 소스 )

다음 두 명령을 실행하십시오 (다시 시작할 필요 없음).

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

11

1 단계

그냥 실행하려면 unix_socket의 경로를 찾으십시오. netstat -ln | grep mysql

당신은 이와 같은 것을 얻어야합니다

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

2 단계

그것을 가져 와서 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' <-----
            ),
        ),

그것이 도움이되기를 바랍니다!


8

MAMP Pro에서 실행 중이며 마이그레이션 (DB 테이블 생성)을 시도 할 때 이와 비슷한 문제가 발생했습니다. 이 언급 된 제안 중 몇 가지를 시도했지만 나에게 도움이되지 않았습니다.

따라서 간단히 (1 시간 인터넷 검색 후) /config/database.php에 두 가지를 추가했습니다.

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

지금은 잘 작동합니다!


4

포트를주의 깊게 확인하십시오. 내 경우에는 8889이고 8888을 사용하고 있습니다. "DB_HOST"를 "localhost"에서 "127.0.0.1"로 변경하거나 그 반대로 변경하십시오.


감사합니다, 내 항구는 3306이지만 내 실제 항구는 8889입니다
David

4

도커 컨테이너를 사용하여 응용 프로그램을 실행할 때이 문제가 발생했습니다.

해결책은 내가 사용하고있는 MySQL 서비스 컨테이너의 이름 docker_compose.yml을 DB_HOST 에 넣었습니다 . 제 경우에는 다음과 db같습니다.

DB_HOST=db

도움이 되길 바랍니다.


2

Laravel 5부터 데이터베이스 사용자 이름과 비밀번호는 프로젝트 디렉토리에 존재하는 .env 파일에 들어갑니다.

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

보시다시피 이러한 환경 변수는 여기에서 '단조'문자열을 재정의하므로 변경해도 효과가 없습니다.

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

자세한 내용은 여기 https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables


2

Elixir / Gulp에서 PHPUnit을 실행하고 내 Vagrant 환경으로 Homestead를 실행할 때이 문제가 발생했습니다.

내 경우에는 내가에서 .env의 파일을 편집 DB_HOST=localhost하는 DB_HOST=192.168.10.10경우 192.168.10.10내 방랑 / 농가 호스트의 IP입니다.


2

localhost에 연결을 시도하십시오.

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

127.0.0.1에 연결을 시도하십시오.

SQLSTATE[HY000] [2002] Connection refused

좋아, my.cnf (OS X 10.5 :)에서 다음 설정을 주석 처리 / 제거하십시오 /opt/local/etc/mysqlxx/my.cnf.

[mysqld]
# skip-networking

물론, MySQL 서버를 중지하고 시작하십시오.


2

Drupal 웹 사이트에 액세스하는 데 비슷한 문제가있었습니다. 명령 줄을 열고 MySQL 서버 또는 서비스를 다시 시작하여 문제를 해결했습니다.

service mysqld restart

이 작동합니다. 그렇지 않으면 로컬 웹 서버를 다시 시작하십시오.

service httpd restart

충분해야합니다. 다른 환경에서도 작동하기를 바랍니다. 이러한 명령에는 일반적으로 수퍼 유저 권한이 필요합니다.


1

Laravel Homestead를 사용하는 경우 설정은 다음과 같습니다

(Vagrant-Virtual Machine 포함)

.bash 프로필

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

단말기

vm

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

1

누구든지 여전히 답을 찾고 있다면 .env 파일을 확인하십시오. 어떤 이유로 laravel은 .env.example 파일을 생성 하므로이 답변이 모두 효과가 없었습니다. .env.example의 이름을 .env로 바꾸는 문제를 해결했습니다.


발생할 수있는 다양한 오류가 있기 때문에이 질문에 대한 정답은 없습니다. 이것은 .env 파일을 원격 서버로 복사하지 못하므로 그 중 하나입니다. 따라서 쿼리를 실행하려는 서버에서 .env 파일을 검사하여 둘 다 존재하고 연결하는 데 필요한 정보가 있는지 확인하는 것이 좋습니다.
petercoles

1

이것은 MySQL이 실행되지 않았기 때문에 나에게 일어난 일입니다. /usr/local/etc/my.cnf.d/디렉토리 가 누락되어 MySQL을 시작하지 못했습니다 .

이것은 /usr/local/etc/my.cnf구성 파일에 glob include ( include /usr/local/etc/my.cnf.d/*.cnf) 로 필요했습니다 .

을 실행 mkdir /usr/local/etc/my.cnf.d한 다음 MySQL을 시작하면 문제가 해결되었습니다.


1

제 경우에는 맥 터미널에서 PHP artisan migrate를 실행 중이었습니다. 희망이 누군가에게 두통을 도와줍니다.


1

dbdocker_compose.yml 파일에서 Docker 및 MySQL 서비스 이름 을 사용하는 것과 동일한 문제가 발생했습니다 .

.env파일에 다음을 추가했습니다 .

DB_HOST=db

또한 PHP 앱에서 호스트를 검색 할 수 있는지 확인해야합니다.

PHP가 연결에 사용할 호스트를 파악하지 못했기 때문입니다.


0

VirtualMachine을 사용하는 경우 해당 머신으로 ssh하고 App 폴더로 이동하여 php artisan migrate 명령을 호출하십시오.


0

경우에 따라, 나는 단순히 사용했다

vagrant up

대신에

homestead up

농가를 사용하는 위조 애벌레 설치. 나는 이것이 사이트가 서비스되고 있음을 의미한다고 가정하지만 MySQL 서버는 부팅되지 않았습니다. 후자의 명령을 사용하여 빈 상자를 시작했을 때 오류가 사라졌습니다.


0

이 모든 대답은 무겁게 들리는 것 같습니다 ...

방금 .env파일을 만들었습니다 . 내 bootstrap/app.php파일을 편집 하고 다음 줄의 주석을 해제했습니다 ...

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

이것이 누군가를 돕기를 바랍니다.


0

laravel이 아닌 새로운 db 연결을 만들려고하지만 터미널에서 PDO를 실행하기위한 답변을 찾는 데 어려움을 겪은 사람이라면 누구나. 이것은 당신에게 도움이 될 것입니다. 그리고 당신에게 가장 잘 작동하도록 리팩토링 할 수 있습니다.

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

} 

그것이 도움이되기를 바랍니다!


0

내 경우에는 bootstrap / cache 폴더를 제거하고 다시 시도해야했습니다.

제 시나리오는 서버 마이그레이션 후였습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.