A conexão do MySQL não está funcionando: 2002 Não existe esse arquivo ou diretório

105

Estou tentando configurar o WordPress. Tenho o Apache e o MySQL em execução e as contas e o banco de dados estão todos configurados. Tentei fazer uma conexão simples:

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

E eu sempre entendo isso:

Erro: 2002 - Arquivo ou diretório inexistente

De qual arquivo ou diretório ele está falando?

Estou em um OS X Snow Leopard, usando o Apache integrado. Instalei o MySQL usando o dmg x86_64.

ATUALIZAÇÃO: descobri que o soquete está em /tmp/mysql.sock, então no php.ini, substituí todas as ocorrências do caminho errado por ele.

mk12
fonte
2
cole a saída de /etc/init.d/mysql startse você estiver em uma distribuição de base debian. se falhou, verifique o /etc/my.cnfarquivo para o caminho correto do arquivo de socket mysql.
setembro
4
resolveu o mesmo problema no OS X com XAMPP usando "127.0.0.1" no lugar de "localhost".
Giuseppe Urso

Respostas:

96

Se você usa Linux: o caminho para o arquivo mysql.sock está errado. Isso geralmente ocorre porque você está usando (LAMPP) XAMPP e ele não está em /tmp/mysql.sock

Abra o arquivo php.ini e encontre esta linha:

mysql.default_socket

E fazer isso

mysql.default_socket = /path/to/mysql.sock
Alec Gorge
fonte
5
se você não tiver certeza, tente /var/lib/mysql/mysql.sock como o novo caminho para o soquete.
Jay
1
Hmm. Talvez eles quisessem dizer Leopardo ou Tigre. De qualquer forma, divirta-se com o WordPress!
Alec Gorge
3
Observe que você pode precisar definir mysqli.default_socket = /path/to/mysql.sock se conectar com mysqli
razzed
2
O local do soquete padrão para uma instalação de estoque do MySQL é /tmp/mysql.sock.
Jonathon Hill
4
"O nome de host localhost tem um significado especial. Ele está vinculado ao uso de soquetes de domínio Unix. Não é possível abrir uma conexão TCP / IP usando o nome de host localhost, você deve usar 127.0.0.1 em seu lugar." - php.net/manual/en/mysqli.quickstart.connections.php . Então, basicamente, algo não está funcionando com a conexão aos soquetes de domínio Unix que permitem o localhosttrabalho e o TCP / IP está funcionando, então alterá-lo para o endereço TCP / IP 127.0.0.1funcionará.
Edward
154

Eu tive um problema semelhante e fui capaz de resolvê-lo endereçando meu mysql com em 127.0.0.1vez de localhost.

Isso provavelmente significa que há algo errado na configuração dos meus hosts, mas esta solução rápida é o que me leva a começar agora.

bryan kennedy
fonte
2
você acabou de me economizar um tempo precioso.
uchamp
2
Verifiquei meu arquivo de hosts e encontrei uma linha com code127.0.0.1 localhost code. O que me deixa curioso para saber por que a conexão através do localhost não funcionou. Se alguém pudesse me esclarecer eu ficaria feliz.
ola
2
Isso ocorre porque o mysql.default_socket no php.ini está errado. Execute "php -i | grep mysql.default_socket"
Jonah
1
Isso funcionou para mim, estou no el Capitan w / mysql 5.7 instalado via homebrew. Eu estava tentando uma instalação WP e quando mudei "localhost" para "127.0.0.1", ele conseguiu se conectar.
dgig
5
"O nome de host localhost tem um significado especial. Ele está vinculado ao uso de soquetes de domínio Unix. Não é possível abrir uma conexão TCP / IP usando o nome de host localhost, você deve usar 127.0.0.1 em seu lugar." - php.net/manual/en/mysqli.quickstart.connections.php . Então, basicamente, algo não está funcionando com a conexão aos soquetes de domínio Unix que permitem o localhosttrabalho e o TCP / IP está funcionando, então alterá-lo para o endereço TCP / IP 127.0.0.1funcionará.
Edward
39

Isso é para Mac OS X com a instalação nativa do Apache HTTP e instalação personalizada do MySQL .

