La conexión MySQL no funciona: 2002 No existe tal archivo o directorio

105

Estoy intentando configurar WordPress. Tengo Apache y MySQL en ejecución, y las cuentas y la base de datos están configuradas. Traté de hacer una conexión simple:

<?php
    $conn = mysql_connect('localhost', 'USER', 'PASSWORD');
    if(!$conn) {
        echo 'Error: ' . mysql_errno() . ' - ' . mysql_error();
    }
?>

Y siempre consigo esto:

Error: 2002 - No existe ese archivo o directorio

¿De qué archivo o directorio podría estar hablando?

Estoy en OS X Snow Leopard, usando el Apache integrado. Instalé MySQL usando el dmg x86_64.

ACTUALIZACIÓN: encontré que el socket está en /tmp/mysql.sock, así que en php.ini, reemplacé todas las apariciones de la ruta incorrecta con eso.

mk12
fuente
2
pegue la salida de /etc/init.d/mysql startsi está en una distribución base de Debian. si falla, verifique el /etc/my.cnfarchivo para la ruta correcta del archivo de socket mysql.
septiembre
4
Resuelto el mismo problema en OS X con XAMPP usando "127.0.0.1" en lugar de "localhost".
Giuseppe Urso

Respuestas:

96

Si usa Linux: la ruta al archivo mysql.sock es incorrecta. Esto generalmente se debe a que está usando (LAMPP) XAMPP y no está en /tmp/mysql.sock

Abra el archivo php.ini y busque esta línea:

mysql.default_socket

Y hacerlo

mysql.default_socket = /path/to/mysql.sock
Garganta de Alec
fuente
5
si no está seguro, pruebe /var/lib/mysql/mysql.sock como la nueva ruta al socket.
Jay
1
Hmm. Quizás se referían a Leopardo o Tigre. En cualquier caso, ¡diviértete con WordPress!
Alec Gorge
3
Tenga en cuenta que es posible que deba configurar mysqli.default_socket = /path/to/mysql.sock si se conecta con mysqli
razzed
2
La ubicación de socket predeterminada para una instalación estándar de MySQL es /tmp/mysql.sock.
Jonathon Hill
4
"El nombre de host localhost tiene un significado especial. Está vinculado al uso de sockets de dominio Unix. No es posible abrir una conexión TCP / IP usando el nombre de host localhost, debe usar 127.0.0.1 en su lugar". - php.net/manual/en/mysqli.quickstart.connections.php . Entonces, básicamente, algo no funciona con la conexión a los sockets de dominio Unix que permiten localhostque funcione y TCP / IP está funcionando, por lo que cambiarlo a la dirección TCP / IP 127.0.0.1funcionará.
Edward
154

Tuve un problema similar y pude resolverlo abordando mi mysql con en 127.0.0.1lugar de localhost.

Esto probablemente significa que tengo algo mal en la configuración de mis hosts, pero esta solución rápida me pone en marcha ahora mismo.

bryan kennedy
fuente
2
me acabas de ahorrar un tiempo precioso.
uchamp
2
Revisé mi archivo de hosts y encontré una línea con code127.0.0.1 localhost code. Lo que me da curiosidad por saber por qué la conexión a través de localhost no funcionó. Si alguien pudiera iluminarme, sería feliz.
ola
2
Esto se debe a que mysql.default_socket en php.ini es incorrecto. Ejecute "php -i | grep mysql.default_socket"
Jonah
1
Esto funcionó para mí, estoy en el Capitan con mysql 5.7 instalado a través de homebrew. Estaba intentando una instalación de WP y cuando cambié "localhost" a "127.0.0.1" se pudo conectar.
dgig
5
"El nombre de host localhost tiene un significado especial. Está vinculado al uso de sockets de dominio Unix. No es posible abrir una conexión TCP / IP usando el nombre de host localhost, debe usar 127.0.0.1 en su lugar". - php.net/manual/en/mysqli.quickstart.connections.php . Entonces, básicamente, algo no funciona con la conexión a los sockets de dominio Unix que permiten localhostque funcione y TCP / IP está funcionando, por lo que cambiarlo a la dirección TCP / IP 127.0.0.1funcionará.
Edward
39

Esto es para Mac OS X con la instalación nativa de Apache HTTP e instalación personalizada de MySQL .

La respuesta se basa en la excelente respuesta de @ alec-gorge, pero como tuve que buscar en Google algunos cambios específicos para configurarlo en mi configuración, en su mayoría específicos de Mac OS X, pensé en agregarlo aquí para completarlo.

