Advertencia: mysql_connect (): [2002] No existe tal archivo o directorio (tratando de conectarse a través de unix: ///tmp/mysql.sock) en


246

Estoy tratando de conectarme a mi base de datos MySQL con la Terminal en mi Apple (con PHP).

Ayer funcionó bien, y ahora de repente recibo el error en el título.

El script funciona cuando uso mi navegador para ejecutarlo (tengo XAMPP instalado), pero Terminal se niega a conectarse a la base de datos.

Aquí está el archivo que incluyo para conectar (el script funciona cuando no lo incluyo, pero luego no se conecta a la base de datos):

<?php
    mysql_connect("localhost", "root", "") or die(mysql_error());
    mysql_select_db("FNB1C_data") or die(mysql_error());
?>

Eso debería funcionar, ya que funciona con mi navegador.

El comando que uso en la Terminal es php scriptname.php.

Respuestas:


415

Por alguna razón, mysql en OS X obtiene las ubicaciones del archivo de socket requerido un poco mal, pero afortunadamente la solución es tan simple como configurar un enlace simbólico.

Es posible que tenga un socket (que aparece como un archivo de longitud cero) como /tmp/mysql.socko /var/mysql/mysql.sock, pero una o más aplicaciones lo están buscando en la otra ubicación. Descúbrelo con este comando:

ls -l /tmp/mysql.sock /var/mysql/mysql.sock

En lugar de mover el zócalo, edite los archivos de configuración y recuerde mantener los archivos editados locales y alejados de los servidores donde las rutas son correctas, simplemente cree un enlace simbólico para que su Mac encuentre el zócalo requerido, incluso cuando está buscando en el lugar equivocado !

Si tienes /tmp/mysql.sockpero no /var/mysql/mysql.sockentonces ...

cd /var 
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /tmp/mysql.sock mysql.sock

Si tienes /var/mysql/mysql.sockpero no /tmp/mysql.sockentonces ...

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

Necesitará permisos para crear el directorio y el enlace, así que solo prefije los comandos anteriores con sudo si es necesario.


Buena respuesta. Fix funcionó para mí. ¿Sabes por qué podría funcionar una vez y luego no volver a funcionar? Tuve el mismo problema
Nicole

16
Esto es bastante hacky. Prefiero recomendar la respuesta de @luismreis para evitar ese acceso directo oculto de MySQL.
MattiSG

2
No funcionó para mí ... No tengo ninguno de esos archivos. ¡Pero la respuesta de los luismreis funcionó!
Gregoire

44
Esto no es "hacky". Es la forma correcta de hacer que el localhostsocket funcione, y puede ser importante si no desea la sobrecarga adicional de enviar paquetes al enrutador antes de acceder a la base de datos.
Kebman

1
La ruta en mi Ubuntu 10.04 no era correcta. Tenía que hacer esto: cd /tmpy luego: sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock.
franzlorenzon

371

También tuve este error, pero solo pude solucionarlo a través de la sugerencia aquí .

Para resumir, use:

127.0.0.1

En vez de:

localhost

La razón es que "localhost" es un nombre especial para el controlador MySQL que lo hace usar el socket UNIX para conectarse a MySQL en lugar del socket TCP.


1
Si esto funciona, verifique su hostsarchivo, podría faltar o estar en mal estado
Fabrizio

3
También tal vez bueno mencionar: Al utilizar MAMP como yo que tiene que desmarcar la casilla "Permitir sólo acceso local"
soupdiver

Esta solución genera una sobrecarga adicional ya que el paquete lo envía primero el enrutador. Por lo general, no es un gran problema durante las pruebas, pero puede convertirse en un problema con grandes paquetes de datos.
Kebman

3
@Fabrizio No, no está relacionado. Cuando usa localhost como nombre, mysql usará un socket Unix que se maneja a través de una entrada de archivo (mysql.sock, por ejemplo), no una Inet, sin importar si localhost se declara en / etc / hosts o no. Sin embargo, cuando utiliza una dirección IP, incluso 127.0.0.1, obliga a mysql a abrir un socket Inet.
Fran Marzoa

1
¿Entonces esto implica que todas las concesiones que proporcionó en la base de datos MySQL al 'usuario'% 'localhost' se romperán?
Octopus

24

Estaba teniendo el mismo problema y así es como lo solucioné:

Tuve esto y no funcionó:

$con = mysql_connect('localhost', 'root', '1234');

Hice esto y funcionó:

$con = mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', '1234');

En lugar de usar el servidor mysql, me conecté directamente al Unix Socket. Trabajó para mi.


Esta es la única solución que también funcionó para mí. No tengo un /var/mysql/mysql.sock. Y no tengo un /tmp/mysql.sock.
JeffB6688

¿Intentaste 127.0.0.1 en lugar de localhost?
Mantisse

21

El socket MySQL se encuentra, en general, en /tmp/mysql.socko /var/mysql/mysql.sock, pero probablemente PHP se encuentre en el lugar equivocado.

  1. Compruebe dónde está su zócalo con:

     sudo /usr/libexec/locate.updatedb
  2. Cuando finaliza el updatedb:

     locate mysql.sock
  3. Luego localice su php.ini:

     php -i | grep php.ini

    esto generará algo como:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. Edite su php.ini

     sudo vim /opt/local/etc/php54/php.ini
  5. Cambia las lineas:

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

    donde /tmp/mysql.sock es la ruta a su socket.

  6. Guarde sus modificaciones y salga de ESC + SHIFT: x

  7. Reiniciar Apache

     sudo apachectl stop
     sudo apachectl start

No tengo un php.ini; Solo tengo un php.ini.default, por lo que parece que la solución aquí es necesaria: apple.stackexchange.com/questions/65802/… Sin embargo, no funcionó para mí.
usuario124384

@ user124384 Su instalación es probablemente roto: cambiar el nombre php.ini.defaulta php.ini.
sustantivo

Apache puede reiniciarse con una sola línea:sudo apachectl restart
fbiazi

11

Estoy en XAMPP en Mac OS X, y la solución anterior de Brian Lowe funcionó con una ligera modificación .

El archivo mysql.sock está realmente en la carpeta "/ Applications / xampp / xamppfiles / var / mysql /". Así que tuve que vincularlo tanto en / tmp como / var / mysql. No he comprobado cuál usa la línea de comandos de PHP, pero esto solucionó el problema, así que estoy feliz :-)

