PDOException SQLSTATE [HY000] [2002] Esse arquivo ou diretório não existe

320

Acredito que implantei com êxito meu site (muito básico) no fortrabbit, mas assim que me conecto ao SSH para executar alguns comandos (como php artisan migrateou php artisan db:seed), recebo uma mensagem de erro:

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

Em algum momento, a migração deve ter funcionado, porque minhas tabelas estão lá - mas isso não explica por que não está funcionando para mim agora.

Daniel Hollands
fonte
1
às vezes ele simplesmente porque você ainda não instalou o MySQL ainda
Hassan Gilak

Respostas:

142

A mensagem de erro indica que uma conexão MySQL via soquete é tentada (o que não é suportado).

No contexto do Laravel (artesão), você provavelmente deseja usar um ambiente diferente / o correto. Por exemplo: php artisan migrate --env=production(ou qualquer ambiente). Veja aqui .

ukautz
fonte
1
Esta foi a solução para o meu problema, um dos desenvolvedores da nossa empresa não usa o Homestead e se conecta ao mysql via soquete. Eu removi a configuração do soquete no meu arquivo app / database.php. Problema resolvido
borislemke
Eu só tinha que permitir mysqli.so extensão no php.ini
Mehulkumar
4
Eu tive que adicionar "'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'" para config / database.php
Ángel Carlos del Pozo Muela
Olá comunidade, estou recebendo esse erro mesmo que não esteja usando o laravel. Você pode olhar para o problema aqui é stackoverflow.com/questions/60796332/…
Kiran Patel
656

Laravel 4: Altere "host" no app/config/database.phparquivo de "localhost" para "127.0.0.1"

Laravel 5: Altere "DB_HOST" no .envarquivo de "localhost" para "127.0.0.1"

Eu tive o mesmo problema. Nenhuma das soluções acima funcionou para mim. Resolvi o problema alterando o "host" no arquivo /app/config/database.php de "localhost" para "127.0.0.1".

Não sei por que "localhost" não funciona por padrão, mas encontrei esta resposta em uma pergunta semelhante resolvida em um post do symfony2. https://stackoverflow.com/a/9251924/1231563

Atualização: algumas pessoas perguntaram por que essa correção funciona, então eu fiz um pouco de pesquisa sobre o tópico. Parece que eles usam tipos de conexão diferentes, conforme explicado neste post https://stackoverflow.com/a/9715164/1231563

O problema que surgiu aqui é que "localhost" usa um soquete UNIX e não consegue encontrar o banco de dados no diretório padrão. No entanto, "127.0.0.1" usa o TCP (Transmission Control Protocol), o que significa que ele é executado através da "internet local" no seu computador, sendo muito mais confiável do que o soquete UNIX nesse caso.

Stuyam
fonte
3
estranho que fosse a solução para mim também, mas eu consigo conectar a partir da linha de comando com o mysql --host = localhost - que funciona, mas não a partir do PDO.
John
26
Eu adoraria saber por localhostque não funciona e 127.0.0.1funciona?
Justin
6
Isso funcionou para mim em um sistema MAMP executando um arquivo php na linha de comando (terminal). Funcionou como uma página da Web, mas não como um arquivo de linha de comando até que eu mudei o host local para '127.0.0.1'
Samuel Fullman
1
@ Justin Eu acho que é porque o host local tenta usar o soquete, enquanto o 127.0.0.1 usa o 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

Eu tenho o mesmo problema e estou executando o Mac OS X 10.10 Yosemite. Eu habilitei o Apache Server e o PHP que já vem com o sistema operacional. Depois, apenas configurei a biblioteca mCrypt para começar. Depois disso, quando eu estava trabalhando com modelos e DB, recebi o erro:

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