Habilite el soporte de PHP5 para Apache HTTP

Asegúrese de que la compatibilidad con PHP5 esté habilitada en /etc/apache2/httpd.conf.

Edite el archivo con sudo vi /etc/apache2/httpd.conf(ingrese la contraseña cuando se le solicite) y descomente (elimine ;del principio de) la línea para cargar el módulo php5_module .

LoadModule php5_module libexec/apache2/libphp5.so

Inicie Apache HTTP con sudo apachectl start(o restartsi ya se ha iniciado y debe reiniciarse para volver a leer el archivo de configuración).

Asegúrese de que /var/log/apache2/error_logcontenga una línea que le indique que php5_module está habilitado; debería ver PHP/5.3.15(o algo similar).

[notice] Apache/2.2.22 (Unix) DAV/2 PHP/5.3.15 with Suhosin-Patch configured -- resuming normal operations

Buscando el nombre del archivo de Socket

Cuando MySQL esté en funcionamiento (con ./bin/mysqld_safe), debería haber líneas de depuración impresas en la consola que le indiquen dónde puede encontrar los archivos de registro. Tenga en cuenta el nombre de host en el nombre del archivo, localhosten mi caso, que puede ser diferente para su configuración.

El archivo que viene después Logging toes importante. Ahí es donde MySQL registra su trabajo.

130309 12:17:59 mysqld_safe Logging to '/Users/jacek/apps/mysql/data/localhost.err'.
130309 12:17:59 mysqld_safe Starting mysqld daemon with databases from /Users/jacek/apps/mysql/data

Abra el localhost.errarchivo (de nuevo, el suyo podría tener un nombre diferente), es decir, tail -1 /Users/jacek/apps/mysql/data/localhost.errpara averiguar el nombre del archivo de socket, debería ser la última línea.

$ tail -1 /Users/jacek/apps/mysql/data/localhost.err
Version: '5.5.27'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)

Tenga en cuenta la socket:parte: ese es el archivo de socket que debe usar php.ini.

Hay otra forma (algunos dicen que es más fácil) determinar la ubicación del nombre de archivo del socket iniciando sesión en MySQL y ejecutando:

show variables like '%socket%';

Configuración de PHP5 con soporte MySQL - /etc/php.ini

Hablando de php.ini ...

En el /etcdirectorio hay un archivo /etc/php.ini.default . Cópialo en /etc/php.ini .

sudo cp /etc/php.ini.default /etc/php.ini

Abra /etc/php.iniy busque mysql.default_socket .

sudo vi /etc/php.ini

El valor predeterminado mysql.default_socketes /var/mysql/mysql.sock. Debería cambiarlo por el valor que anotó anteriormente, fue /tmp/mysql.socken mi caso.

Reemplace el /etc/php.iniarchivo para reflejar el nombre del archivo de socket:

mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock

Verificación final

Reinicie Apache HTTP.

sudo apachectl restart 

Verifique los registros si no hay ningún error relacionado con PHP5. Ningún error significa que ha terminado y PHP5 con MySQL debería funcionar bien. ¡Felicidades!

Jacek Laskowski
fuente
Esta respuesta ayuda
Vigneshwaran
Esta respuesta es una mierda. No tiene nada que ver con la pregunta que se hace y básicamente es solo un tutorial de amplificador (acos) que, si es bueno, se desperdicia aún más si se coloca aquí y no en un lugar donde las personas que buscan realmente configurar una pila de amplificador macos están mirando. Con respecto a la pregunta que se hace: esta respuesta no explica una mierda sobre por qué ocurre el error y por qué php intenta conectarse a través del socket en lugar del nombre de host, aunque eso se pasa a mysql_connect, que es el problema real de la pregunta original y no genérico concepto erróneo de la instalación de software.
ohcibi
@ohcibi escribí "Pensé que lo agregaría aquí para completarlo". y pensé que sería suficiente (y dado los votos a favor, a algunas personas les gustó). Me gusta tu idea de hacer que la respuesta sea más fácil de encontrar, pero no sé cómo. ¿Podrías compartir tus pensamientos y ayudarme ... de nuevo? ¡Gracias!
Jacek Laskowski
@JacekLaskowski en general: escriba una publicación de blog y comente un enlace a la respuesta aceptada / más votada con la misma intención que tenía aquí ("agréguelo para completarlo"). Pero en este mismo hilo ni siquiera veo una razón para publicar ese enlace. El OP dijo que está usando macOS, pero este problema no tiene nada que ver con ningún sistema operativo sino con la forma de interpretar de mySQL localhost. Nadie que busque ayuda para configurar xamp en macos llegará aquí buscando en Google. Por eso utilicé el término "basura". Este hilo no tiene nada que ver con macos sino solo con mysql (ni siquiera con php).
ohcibi
14