A resposta é baseada na excelente resposta de @alec-gorge, mas como tive que pesquisar no Google algumas alterações específicas para configurá-lo em minha configuração, principalmente no Mac OS X, pensei em adicioná-lo aqui para fins de integridade.

Habilitar suporte PHP5 para Apache HTTP

Certifique-se de que o suporte a PHP5 esteja habilitado em /etc/apache2/httpd.conf.

Edite o arquivo com sudo vi /etc/apache2/httpd.conf(digite a senha quando solicitado) e descomente (remova ;do início) a linha para carregar o módulo php5_module .

LoadModule php5_module libexec/apache2/libphp5.so

Inicie o Apache HTTP com sudo apachectl start(ou restartse já foi iniciado e precisa ser reiniciado para reler o arquivo de configuração).

Certifique-se de que /var/log/apache2/error_logcontém uma linha informando que o php5_module está ativado - você deve ver PHP/5.3.15(ou semelhante).

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

Procurando o nome do arquivo Socket

Quando o MySQL está instalado e funcionando (com ./bin/mysqld_safe), deve haver linhas de depuração impressas no console que informam onde você pode encontrar os arquivos de log. Observe o nome do host no nome do arquivo - localhostno meu caso - que pode ser diferente para a sua configuração.

O arquivo que vem depois Logging to é importante. É onde o MySQL registra seu trabalho.

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 o localhost.errarquivo (novamente, o seu pode ter um nome diferente), ou sejatail -1 /Users/jacek/apps/mysql/data/localhost.err para descobrir o nome do arquivo de socket - deve ser a última linha.

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

Note o socket: parte - esse é o arquivo de soquete que você deve usar php.ini.

Há outra maneira (alguns dizem que é uma maneira mais fácil) de determinar a localização do nome do arquivo do soquete fazendo login no MySQL e executando:

show variables like '%socket%';

Configurando PHP5 com suporte a MySQL - /etc/php.ini

Falando em php.ini ...

No /etcdiretório está o arquivo /etc/php.ini.default . Copie-o para /etc/php.ini .

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

Abra /etc/php.inie procure mysql.default_socket .

sudo vi /etc/php.ini

O padrão mysql.default_socketé /var/mysql/mysql.sock. Você deve alterá-lo para o valor que anotou anteriormente - foi /tmp/mysql.sockno meu caso.

Substitua o /etc/php.iniarquivo para refletir o nome do arquivo de soquete:

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

Verificação final

Reinicie o Apache HTTP.

sudo apachectl restart 

Verifique os logs se não houver nenhum erro relacionado ao PHP5. Sem erros significa que você terminou e PHP5 com MySQL deve funcionar bem. Parabéns!

Jacek Laskowski
fonte
Esta resposta ajuda
Vigneshwaran
Esta resposta é uma porcaria. Não tem nada a ver com a pergunta que está sendo feita e é basicamente apenas um tutorial de am (acos) amp, que - se bom - é ainda mais desperdiçado se colocado aqui e não em um lugar onde as pessoas que realmente procuram configurar um amplificador macos estão olhando. Em relação à pergunta que está sendo feita: esta resposta não explica por que o erro acontece e por que o php tenta se conectar via soquete em vez do nome do host, embora isso seja passado para mysql_connect, que é o problema real da pergunta original e não um genérico equívoco de instalação de software.
ohcibi
@ohcibi Escrevi "Pensei em adicioná-lo aqui por uma questão de integridade." e pensei que seria o suficiente (e dados os votos positivos que algumas pessoas gostaram). Gosto da sua ideia de tornar a resposta mais fácil de encontrar, mas não sei como. Você poderia compartilhar seus pensamentos e me ajudar ... de novo? Obrigado!
Jacek Laskowski
@JacekLaskowski em geral: escreva uma postagem no blog e comente um link para a resposta aceita / mais votada com a mesma intenção que você teve aqui ("adicione para uma questão de integridade"). Mas neste mesmo tópico não vejo razão para postar esse link. O OP disse que está usando macOS, mas esse problema não tem nada a ver com qualquer sistema operacional, mas com a forma de interpretação do mySQL localhost. Ninguém procurando ajuda para configurar o xamp em macos vai chegar aqui pesquisando. Por isso usei o termo 'porcaria'. Este tópico não tem nada a ver com macos, mas apenas com mysql (nem mesmo php).
ohcibi
14

