Aviso: mysql_connect (): [2002] Não existe esse arquivo ou diretório (tentando conectar-se via unix: ///tmp/mysql.sock) no

246

Estou tentando conectar ao meu banco de dados MySQL com o terminal na minha Apple (com PHP).

Ontem funcionou bem, e agora de repente recebo o erro no título.

O script funciona quando eu uso o meu navegador para executá-lo (eu tenho o XAMPP instalado), mas o Terminal se recusa a se conectar ao banco de dados.

Aqui está o arquivo que eu incluo para conectar (o script funciona quando não o incluo, mas ele não se conecta ao banco de dados):

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

Isso deve funcionar, pois funciona com o meu navegador.

O comando que eu uso no Terminal é php scriptname.php.

28
fonte

Respostas:

415

Por alguma razão, o mysql no OS X engana um pouco as localizações do arquivo de soquete necessário, mas felizmente a solução é tão simples quanto configurar um link simbólico.

Você pode ter um soquete (aparecendo como um arquivo de tamanho zero) como /tmp/mysql.sockou /var/mysql/mysql.sock, mas um ou mais aplicativos o procuram no outro local. Descubra com este comando:

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

Em vez de mover o soquete, edite os arquivos de configuração e lembre-se de manter os arquivos editados localmente e longe dos servidores onde os caminhos estão corretos, basta criar um link simbólico para que o seu Mac encontre o soquete necessário, mesmo quando estiver no lugar errado !

Se você tem, /tmp/mysql.sockmas não, /var/mysql/mysql.sockentão ...

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

Se você tem, /var/mysql/mysql.sockmas não, /tmp/mysql.sockentão ...

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

Você precisará de permissões para criar o diretório e o link, portanto, prefixe os comandos acima com sudo, se necessário.

Brian Lowe
fonte
Boa resposta. Fix funcionou para mim. Você sabe por que ele pode funcionar uma vez e depois não funcionar novamente? Eu tive o mesmo problema.
28711 Nicole
16
Isso é bastante hacky. Eu recomendo a resposta do @luismreis para solucionar esse atalho oculto do MySQL.
MattiSG
2
Não funcionou para mim ... Eu não tenho nenhum desses arquivos. Mas a resposta dos luismreis funcionou!
Gregoire
4
Isto não é "hacky". É a maneira correta de fazer com que o localhostsoquete funcione e pode ser importante se você não desejar que a sobrecarga extra envie pacotes para o roteador antes que o banco de dados seja acessado.
Kebman
1
O caminho no meu Ubuntu 10.04 não estava correto. Eu tinha que fazer isso: cd /tmpe, em seguida: sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock.
franzlorenzon
370

Eu também tive esse erro, mas só consegui corrigi-lo através da sugestão aqui .

Para resumir, use:

127.0.0.1

Ao invés de:

localhost

O motivo é que "localhost" é um nome especial para o driver MySQL, que usa o soquete UNIX para conectar-se ao MySQL em vez do soquete TCP.

luismreis
fonte
1
Se isso funcionar, em seguida, verificar o seu hostsarquivo, ele pode estar em falta ou confuso
Fabrizio
3
Também talvez bom mencionar: Ao usar MAMP como eu, você tem que desmarque a caixa "Permitir acesso local apenas"
soupdiver
Essa solução gera uma sobrecarga extra quando o pacote é enviado pelo roteador primeiro. Geralmente não é um grande problema durante o teste, mas pode se tornar um problema com grandes pacotes de dados.
Kebman
3
@Fabrizio Não, não está relacionado. Quando você usa localhost como nome, o mysql usa um soquete Unix que é tratado através de uma entrada de arquivo (mysql.sock, por exemplo), não uma entrada Inet, não importa se o host local é declarado em / etc / hosts ou não. Entretanto, quando você usa um endereço IP, mesmo 127.0.0.1, força o mysql a abrir um soquete Inet.
precisa
1
Isso implica que todas as concessões que você forneceu no banco de dados MySQL para 'user'% 'localhost' serão quebradas?
Octopus
24

Eu estava tendo o mesmo problema e foi assim que o corrigi:

Eu tinha isso e não funcionou:

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

Eu fiz isso e funcionou:

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

Em vez de usar o servidor mysql, eu me conectei diretamente ao soquete Unix. Trabalhou para mim.

Caio
fonte
Esta é a única solução que funcionou para mim também. Eu não tenho um /var/mysql/mysql.sock. E eu não tenho um /tmp/mysql.sock.
JeffB6688
você tentou 127.0.0.1 em vez de localhost?
Mantisse
21

O soquete do MySQL está localizado, em geral, em /tmp/mysql.sockou /var/mysql/mysql.sock, mas provavelmente o PHP parece no lugar errado.

  1. Verifique onde está o seu soquete com:

     sudo /usr/libexec/locate.updatedb
  2. Quando o updatedb é encerrado:

     locate mysql.sock
  3. Em seguida, localize seu php.ini:

     php -i | grep php.ini

    isso produzirá algo como:

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

     sudo vim /opt/local/etc/php54/php.ini
  5. Mude as linhas:

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

    onde /tmp/mysql.sock é o caminho para o seu soquete.

  6. Salve suas modificações e saia de ESC + SHIFT: x

  7. Reinicie o Apache

     sudo apachectl stop
     sudo apachectl start
substantivo
fonte
Eu não tenho um php.ini; Eu tenho apenas um php.ini.default, portanto, parece que a solução alternativa aqui é necessária: apple.stackexchange.com/questions/65802/… No entanto, não funcionou para mim.
user124384
@ user124384 Sua instalação provavelmente está com problemas: renomeie seu php.ini.defaultpara php.ini.
substantivo
Apache pode ser reiniciado com uma única linha:sudo apachectl restart
fbiazi
11

Estou no XAMPP no Mac OS X e a solução de Brian Lowe acima funcionou com uma pequena modificação .

O arquivo mysql.sock está na pasta "/ Applications / xampp / xamppfiles / var / mysql /". Então tive que vinculá-lo em / tmp e / var / mysql. Eu não verifiquei qual é usado pela linha de comando do PHP, mas isso foi corrigido, então estou 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
Nirav Mehta
fonte
1
ty - procurei alguns dias por uma solução e foi esse que finalmente fez as coisas darem certo! =) XAMPP no OS X também
ljubiccica
10