¡Reemplazar 'localhost' por '127.0.0.1' en el archivo de configuración (conexión db) ayudó!

Oleg
fuente
1
pero ¿por qué debería ayudarse?
Enamul Hassan
"Reemplazo de 'localhost' a '127.0.0.1'" o 127.0.0.1 a la dirección real del servidor MySQL, es decir, u55151.mysql.someserver.eu.
user2812532
13

Reiniciar el servidor mysql puede ayudar. En mi caso, reiniciar el servidor ahorró mucho tiempo.

service mysql restart

PS- uso sudo service mysql restartpara usuarios no root.

Avani Khabiya
fuente
2
Es genial cuando la solución simple realmente funciona.
abalter
10

Primero, asegúrese de que MySQL se esté ejecutando. Comando: mysqld start

Si aún no puede conectarse, entonces: ¿Cómo es su /etc/my.cnf? (o /etc/msyql/my.cnf)

Las otras 2 publicaciones son correctas en el sentido de que debe verificar su socket porque 2002 es un error de socket.

Un gran tutorial sobre cómo configurar LAMP es: http://library.linode.com/lamp-guides/centos-5.3/index-print

Todd Moisés
fuente
El instalador no colocó un archivo my.cnf, sin embargo, hay un /usr/local/mysql/mysql-test/include/default_my.cnf, ¿debo copiarlo como my.cnf /etc?
mk12
sí, pero es posible que necesite modificarlo en algún momento.
Todd Moses
7

No es que te ayude mucho, pero en las versiones recientes (e incluso menos recientes ) de MySQL, el código de error 2002 significa "No se puede conectar al servidor MySQL local a través del socket [nombre-del-socket]", por lo que podría decirte un poco más.

Arthur Reutenauer
fuente
1
En OSX 10.9.x con MySQL 5.5.38 instalado desde la fuente, recibía este error. Este consejo era correcto: es un problema de socket a pesar de que mysqli_connect_errno () y mysqli_connect_error ()) estaban diciendo que el mensaje 2002 file not found. Pude resolver esto editando mi /etc/php.ini y configurando mysql.default_socket Y mysqli.default_socket para corregir el valor del socket (ya que mi aplicación estaba usando mysqli para las conexiones)
Ronnie
7

Ampliando la respuesta de Matthias D aquí , pude resolver este error de 2002 tanto en MySQL como en MariaDB con rutas exactas usando estos comandos:

Primero obtenga la ruta real al socket MySQL:

netstat -ln | grep -o -m 1 '/.*mysql.sock'

Luego obtenga la ruta de PHP :

php -r 'echo ini_get("mysql.default_socket") . "\n";'

Utilizando la salida de estos dos comandos , vincúlelos:

sudo ln -s /actualpath/mysql.sock /phppath/mysql.sock

Si eso regresa No such file or directory, solo necesita crear la ruta al PHP mysql.sock, por ejemplo, si su ruta fuera /var/mysql/mysql.sock, ejecutaría:

sudo mkdir -p /var/mysql

Luego intente nuevamente el comando sudo ln .

mattbell87
fuente
6

Verificaría su archivo php.ini y verificaría que mysql.default_socket esté configurado correctamente y también verificaría que su mysqld esté configurado correctamente con un archivo de socket al que pueda acceder. El valor predeterminado típico es "/tmp/mysql.sock".

Myles
fuente
Ok, dice /var/mysql/mysql.sock, pero ese camino no existe.
mk12
6

También encontré este problema, luego modifiqué 'localhost' a '127.0.0.1', funciona.

JackSun
fuente
6

en mi caso tengo un problema con mysqli_connect.
cuando quiero conectar
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error () devuélveme este error "No existe tal archivo o directorio"

esto funcionó para mí mysqli_connect('localhost:3306', 'myuser','mypassword')

masoud2011
fuente
Esto funcionó bien para mí; era el cambio que necesitaba para cargar el paquete de estadísticas de fútbol americano de Armchair Analysis en una instalación de Mysql local de OS X. ¡Gracias!
Michael Scott Cuthbert
Me
4

El error 2002 significa que MySQL no puede conectarse al servidor de la base de datos local a través del archivo de socket (por ejemplo /tmp/mysql.sock).