Substituir 'localhost' por '127.0.0.1' no arquivo de configuração (conexão db) ajudou!

Oleg
fonte
1
mas por que deveria ser ajudado?
Enamul Hassan,
"Substituindo 'localhost' por '127.0.0.1'" ou 127.0.0.1 pelo endereço real do servidor MySQL, ou seja, u55151.mysql.someserver.eu.
user2812532
13

Reiniciar o servidor mysql pode ajudar. No meu caso, reiniciar o servidor economizou muito tempo.

service mysql restart

PS- use sudo service mysql restartpara usuário não root.

Avani Khabiya
fonte
2
É ótimo quando a solução simples realmente funciona.
abalter
10

Primeiro, verifique se o MySQL está em execução. Comando: mysqld start

Se você ainda não conseguir se conectar: ​​Qual é a aparência do seu /etc/my.cnf? (ou /etc/msyql/my.cnf)

Os outros 2 posts estão corretos no sentido de que você precisa verificar seu soquete porque 2002 é um erro de soquete.

Um ótimo tutorial sobre como configurar o LAMP é: http://library.linode.com/lamp-guides/centos-5.3/index-print

Todd Moses
fonte
O instalador não colocou um arquivo my.cnf, no entanto, há um arquivo, /usr/local/mysql/mysql-test/include/default_my.cnfdevo copiá-lo como my.cnf /etc?
mk12
sim, mas você pode achar que precisa modificá-lo posteriormente.
Todd Moses
7

Não que isso ajude muito, mas nas versões recentes (e ainda menos recentes ) do MySQL, o código de erro 2002 significa “Não é possível conectar ao servidor MySQL local através do soquete [nome-do-soquete]”, de modo que isso pode lhe dizer um pouco mais.

Arthur Reutenauer
fonte
1
No OSX 10.9.x com MySQL 5.5.38 instalado a partir da origem, recebia este erro. Esta dica estava correta: era um problema de socket, embora mysqli_connect_errno () e mysqli_connect_error ()) estivessem dizendo a mensagem de arquivo de 2002 não encontrado. Consegui resolver isso editando meu /etc/php.ini e definindo mysql.default_socket E mysqli.default_socket para corrigir o valor de soquete (já que meu aplicativo estava usando mysqli para conexões)
Ronnie
7

Expandindo a resposta de Matthias D aqui , consegui resolver este erro de 2002 no MySQL e no MariaDB com caminhos exatos usando estes comandos:

Primeiro obtenha o caminho real para o soquete MySQL:

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

Em seguida, obtenha o caminho do PHP :

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

Usando a saída desses dois comandos , vincule-os:

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

Se isso retornar No such file or directory você só precisa criar o caminho para PHP mysql.sock, por exemplo, se seu caminho fosse, /var/mysql/mysql.sockvocê executaria:

sudo mkdir -p /var/mysql

Em seguida, tente o comando sudo ln novamente.

mattbell87
fonte
6

Eu verificaria seu arquivo php.ini e verificaria se mysql.default_socket está configurado corretamente e também verificaria se seu mysqld está configurado corretamente com um arquivo socket que ele pode acessar. O padrão típico é "/tmp/mysql.sock".

Myles
fonte
Ok, diz /var/mysql/mysql.sock, mas esse caminho não existe.
mk12
6

Eu também encontrei esse problema, então modifiquei 'localhost' para '127.0.0.1', ele funciona.

JackSun
fonte
6

no meu caso tenho problema com mysqli_connect.
quando eu quiser conectar
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error () retornar-me este erro "Não existe tal arquivo ou diretório"

isso funcionou para mim mysqli_connect('localhost:3306', 'myuser','mypassword')

masoud2011
fonte
Isto funcionou bem para mim; foi a mudança que eu precisava para carregar o pacote de estatísticas de futebol americano do Armchair Analysis em uma instalação local do Mysql do OS X. Obrigado!
Michael Scott Cuthbert
fico feliz em saber disso :)
masoud2011
4

O erro 2002 significa que o MySQL não pode se conectar ao servidor de banco de dados local por meio do arquivo de soquete (por exemplo /tmp/mysql.sock).

Para descobrir onde está seu arquivo de soquete, execute:

