PDOException SQLSTATE [HY000] [2002] No existe tal archivo o directorio

320

Creo que he implementado con éxito mi sitio (muy básico) en fortrabbit, pero tan pronto como me conecto a SSH para ejecutar algunos comandos (como php artisan migrateo php artisan db:seed) recibo un mensaje de error:

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

En algún momento, la migración debe haber funcionado, porque mis tablas están allí, pero esto no explica por qué no funciona para mí ahora.

Daniel Hollands
fuente
Posible duplicado de PHP - La conexión MySQL no funciona: 2002 No
existe
1
a veces es solo porque todavía no has instalado mysql
Hassan Gilak

Respuestas:

142

El mensaje de error indica que se ha intentado una conexión MySQL a través de un socket (que no es compatible).

En el contexto de Laravel (artesano), es probable que desee utilizar un entorno diferente / correcto. Por ejemplo: php artisan migrate --env=production(o cualquier ambiente). Ver aquí .

ukautz
fuente
1
Esta fue la solución a mi problema, uno de los desarrolladores de nuestra empresa no usa Homestead y se conecta a mysql a través de un socket. Eliminé la configuración del socket dentro de mi archivo app / database.php. Problema resuelto
borislemke
Solo tenía que habilitar la extensión mysqli.so en php.ini
Mehulkumar
44
Tuve que agregar "'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'" a config / database.php
Ángel Carlos del Pozo Muela
hola comunidad, recibo este error a pesar de que no estoy usando laravel, ¿puedes ver el problema aquí? stackoverflow.com/questions/60796332/…
Kiran Patel
656

Laravel 4: Cambiar "host" en el app/config/database.phparchivo de "localhost" a "127.0.0.1"

Laravel 5: Cambie "DB_HOST" en el .envarchivo de "localhost" a "127.0.0.1"

Tuve exactamente el mismo problema. Ninguna de las soluciones anteriores funcionó para mí. Resolví el problema cambiando el "host" en el archivo /app/config/database.php de "localhost" a "127.0.0.1".

No estoy seguro de por qué "localhost" no funciona de forma predeterminada, pero encontré esta respuesta en una pregunta similar resuelta en una publicación de Symfony2. https://stackoverflow.com/a/9251924/1231563

Actualización: Algunas personas han preguntado por qué funciona esta solución, por lo que he investigado un poco sobre el tema. Parece que usan diferentes tipos de conexión como se explica en esta publicación https://stackoverflow.com/a/9715164/1231563

El problema que surgió aquí es que "localhost" usa un socket UNIX y no puede encontrar la base de datos en el directorio estándar. Sin embargo, "127.0.0.1" utiliza TCP (Protocolo de control de transmisión), lo que significa que en este caso se ejecuta a través del "Internet local" en su computadora, siendo mucho más confiable que el socket UNIX.

stuyam
fuente
3
Es extraño que también fuera la solución para mí, pero puedo conectarme desde la línea de comandos con mysql --host = localhost - que funciona, pero no desde PDO.
John
26
Me encantaría saber ¿POR QUÉ localhostno funciona y 127.0.0.1funciona?
Justin
66
Esto funcionó para mí en un sistema MAMP que ejecuta un archivo php en la línea de comando (terminal). Funcionó como una página web, pero no como un archivo de línea de comando hasta que cambié localhost a '127.0.0.1'
Samuel Fullman
1
@Justin Creo que eso se debe a que localhost intenta usar el socket, mientras que 127.0.0.1 usa 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

Tengo el mismo problema y estoy ejecutando Mac OS X 10.10 Yosemite. He habilitado el servidor Apache y PHP que ya viene con el sistema operativo. Luego, acabo de configurar la biblioteca mCrypt para comenzar. Después de eso, cuando estaba trabajando con modelos y DB recibí el error:

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

