Programing

PDOException SQLSTATE [HY000] [2002] 해당 파일 또는 디렉토리가 없음

lottogame 2020. 3. 26. 08:21
반응형

PDOException SQLSTATE [HY000] [2002] 해당 파일 또는 디렉토리가 없음


나는 (매우 기본적인) 사이트를 fortrabbit에 성공적으로 배포했다고 생각하지만 SSH에 연결하면 php artisan migrate또는 (와 같은) 일부 명령을 실행하자마자 php artisan db:seed오류 메시지가 나타납니다.

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

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


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

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


라 라벨 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 소켓보다 훨씬 안정적인 컴퓨터의 "로컬 인터넷"을 통해 실행됨을 의미합니다.


같은 문제가 발생하여 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',
        ),
    

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


[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

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


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

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

homestead ssh

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


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

sudo service mysqld start

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

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


아래 예제와 같이 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'),

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와 잘 작동합니다.


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


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

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

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

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

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

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


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

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

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

지금은 잘 작동합니다!


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


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


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

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


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 서버를 중지하고 시작하십시오.


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

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

DB_HOST=db

도움이 되길 바랍니다.


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

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


이것은 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을 시작하면 문제가 해결되었습니다.


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


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

service mysqld restart

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

service httpd restart

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


VirtualMachine을 사용할 때 해당 머신으로 ssh하고 App 폴더로 이동 한 다음 php artisan migrate 명령을 호출하십시오.


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

vagrant up

대신에

homestead up

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


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

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

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

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


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

} 

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


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

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


내 대답은 Laravel에만 해당됩니다.

database.php구성 파일에서 로컬 Docker MySQL 서비스에 대한 새 연결을 만들고 기본 연결로 설정 한 후이 메시지가 나타납니다 . 모델에서 덮어 쓰면서 다른 연결을 설정하고 있음을 잊었습니다.

class Model extends \Illuminate\Database\Eloquent\Model
{
    protected $connection;

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
        $this->connection = 'some_other_connection';
    }
...

따라서 database.php파일의 기본 연결 이 올바른 자격 증명을 가리 키더라도 모델은 여전히 ​​로컬 환경 파일에서 제거한 원격 데이터베이스 연결 구성을 사용하고있었습니다.

참고 URL : https://stackoverflow.com/questions/20723803/pdoexception-sqlstatehy000-2002-no-such-file-or-directory

반응형