Mac OS X EL Capitan + MAMP Pro Faça isso

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

Então faça isso

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

Espero que isso economize algum tempo.

Jsonras
fonte
Está ligando mysql.docko /tmpque o resolveu. Obrigado!
Mohammed J. Razem 10/10
6

A razão é que o php não consegue encontrar o caminho correto de mysql.sock.

Por favor, verifique se o seu mysql está rodando primeiro.

Em seguida, confirme se o caminho está mysql.socklocalizado, por exemplo/tmp/mysql.sock

adicione esta string de caminho ao php.ini:

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

Finalmente, reinicie o Apache.

brucenan
fonte
6

Quando você enfrenta o seguinte problema:

Erro de lançamento do PHP "Aviso: mysql_connect () http: //function.mysql-connect : 2002 Não existe esse arquivo ou diretório (tentando se conectar via unix: ///tmp/mysql.sock)"

Definir valor "mysql.default_socket" em seu /etc/php.inipara

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

Em seguida, reinicie o serviço web no servidor admin

cristian
fonte
Esta foi a melhor resposta para mim - no meu caso, estou usando o MAMP, adicionei ao meu php.ini: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
Adamski
1

Outra solução é corrigir o local do soquete no arquivo de configuração php.ini, como este:

pdo_mysql.default_socket=/tmp/mysql.sock

Obviamente, o link simbólico também funciona, portanto, é uma questão de preferência qual você altera.

Michael Böckling
fonte
1

Quando você instala o php53-mysql usando port, ele retorna a seguinte mensagem, que é a solução para 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
Sheric
fonte
Estou usando o Mountain Lion e instalei o MySQL usando macports.
Sheric
1

Eu estava tendo o mesmo problema

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

[ErrorException] Aviso: PDO :: __ construct (): [2002] Não existe esse arquivo ou diretório (tentando conectar-se via unix: ///var/mysql/mysql.sock) em… htdocs / Symfony / vendor / doctrine-dbal / lib / Doctrine / DBAL / Driver / PDOConnection.php

Portanto, a solução é fazer um link simbólico para o arquivo de meias, resolvendo o problema. Faça o seguinte para resolvê-lo:

$ sudo mkdir / privado / var / mysql /

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

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

tanveer ahmad dar
fonte
Poste sua resposta aqui, em vez de um link para um site externo.
ElmerCat 29/09/2015
0

Eu tenho os mesmos erros. O MySQL estava sendo executado como um aplicativo independente antes de iniciar o phpMyAdmin.

Acabei de parar o mysql Então, sudo / Applications / XAMPP / xamppfiles / xampp stop sudo / Aplicativos / XAMPP / xamppfiles / xampp start

Funcionou bem

minhas23
fonte
0

Acabei de ter esse problema, mas ele só apareceu ao carregar determinadas páginas (outras páginas funcionaram bem). Aconteceu que eu estava fazendo chamadas para o MySQL depois de encerrar a conexão mysql_close(). Então, como o @brucenan disse: verifique se o MySQL está em execução quando você o chama .

RoberRM
fonte
0

Você pode fazer isso simplesmente usando o apelido de MAMP php no terminal da Apple:

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

Exemplo: > phpmamp - v

Agora você pode executar algo como: > phpmamp scriptname.php

Nota: Isso será aplicado apenas para a sessão atual do terminal.

Naresh Chennuri
fonte
0

Como você pode usar o MAMP, altere sua porta para o 3306 padrão ou use 127.0.0.1 no database.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
);

Ou com as configurações padrão:

$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
    );
Cyber
fonte
0

O cliente mySQL, por padrão, tenta se conectar através de um arquivo local chamado soquete, em vez de se conectar ao endereço de loopback (127.0.0.1) para o host local.

O local padrão deste arquivo de soquete, pelo menos no OSX, é /tmp/mysql.sock.

SOLUÇÃO RÁPIDA, MENOS ELEGANTE

Crie um link simbólico para enganar o sistema operacional e encontrar o soquete correto.

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

SOLUÇÃO ADEQUADA

Altere o caminho do soquete definido no startMysql.sharquivo em /Applications/MAMP/bin.

um tubarão
fonte