Para saber dónde está su archivo de socket, ejecute:

mysql_config --socket

luego, verifique que su aplicación use el archivo de socket Unix correcto o conéctese a través del puerto TCP / IP en su lugar.

Luego, verifique si su PHP tiene la configuración correcta de socket MySQL:

php -i | grep mysql.default_socket

y asegúrese de que ese archivo exista .

Pruebe el enchufe:

mysql --socket=/var/mysql/mysql.sock

Si el socket Unix es incorrecto o no existe, puede vincularlo simbólicamente, por ejemplo:

ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

o corrija su archivo de configuración (por ejemplo php.ini).

Para probar la conexión PDO directamente desde PHP, puede ejecutar:

php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"

Verifique también la configuración entre Apache y CLI (interfaz de línea de comandos), ya que la configuración puede ser diferente.

Puede ser que el servidor se esté ejecutando, pero usted está intentando conectarse usando un puerto TCP / IP, una canalización con nombre o un archivo de socket Unix diferente del que está escuchando el servidor. Para corregir eso, debe invocar un programa cliente (por ejemplo, especificando una --portopción) para indicar el número de puerto adecuado, o la tubería con nombre adecuado o el archivo de socket Unix (por ejemplo, la --socketopción).

Consulte: Solución de problemas de conexión a MySQL


Otras utilidades / comandos que pueden ayudar a rastrear el problema:

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • Utilice XDebug xdebug.show_exception_trace=1en suxdebug.ini
  • En OS X intente sudo dtruss -fn mysqld, en Linux depure constrace
  • Verifique los permisos en el socket Unix: stat $(mysql_config --socket)y si tiene suficiente espacio libre ( df -h).
  • Reinicie su MySQL.
  • Comprobar net.core.somaxconn.
Kenorb
fuente
3

Asegúrese de que su servidor local (MAMP, XAMPP, WAMP, etc.) esté funcionando.

Husain Al Faraj
fuente
Además de esto, si está utilizando MAMP en MacOS (¡obviamente!) También obtendrá este error si accede a su sitio inmediatamente después de despertar su Mac del modo de suspensión. La solución, por supuesto, es simplemente esperar y volver a intentarlo. :-)
texelate
0

Tuve un problema similar.
Básicamente, aquí el problema es que probablemente hay dos instancias de mysql ejecutándose.
A) Una que se ejecuta en /etc/init.d
B) La lámpara se está instalando en / opt / lamp
Solución:
Paso 1: - Encuentre todas las instancias en ejecución de mysql usando commnad "find / | grep mysqld"
Paso 2: - Cierre los servicios que se ejecutan en /etc/init.d usando service mysql stop
Paso 3: - Reinicie los servicios de Lamp usando / opt / lamp / lamp restart

Usted debe ser bueno para ir :)

Jignesh Rawal
fuente
0

En una Mac, antes de hacer todo el trabajo duro, simplemente verifique su configuración System Preferences > MySQL. La mayoría de las veces, he experimentado que el equipo se ha encontrado con este problema desde entonces The MySQL Server Instance is stopped.

Haga clic en el Start MySQL Serverbotón y sucederá la magia.

Steven Ventimiglia
fuente
0

Estoy usando PHP-FPM o múltiples versiones de php en mi servidor. En mi caso actualizo el valor de mysqli ya que no hay un parámetro de socket predeterminado de mysql:

mysqli.default_socket

a :

mysql.default_socket = /path/to/mysql.sock

gracias a @Alec Gorge

navotera
fuente
0

Yo tuve el mismo problema. Mi socket finalmente se encontró en /tmp/mysql.sock. Luego agregué esa ruta a php.ini. Encontré el socket allí al revisar la página "Estado del servidor" en MySQL Workbench. Si su socket no está en /tmp/mysql.sock, ¿tal vez MySQL Workbench podría decirle dónde está? (De acuerdo, usa MySQL Workbench ...)

Fom
fuente
0

Digital Ocean MySql 2002-no-tal-archivo-o-directorio

Agregar este final de archivo /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

Reinicie MySql

service mysql restart

ajmirani
fuente
-1

También tuve el mismo problema en un servidor Linux. Lo que me ayudó fue el comando ' sudo reboot ', que se usa para reiniciar el servidor Linux.

SumitK
fuente
-2

habilitar e iniciar el servicio mariadb

sudo systemctl habilitar mariadb.service

sudo systemctl start mariadb.service

Anil K Shrestha
fuente