A razão pela qual encontrei é apenas porque o PHP e o MySQL não podem se conectar. Para corrigir esse problema, sigo as próximas etapas:

  1. Abra um terminal e conecte-se ao mysql com:

    mysql -u root -p
  2. Ele solicitará a senha relacionada. Então, quando você obtiver o prompt do mysql, digite o seguinte comando:

    mysql> show variables like '%sock%'
  3. Você obterá algo como isto:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
    
  4. Mantenha o valor da última linha:

    /tmp/mysql.sock
  5. Na laravelpasta do seu projeto, procure o arquivo database.php onde você configura os parâmetros de conexão do DB. Na seção mysql , adicione a próxima linha no final:

    'unix_socket' => '/tmp/mysql.sock'
  6. Você deve ter algo como isto:

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

Agora basta salvar as alterações, recarregar a página e ela deve funcionar!

alexventuraio
fonte
3
A solução mais "direta para emitir". Thanx, este fixou-me em correr Laravel com MAMP pro
animaacija
Obrigado por isso. Isso funcionou para mim. Usando OSX 10.10.5 MAMP Pro
marknt15
Isso funcionou para mim também com o MAMP pro e o OS X 10.11.x. Acabou sendo:/Applications/MAMP/tmp/mysql/mysql.sock
Bort License Plate
1
+1. Usar "127.0.0.1" na configuração em vez de "localhost", como Yamartino disse em sua resposta, funciona bem, mas é mais rápido com um soquete e esta resposta resolve o problema. É uma pena que o mysql trate "localhost" de maneira tão peculiar quando o unix_socket é definido ...
Shautieh
@GregFerrell Sim, isso é verdade, mas bem ... Espero que seja útil #
alexventuraio
51

Eu encontrei o [PDOException] SQLSTATE[HY000] [2002] No such file or directoryerro por um motivo diferente. Acabei de criar uma nova pilha LAMP no Ubuntu 12.04 com Apache 2.4.7, PHP v5.5.10 e MySQL 5.6.16. Voltei a mudar meus sites e os demiti. Mas não consegui carregar meu site baseado no Laravel 4.2.x por causa do [PDOException]acima. Então, eu verifiquei php -i | grep pdoe notei esta linha:

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

Mas, no meu /etc/my.cnf, o arquivo sock está realmente dentro /var/run/mysqld/mysqld.sock.

Então, eu abri meu php.ini e configurei o valor para pdo_mysql.default_socket:

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

Então, reiniciei o apache e verifiquei php -i | grep pdo:

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

Isso consertou para mim.

dcarrith
fonte
Esta foi a correção que funcionou para mim, o problema foi que instalei duas versões do mysql e removi uma, a alteração 127.0.0.1 não funcionou ou adicionou a meia na configuração, obrigado! @dcarrith
Luis
2
Isso me ajudou a encontrar o meu problema - o fato de eu estar usando o php fornecido com o OSX, não o binário do php do MAMP. Portanto, verifique se você está usando a versão correta do php que aponta para o php.ini correto etc. Definitivamente "doh!" momento.
dragonflyesque
43

A resposta de @stuyam resolveu o problema "Não existe esse arquivo ou diretório" para mim

Resposta curta: Altere "host" no arquivo /app/config/database.php de "localhost" para "127.0.0.1"

Mas tive um erro "Conexão recusada". Se alguém teve o mesmo problema, minha solução para isso foi atualizar o arquivo app / config / local / database.php para que a porta seja 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
fonte
4
No meu caso, foi 'port' => '33060'mas essa resposta me levou até lá!
Mopo922
26

Se você estiver usando o Laravel Homestead, verifique se está chamando os comandos no servidor.

homestead ssh

Em seguida, basta cd para o diretório certo e acionar seu comando lá.

Koen B.
fonte
2
Isso funcionou, eu estava executando o comando do meu computador em vez do ssh na VM primeiro e executando o comando lá.
C17
Eu sempre esqueço este passo. Heh. 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel
1
vagrant sshno meu caso
Marcos Curvello
22