sudo su
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock
mkdir /var/mysql
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /var/mysql/mysql.sock

1
ty - ¡Busqué unos días una solución y esta es la que finalmente hizo las cosas bien! =) XAMPP en OS X también
ljubiccica

10

Mac OS X EL Capitan + MAMP Pro Haga esto

cd /var
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

Entonces haz esto

cd /tmp
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

Espero que esto te ahorre algo de tiempo.


Está vinculando el mysql.docken el /tmpque lo resolvió. ¡Gracias!
Mohammed J. Razem

6

La razón es que php no puede encontrar la ruta correcta de mysql.sock.

Asegúrese de que su mysql se esté ejecutando primero.

Luego, confirme que ruta se mysql.sockencuentra, por ejemplo/tmp/mysql.sock

luego agregue esta cadena de ruta a php.ini:

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

Finalmente, reinicie Apache.


6

Cuando enfrenta el siguiente problema:

Error de lanzamiento de PHP "Advertencia: mysql_connect () http: //function.mysql-connect : 2002 No existe tal archivo o directorio (tratando de conectarse a través de unix: ///tmp/mysql.sock)"

Conjunto de valores "mysql.default_socket" en su /etc/php.inia

 "mysql.default_socket = /var/mysql/mysql.sock". 

Luego reinicie el servicio web en el administrador del servidor


Esta fue la mejor respuesta para mí: en mi caso estoy usando MAMP, agregué a mi php.ini: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
Adamski


1

Otra solución es arreglar la ubicación del socket en el archivo de configuración php.ini de esta manera:

