Erro fatal do PHP: exceção não detectada 'PDOException' com mensagem 'SQLSTATE[HY000] [2002] Conexão recusada

Erro fatal do PHP: exceção não detectada 'PDOException' com mensagem 'SQLSTATE[HY000] [2002] Conexão recusada

Eu tenho um servidor diferente para meu banco de dados.

Quando me conectei ao banco de dados com PDO, usei o endereço IP da VM do banco de dados como parâmetro de host:

$dbh = new pdo("mysql:host=192.168.56.103;port=3306;dbname=data",'root','root')

Mas recebo conexão recusada (PDOException' com mensagem 'SQLSTATE[HY000] [2002]'). Eu acho que não foi possível encontrar o MySQL lá. No entanto, poderia encontrar a VM com esse IP.

Responder1

Bem, então verifique se o mysql realmente não está rodando:

sudo aptitude install nmap

E então:

sudo nmap -sS <ipofdbserverhere>

Você também pode instalar a ferramenta no servidor mysql, o comando seria:

sudo nmap -sS localhost

Em ambos os casos, sua resposta deve ser assim.

[simmel]@[mars]$ sudo nmap -sS 172.16.1.41

Starting Nmap 6.40 ( http://nmap.org ) at 2015-04-08 15:09 CEST

Nmap scan report for 172.16.1.41
Host is up (0.010s latency).
Not shown: 996 closed ports
PORT     STATE SERVICE
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 33.17 seconds

Se mostrar a porta 3306, ela está realmente aberta e pronta para conexões. Se for esse o caso, use o mysql via linha de comando do seu computador.

mysql -u<USER> -p<PASSWORD> -h<ipofdbserverhere> <databasename>

A mesma mensagem aparece? Ligação recusada? Então seu usuário provavelmente tem os direitos errados.

Outra razão para isso é quando o servidor mysql está vinculado a um determinado endereço, como 127.0.0.1.

Para descobrir, verifique a saída de:

sudo netstat -tlpen

Se o mysql não estiver ouvindo , 0.0.0.0:3306mas 127.0.0.1:3306você só poderá se conectar a partir do localhost.

Para alterar isso, acesse /etc/mysql/my.cnfe comente a seguinte linha:

bind-address            = 127.0.0.1

A maneira de comentar é adicionar um #personagem principal:

#bind-address            = 127.0.0.1

Salve o arquivo e reinicie o serviço mysql

sudo service mysql restart

Agora você deve conseguir se conectar.

Para alterar a porta, digite, por exemplo:

port = 8888

em /etc/mysql/my.cnf.

Salve o arquivo e reinicie o serviço mysql:

sudo service mysql restart

Responder2

O erro 2002 significa que o MySQL não pode se conectar ao servidor de banco de dados local através 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.

Teste o soquete:

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

Se o soquete Unix estiver errado, você pode criar 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 oDOPconexão 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 em execução, mas você esteja tentando se conectar usando uma porta TCP/IP, um pipe nomeado ou um arquivo de soquete Unix diferente daquele em que o servidor está escutando. Para corrigir isso você precisa invocar um programa cliente (por exemplo, especificando --porta opção) para indicar o número da porta adequada, ou o pipe nomeado adequado ou o arquivo de soquete Unix (por exemplo, --socketa opção).

Ver:Solução de problemas de conexão com MySQL


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

  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • Use o XDebug xdebug.show_exception_trace=1em seuxdebug.ini
  • No OS X tente sudo dtruss -fn mysqld, 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.
  • Verificarnet.core.somaxconn.

informação relacionada