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:3306
mas 127.0.0.1:3306
você só poderá se conectar a partir do localhost.
Para alterar isso, acesse /etc/mysql/my.cnf
e 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
--port
a opção) para indicar o número da porta adequada, ou o pipe nomeado adequado ou o arquivo de soquete Unix (por exemplo,--socket
a 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=1
em 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.
- Verificar
net.core.somaxconn
.