No meu caso, não tive nenhum problema, apenas esqueci de iniciar o serviço mysql ...

sudo service mysqld start
Carlos ABS
fonte
19

Mamp user enable option Permitir acesso de rede ao MYSQL

insira a descrição da imagem aqui

George John
fonte
18

Adicione o caminho mysql.sock no arquivo database.php como no exemplo abaixo

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

Exemplo

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

Funcionou depois que mudei DB_HOST=localhostpara DB_HOST=127.0.0.1para o arquivo .env

NuOne
fonte
2
Isso funcionou, você está certo. Você tem alguma idéia explicando por localhostque não funciona?
Fusion
1
@Fusion se você estiver executando o aplicativo dentro de um recipiente que vai entender 'localhost' como o recipiente, 127.0.0.1 diz-lhe para usar db do hospedeiro
deathemperor
Eu também tive esse problema, não consegui limpar o cache ou executar o serviço de artesão
Tom Mwenda
17

Isso ocorre porque o DOP trata especialmente o host "localhost":

Nota: Somente Unix: quando o nome do host é definido como "localhost", a conexão com o servidor é feita através de um soquete de domínio. Se PDO_MYSQL for compilado no libmysqlclient, o local do arquivo de soquete estará no local do compilado libmysqlclient. Se PDO_MYSQL for compilado no mysqlnd, um soquete padrão poderá ser definido através da configuração pdo_mysql.default_socket.

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

Alterar localhost para 127.0.0.1 "forçará" o uso do TCP.

Nota: mysqli_connect está funcionando bem com o localhost.

Thomas Decaux
fonte
12

Com base na resposta de @dcarrith ...

Em vez de editar os arquivos de configuração, criei um alias no local que o PHP procura, que se conecta ao mysql.sock real. ( fonte )

Basta executar estes dois comandos (não é necessário reiniciar):

mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
Justin
fonte
11

Passo 1

Encontre o caminho para o seu unix_socket, para isso basta executar netstat -ln | grep mysql

Você deve obter algo parecido com isto

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

Passo 2

Pegue isso e adicione-o ao seu parâmetro 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' <-----
            ),
        ),

Espero que ajude !!

cyber8200
fonte
8

Estou executando no MAMP Pro e tive esse problema semelhante ao tentar migrar (criar tabelas db). Tentei algumas dessas sugestões mencionadas também, mas não fez isso por mim.

Então, simplesmente (depois de uma hora pesquisando), adicionei duas coisas ao /config/database.php.

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

Funciona bem agora!

anoraq
fonte
4

Verifique sua porta com cuidado. No meu caso, era 8889 e estou usando o 8888. altere "DB_HOST" de "localhost" para "127.0.0.1" e vice-versa

Ahmed Awan
fonte
Ótimo, obrigado, minha porta era 3306, mas minha porta real é 8889
David
4

Eu tive esses problemas quando estava executando meu aplicativo usando contêineres de encaixe.

A solução foi colocar o nome do contêiner de serviço MySQL que eu estava usando no docker_compose.ymlDB_HOST. No meu caso, foi db:

DB_HOST=db

Espero que ajude.

Lano
fonte
2

No Laravel 5, o nome de usuário e a senha do banco de dados estão no arquivo .env existente no diretório do projeto, por exemplo

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

Como você pode ver, essas variáveis ​​de ambiente estão substituindo as strings 'forge' aqui, portanto, alterá-las não tem efeito:

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

Mais informações estão aqui https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables

malhal
fonte
2

Eu encontrei esse problema ao executar o PHPUnit no Elixir / Gulp e Homestead como meu ambiente do Vagrant.

No meu caso eu editei o arquivo .env a partir DB_HOST=localhostde DB_HOST=192.168.10.10onde 192.168.10.10é o IP do meu anfitrião Vagrant / Homestead.


fonte
2

Tente se conectar ao localhost:

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

Tente se conectar ao 127.0.0.1:

SQLSTATE[HY000] [2002] Connection refused

OK, basta comentar / remover a seguinte configuração do my.cnf (no OS X 10.5:) /opt/local/etc/mysqlxx/my.cnfpara obter:

[mysqld]
# skip-networking

Obviamente, pare e inicie o MySQL Server.

Anna Logg
fonte
2

Eu tive problemas semelhantes ao acessar o site do Drupal. Corrigi-o abrindo a linha de comando e reiniciando meu servidor ou serviço MySQL:

service mysqld restart

Isso deve funcionar. Caso contrário, reinicie o servidor da web local:

service httpd restart

Isso deve ser o suficiente. Espero que funcione para outros ambientes também. Observe que esses comandos geralmente requerem privilégios de superusuário.

RAWGIT
fonte
1

Se você estiver usando o Laravel Homestead, aqui estão as configurações

(inclui máquina virtual Vagrant)

.bash-profile

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
fonte
1

Se alguém ainda estiver procurando a resposta, verifique seu arquivo .env. Por alguma razão, o laravel cria um arquivo .env.example, para que todas essas respostas não funcionem para mim. Corrigi meu problema renomeando .env.example para .env

Alberto Alegria
fonte
Não existe uma resposta correta para esta pergunta, pois há uma variedade de erros que podem ser cometidos. Este é um deles, pois está falhando ao copiar o arquivo .env para um servidor remoto. Portanto, vale a pena verificar o arquivo .env no servidor em que você está tentando executar a consulta para garantir que ela exista e contenha as informações necessárias para estabelecer uma conexão.
91316 petercoles
1

Isso aconteceu comigo porque o MySQL não estava sendo executado. O MySQL falhou ao iniciar porque havia um /usr/local/etc/my.cnf.d/diretório ausente .

Isso estava sendo exigido pelo meu /usr/local/etc/my.cnfarquivo de configuração como um glob include ( include /usr/local/etc/my.cnf.d/*.cnf).

A execução mkdir /usr/local/etc/my.cnf.de o MySQL foram corrigidos.

james2doyle
fonte
1

No meu caso, eu estava executando o php artisan migrate no meu terminal mac, quando precisava ssh no vagrant e executá-lo a partir daí. Espero que ajude alguém a dor de cabeça.

Brad
fonte
1

Eu tive o mesmo problema ao usar o Docker e o nome do serviço MySQL dbno arquivo docker_compose.yml:

Eu adicionei o seguinte no .envarquivo:

DB_HOST=db

você também deve garantir que seu host possa ser descoberto no aplicativo php.

Foi porque o PHP não descobriu qual host usar para se conectar.

Oscar David
fonte
0

Ao usar um VirtualMachine, certifique-se de ssh nessa máquina, navegue até a pasta App e chame o comando php artisan migrate a partir daí.

cmac
fonte
0

Em maio, eu simplesmente usei

vagrant up

ao invés de

homestead up

para minha instalação larval de forja usando a propriedade. Estou assumindo que isso significava que o site estava sendo veiculado, mas o servidor MySQL nunca foi inicializado. Quando usei o último comando para iniciar minha caixa de vagabundos, o erro desapareceu.

Ben Wilson
fonte
0

Todas essas respostas parecem pesadas ...

Acabei de criar um .envarquivo; editei meu bootstrap/app.phparquivo e descomentei a seguinte linha ...

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

Espero que isso ajude alguém

MrMesees
fonte
0

Para quem está tentando criar uma conexão db nova, não no laravel, mas se deparou aqui em busca de respostas para executar o PDO a partir do Terminal. Isso seria de ajuda para você. E você pode refatorá-lo para funcionar melhor para você.

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

} 

espero que ajude!

Ifeanyi Amadi
fonte
0

No meu caso, tive que remover a pasta bootstrap / cache e tente novamente.

Meu cenário foi após uma migração de servidor.

Raphael Cangucu
fonte