La razón que encontré es simplemente porque PHP y MySQL no pueden conectarse por sí mismos. Para solucionar este problema, sigo los siguientes pasos:

  1. Abra una terminal y conéctese a mysql con:

    mysql -u root -p
  2. Le pedirá la contraseña relacionada. Luego, una vez que obtenga la solicitud mysql, escriba el siguiente comando:

    mysql> show variables like '%sock%'
  3. Obtendrás algo como esto:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
  4. Mantenga el valor de la última fila:

    /tmp/mysql.sock
  5. En su laravelcarpeta de proyecto, busque el archivo database.php donde configura los parámetros de conexión de la base de datos . En la sección mysql agregue la siguiente línea al final:

    'unix_socket' => '/tmp/mysql.sock'
  6. Debes tener algo como esto:

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

¡Ahora solo guarde los cambios, vuelva a cargar la página y debe funcionar!

alexventuraio
fuente
3
La solución más "directa al problema". Gracias, esto me arregló para ejecutar Laravel con MAMP pro
animaacija
Gracias por esto. Esto funcionó para mí. Usando OSX 10.10.5 MAMP Pro
marknt15
Esto también funcionó para mí con MAMP pro y OS X 10.11.x. Terminó siendo:/Applications/MAMP/tmp/mysql/mysql.sock
Bort License Plate
1
+1. Usar "127.0.0.1" en la configuración en lugar de "localhost" como dijo Yamartino en su respuesta funciona bien, pero es más rápido con un socket y esta respuesta resuelve el problema. Es una pena que mysql trate "localhost" de una manera tan peculiar cuando se define
unix_socket
@GregFerrell Sí, eso es cierto, pero bueno ... espero que pueda ser útil
alexventuraio
51

Encontré el [PDOException] SQLSTATE[HY000] [2002] No such file or directoryerror por una razón diferente. Acababa de terminar de construir una nueva pila LAMP en Ubuntu 12.04 con Apache 2.4.7, PHP v5.5.10 y MySQL 5.6.16. Moví mis sitios nuevamente y los activé. Pero no pude cargar mi sitio basado en Laravel 4.2.x debido a lo [PDOException]anterior. Entonces, verifiqué php -i | grep pdoy noté esta línea:

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

Pero, en mi /etc/my.cnf el archivo de calcetines está realmente en /var/run/mysqld/mysqld.sock.

Entonces, abrí mi php.ini y configuré el valor para pdo_mysql.default_socket:

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

Luego, reinicié Apache y verifiqué php -i | grep pdo:

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

Eso me lo arregló.

dcarrith
fuente
Esta fue la solución que funcionó para mí, el problema fue que instalé dos versiones de mysql y eliminé una, el cambio 127.0.0.1 no funcionó o agregué el calcetín en la configuración, ¡gracias! @dcarrith
Luis
2
Esto me ayudó a encontrar mi problema, que era que estaba usando el php incluido de OSX, no el binario de MAMP php. Así que asegúrese de estar utilizando la versión correcta de php que apunta al php.ini correcto, etc. Definitivamente "doh!" momento.
dragonflyesque
43

La respuesta de @stuyam resolvió el problema "No existe tal archivo o directorio" para mí

Respuesta corta: cambie "host" en el archivo /app/config/database.php de "localhost" a "127.0.0.1"

Pero luego tuve un error de "Conexión rechazada". Si alguien tuvo el mismo problema, mi solución para esto fue actualizar el archivo app / config / local / database.php para que el puerto sea 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
fuente
44
En mi caso, lo fue, ¡ 'port' => '33060'pero esta respuesta me llevó allí!
mopo922
26

Si está utilizando Laravel Homestead, asegúrese de llamar a los comandos en el servidor.

homestead ssh

Luego simplemente cd al directorio correcto y dispare su comando allí.

Koen B.
fuente
2
Esto funcionó, estaba ejecutando el comando desde mi computadora en lugar de ssh en VM primero y ejecuté el comando allí.
cmac
Siempre olvido este paso. Je 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel
1
vagrant sshen mi caso
Marcos Curvello
22