mysql_config --socket

em seguida, verifique se seu aplicativo usa o arquivo de soquete Unix correto ou conecte-se através da porta TCP / IP.

Em seguida, verifique se o seu PHP tem a configuração de soquete MySQL correta:

php -i | grep mysql.default_socket

e certifique-se de que o arquivo existe .

Teste o soquete:

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

Se o soquete Unix estiver errado ou não existir, você pode fazer um link simbólico, por exemplo:

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

ou corrija seu arquivo de configuração (por exemplo php.ini).

Para testar a conexão PDO diretamente do PHP, você pode executar:

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

Verifique também a configuração entre Apache e CLI (interface de linha de comando), pois a configuração pode ser diferente.

Pode ser que o servidor esteja rodando, mas você está tentando se conectar usando uma porta TCP / IP, named pipe ou arquivo de socket Unix diferente daquele em que o servidor está escutando. Para corrigir isso, você precisa invocar um programa cliente (por exemplo, especificando --portopção) para indicar o número da porta apropriado, ou o pipe nomeado apropriado ou arquivo de socket Unix (por exemplo, --socketopção).

Consulte: Solucionando problemas de conexão com o MySQL


Outros utilitários / comandos que podem ajudar a rastrear o problema:

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • Use o XDebug com xdebug.show_exception_trace=1em seuxdebug.ini
  • No OS X sudo dtruss -fn mysqld, tente , no Linux depure comstrace
  • Verifique as permissões no soquete Unix: stat $(mysql_config --socket)e se você tem espaço livre suficiente ( df -h).
  • Reinicie seu MySQL.
  • Verifique net.core.somaxconn.
Kenorb
fonte
3

Certifique-se de que seu servidor local (MAMP, XAMPP, WAMP, etc.) esteja em execução.

Husain Al Faraj
fonte
Além disso, se você estiver usando o MAMP no MacOS (obviamente!), Você também receberá esse erro se acessar o seu site imediatamente após tirar o Mac do modo de espera. A solução, claro, é simplesmente esperar e tentar novamente. :-)
texelate
0

Eu tive um problema parecido.
Basicamente, aqui o problema é que provavelmente existem duas instâncias do mysql em execução.
A) Um rodando em /etc/init.d
B) Lamp sendo instalado em / opt / lamp
Solução:
Passo 1: - Encontre todas as instâncias do mysql em execução usando commnad "find / | grep mysqld"
Passo 2: - Desligue os serviços rodando em /etc/init.d usando serviço mysql stop
Passo 3: - Reinicie seus serviços Lamp usando / opt / lamp / lamp restart

Você deve estar pronto para ir :)

Jignesh Rawal
fonte
0

Em um Mac, antes de fazer todo o trabalho duro, basta verificar suas configurações System Preferences > MySQL. Mais frequentemente do que nunca, experimentei a equipe enfrentando esse problema desde então The MySQL Server Instance is stopped.

Clique no Start MySQL Serverbotão e a mágica acontecerá.

Steven Ventimiglia
fonte
0

Estou usando PHP-FPM ou várias versões de php em meu servidor. No meu caso, eu atualizo o valor mysqli, pois não há parâmetro de soquete padrão mysql:

mysqli.default_socket

para :

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

obrigado a @Alec Gorge

Navotera
fonte
0

Eu tive o mesmo problema. Meu soquete foi eventualmente encontrado em /tmp/mysql.sock. Em seguida, adicionei esse caminho ao php.ini. Eu encontrei o soquete lá verificando a página "Status do servidor" no MySQL Workbench. Se o seu soquete não está em /tmp/mysql.sock, então talvez o MySQL Workbench possa dizer onde ele está? (Concedido que você use o MySQL Workbench ...)

Fom
fonte
0

Digital Ocean MySql 2002-no-such-file-or-directory

Adicionar este final de arquivo /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

Reinicie o MySql

service mysql restart

ajmirani
fonte
-1

Eu também tive o mesmo problema em um servidor Linux. O que me ajudou foi o comando ' sudo reboot ', que é usado para reiniciar o servidor Linux.

SumitK
fonte
-2

habilitar e iniciar o serviço mariadb

sudo systemctl enable mariadb.service

sudo systemctl start mariadb.service

Anil K Shrestha
fonte