MySql: pode conectar-se normalmente ao banco de dados local, pode se conectar via TCP remotamente, mas não pode se conectar via TCP localmente

1

O host A está executando um servidor mysql. Em A, posso conectar ao banco de dados:

hostA: mysql -p

Eu permiti que o usuário X do host B se conectasse. Eu consigo me conectar com isso:

hostB: mysql -h A --protocol=TCP -p -u X

No entanto, não consigo me conectar a A de A via TCP:

hostA: mysql -h 127.0.0.1 --protocol=tcp -p

Diz:

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

Eu tentei os seguintes endereços:

localhost, 127.0.0.1, <hostname>, <actual ip>

O endereço de ligação em my.cnf é o endereço IP real.

Alguma ideia? Alguém pode sugerir mais diagnósticos?

    
por muckabout 05.01.2012 / 13:06

3 respostas

2

Seu comando:

hostA: mysql -h 127.0.0.1 --protocol=tcp -p

significa conectar-se ao servidor através do soquete TCP usando o endereço IP 130.0.0.1 do loopack.

Parece que seu daemon mysql (mysqld) está escutando no endereço IP de uma das interfaces. Você pode confirmar isso olhando para o arquivo my.cnf:

bind-address  = your_server_ip_addr

e usando:

$ sudo netstat -lnp | grep mysql

Se você especificar o bind-address como:

  1. 0.0.0.0 : ouça em todas as interfaces ou
  2. 127.0.0.1 : ouça apenas localmente

seu comando deve funcionar.

Para corrigir o problema, você precisa alterar seu comando para ser como:

mysql -h your_sever_ip_addr --protocol=tcp -p

ou altere o endereço de ligação adequadamente.

    
por 05.01.2012 / 14:08
1

comente a linha com bind-address no seu arquivo my.cfn reinicie o deamon e tente então Depois disso o mysqld deve escutar em todas as interfaces

#bind-address=...

    
por 05.01.2012 / 14:07
1

O mysqld tem o péssimo hábito de rotear conexões TCP / IP DB via 127.0.0.1 porta 3306 para o arquivo socket.

Para ver isso, basta acessar o mysql e executar este comando:

mysql> SELECT USER(),CURRENT_USER();

A função USER() informa como você tentou autenticar

A função CURRENT_USER() informa como o mysqld permitiu que você autenticasse

Se você vir root@localhost para CURRENT_USER() , então o TCP / IP não está sendo usado.

@Khaled já mencionou isso:

mysql -h your_sever_ip_addr --protocol=tcp -p

Aqui está algo para você pesquisar

Execute este comando

SELECT CONCAT(user,'@',host) RootUser,password FROM mysql.user WHERE user='root';

Você já deve ter root@localhost . Você também deve ter [email protected] com a mesma senha que root@localhost ou outra diferente, se quiser.

Se você não tem [email protected] , veja como criar [email protected] com a mesma senha que root@localhost :

CREATE TABLE mysql.roothome LIKE mysql.user;
INSERT INTO mysql.roothome SELECT * FROM mysql.user
WHERE user='root' AND host='localhost';
UPDATE mysql.roothome SET host='127.0.0.1';
INSERT INTO mysql.user SELECT * FROM mysql.roothome;
DROP TABLE mysql.roothome;
FLUSH PRIVILEGES;

Veja como criar [email protected] com uma senha diferente de root@localhost :

CREATE TABLE mysql.roothome LIKE mysql.user;
INSERT INTO mysql.roothome SELECT * FROM mysql.user
WHERE user='root' AND host='localhost';
UPDATE mysql.roothome SET host='127.0.0.1',password=password('whateveryouwant');
INSERT INTO mysql.user SELECT * FROM mysql.roothome;
DROP TABLE mysql.roothome;
FLUSH PRIVILEGES;

Experimente!

    
por 05.01.2012 / 20:15