En mi caso no tuve ningún problema, solo olvidé iniciar el servicio mysql ...

sudo service mysqld start
Carlos ABS
fuente
19

Opción de habilitación de usuario de Mamp Permitir acceso de red a MYSQL

ingrese la descripción de la imagen aquí

George John
fuente
18

Agregue la ruta mysql.sock en el archivo database.php como el siguiente ejemplo

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

Ejemplo

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

Funcionó después de cambiar de DB_HOST=localhosta DB_HOST=127.0.0.1en el archivo .env

NuOne
fuente
2
Esto funcionó, tienes razón. ¿Tienes alguna idea que explique por qué localhostno funciona?
Fusion
1
@Fusion si está ejecutando su aplicación dentro de un contenedor, entenderá 'localhost' como el contenedor, 127.0.0.1 le dice que use la base de datos del host
desatemperador el
También tuve un problema así, no pude borrar el caché o ejecutar el servicio artesanal
Tom Mwenda
17

Esto se debe a que PDO trata el host "localhost" especialmente:

Nota: Solo Unix: cuando el nombre de host se establece en "localhost", la conexión al servidor se realiza a través de un socket de dominio. Si PDO_MYSQL se compila contra libmysqlclient, entonces la ubicación del archivo de socket está en la ubicación compilada de libmysqlclient. Si PDO_MYSQL se compila contra mysqlnd, se puede establecer un socket predeterminado a través de la configuración pdo_mysql.default_socket.

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

Cambiar localhost a 127.0.0.1 "forzará" el uso de TCP.

Nota: mysqli_connect funciona bien con localhost.

Thomas Decaux
fuente
12

Sobre la base de la respuesta de @dcarrith ...

En lugar de editar los archivos de configuración, creé un alias en la ubicación que busca PHP que se conecta al verdadero mysql.sock. ( fuente )

Simplemente ejecute estos dos comandos (no es necesario reiniciar):

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

Paso 1

Encuentra la ruta a tu unix_socket, para hacerlo solo ejecuta netstat -ln | grep mysql

Deberías obtener algo como esto

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

Paso 2

Toma eso y añadirlo en su unix_socket parámetro

'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 eso ayude !!

cyber8200
fuente
8

Estoy ejecutando en MAMP Pro y tuve este problema similar al intentar migrar (crear tablas db). Intenté algunas de estas sugerencias mencionadas también, pero no lo hice por mí.

Entonces, simplemente (después de una hora buscando en Google), agregué dos cosas a /config/database.php.

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

Funciona bien ahora!

anoraq
fuente
4

Verifique su puerto cuidadosamente. En mi caso fue 8889 y estoy usando 8888. cambie "DB_HOST" de "localhost" a "127.0.0.1" y viceversa

Ahmed Awan
fuente
Genial, gracias, mi puerto era 3306 pero mi puerto real es 8889
David
4

Tuve estos problemas cuando estaba ejecutando mi aplicación usando contenedores docker.

La solución fue poner el nombre del contenedor del servicio MySQL que estaba usando en docker_compose.ymlDB_HOST. En mi caso, fue db:

DB_HOST=db

Espero eso ayude.

Lano
fuente
2

A partir de Laravel 5, el nombre de usuario y la contraseña de la base de datos van en el archivo .env que existe en el directorio del proyecto, p. Ej.

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

Como puede ver, estas variables de entorno anulan las cadenas de 'forjar' aquí, por lo que cambiarlas no tiene ningún efecto:

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

Más información aquí https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables

malhal
fuente
2

Me encontré con este problema al ejecutar PHPUnit en Elixir / Gulp, y Homestead como mi entorno Vagrant.

En mi caso he editado el archivo de .env DB_HOST=localhosta DB_HOST=192.168.10.10donde 192.168.10.10está el IP de mi anfitrión Vagrant / Homestead.


fuente
2

Intente conectarse a localhost:

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

Intente conectarse a 127.0.0.1:

SQLSTATE[HY000] [2002] Connection refused

OK, solo comente / elimine la siguiente configuración de my.cnf (en OS X 10.5:) /opt/local/etc/mysqlxx/my.cnfpara obtener:

[mysqld]
# skip-networking

Por supuesto, detenga e inicie MySQL Server.

Anna Logg
fuente
2

Tuve problemas similares al acceder a mi sitio web de Drupal. Lo arreglé abriendo la línea de comando y reiniciando mi servidor o servicio MySQL:

service mysqld restart

Esto debería funcionar. Si no es así, reinicie su servidor web local:

service httpd restart

Eso debería bastar. Espero que también funcione para otros entornos. Tenga en cuenta que estos comandos generalmente requieren privilegios de superusuario.

RAWGIT
fuente
1

Si está utilizando Laravel Homestead, aquí está la configuración

(incluye Vagrant-Virtual Machine)

.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
fuente
1

Si alguien todavía está buscando la respuesta, simplemente verifique su archivo .env. Por alguna razón, laravel crea un archivo .env.example, por lo que todas estas respuestas no funcionaron para mí. Solucioné mi problema al cambiar el nombre de .env. a .env

Alberto Alegria
fuente
No hay una única respuesta correcta a esta pregunta, ya que se pueden cometer una variedad de errores. Este es uno de ellos, ya que no se puede copiar el archivo .env a un servidor remoto. Por lo tanto, vale la pena verificar el archivo .env en el servidor donde está intentando ejecutar la consulta para asegurarse de que existe y contiene la información necesaria para establecer una conexión.
petercoles
1

Esto me sucedió porque MySQL no se estaba ejecutando. MySQL no se pudo iniciar porque me faltaba un /usr/local/etc/my.cnf.d/directorio.

Esto fue requerido por mi /usr/local/etc/my.cnfarchivo de configuración como un glob include ( include /usr/local/etc/my.cnf.d/*.cnf).

Al ejecutar mkdir /usr/local/etc/my.cnf.d, y luego iniciar MySQL, se solucionó el problema.

james2doyle
fuente
1

En mi caso, estaba ejecutando php artisan migrate en mi terminal mac, cuando necesitaba ssh en vagabundo y ejecutarlo desde allí. Espero que ayude a alguien el dolor de cabeza.

Puntilla
fuente
1

Tuve el mismo problema al usar el nombre del servicio Docker y MySQL dben el archivo docker_compose.yml:

Agregué lo siguiente en el .envarchivo:

DB_HOST=db

También debe asegurarse de que su host sea reconocible desde la aplicación php.

Fue porque PHP no descubrió qué host usar para conectarse.

Oscar David
fuente
0

Cuando use una VirtualMachine, asegúrese de ingresar a esa máquina y navegar a su carpeta de aplicaciones y llamar al comando php artisan migrate desde allí.

cmac
fuente
0

En mayo, simplemente había usado

vagrant up

en vez de

homestead up

para mi configuración de larva de fragua usando granja. Supongo que esto significaba que el sitio estaba siendo atendido, pero el servidor MySQL nunca se inició. Cuando utilicé el último comando para iniciar mi caja vagabunda, el error desapareció.

Ben Wilson
fuente
0

Todas estas respuestas parecen pesadas ...

Acabo de crear un .envarchivo; edité mi bootstrap/app.phparchivo y descomenté la siguiente línea ...

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

Espero que esto ayude a alguien

MrMesees
fuente
0

Para cualquiera que intente crear una nueva conexión db que no esté en laravel, sino que se haya encontrado aquí buscando respuestas para ejecutar PDO desde la Terminal. Esto te sería de ayuda. Y puede refactorizarlo para que funcione mejor para usted.

<?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 eso ayude!

Ifeanyi Amadi
fuente
0

En mi caso, tuve que eliminar la carpeta bootstrap / cache e intentarlo de nuevo.

Mi cenario fue después de una migración de servidor.

Raphael Cangucu
fuente