pdo_mysql.default_socket=/tmp/mysql.sock

Por supuesto, el enlace simbólico también funciona, por lo que es una cuestión de preferencia cuál cambiar.


1

Cuando instala php53-mysql usando el puerto, devuelve el siguiente mensaje, que es la solución a este problema:

To use mysqlnd with a local MySQL server, edit /opt/local/etc/php53/php.ini
and set mysql.default_socket, mysqli.default_socket and
pdo_mysql.default_socket to the path to your MySQL server's socket file.

For mysql5, use /opt/local/var/run/mysql5/mysqld.sock
For mysql51, use /opt/local/var/run/mysql51/mysqld.sock
For mysql55, use /opt/local/var/run/mysql55/mysqld.sock
For mariadb, use /opt/local/var/run/mariadb/mysqld.sock
For percona, use /opt/local/var/run/percona/mysqld.sock

Estoy usando Mountain Lion y he instalado MySQL usando macports.
Sheric

1

Yo estaba teniendo el mismo problema

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

[ErrorException] Advertencia: PDO :: __ construct (): [2002] No existe tal archivo o directorio (intentando conectarse a través de unix: ///var/mysql/mysql.sock) en ... htdocs / Symfony / vendor / doctrine-dbal / lib / Doctrine / DBAL / Driver / PDOConnection.php

Entonces, la solución es hacer un enlace simbólico al archivo de calcetines resolviendo así el problema. Haga lo siguiente para resolverlo:

$ sudo mkdir / private / var / mysql /

$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /private/var/mysql/mysql.sock

fuente: http://www.reecefowell.com/2012/07/21/symfony2-cli-does-not-connect-to-mysql-while-browser-works-fine/


Publique su respuesta aquí, en lugar de un enlace a un sitio web externo.
ElmerCat

0

Tengo los mismos errores. Mysql se estaba ejecutando como una aplicación independiente antes de comenzar phpMyAdmin.

Acabo de detener mysql Luego sudo / Aplicaciones / XAMPP / xamppfiles / xampp stop sudo / Aplicaciones / XAMPP / xamppfiles / xampp start

Funciono bien


0

Acabo de tener este problema, pero solo apareció al cargar ciertas páginas (otras páginas funcionaron bien). Resultó que estaba haciendo llamadas a MySQL después de cerrar la conexión con mysql_close(). Entonces, como dijo @brucenan: asegúrese de que MySQL se esté ejecutando cuando lo llame .


0

Puede hacerlo simplemente alias el MAMP php en el terminal de Apple:

alias phpmamp='/Applications/MAMP/bin/php/php7.0.0/bin/php'

Ejemplo: > phpmamp - v

Ahora puedes ejecutar algo como: > phpmamp scriptname.php

Nota: Esto se aplicará solo para la sesión de terminal actual.


0

Como puede usar MAMP, cambie su puerto al 3306 predeterminado o use 127.0.0.1 en la base de datos.php

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',// leave it for port 3306
    'username' => 'yourUserhere',
    'password' => 'yourPassword',
    'database' => 'yourDatabase',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

O con la configuración predeterminada:

$db['default'] = array(
        'dsn'   => '',
        'hostname' => '127.0.0.1:8889',// leave it for port 8889
        'username' => 'yourUserhere',
        'password' => 'yourPassword',
        'database' => 'yourDatabase',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
    );

0

El cliente mySQL intenta conectarse de manera predeterminada a través de un archivo local llamado socket en lugar de conectarse a la dirección de bucle invertido (127.0.0.1) para localhost.

La ubicación predeterminada de este archivo de socket, al menos en OSX, es /tmp/mysql.sock .

SOLUCIÓN RÁPIDA Y MENOS ELEGANTE

Cree un enlace simbólico para engañar al sistema operativo para que encuentre el socket correcto.

ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp

SOLUCIÓN APROPIADA

Cambie la ruta del socket definida en el startMysql.sharchivo en /Applications/MAMP/bin.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.