MySql:可以正常连接到本地数据库,可以通过TCP远程连接,但不能通过TCP本地连接

主机A正在运行一个mysql服务器。 在A上,我可以连接到数据库:

hostA: mysql -p 

我已经允许来自主机B的用户X连接。 我可以通过这个连接:

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

但是,我无法通过TCP连接到A的A:

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

它说:

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

我试过以下地址:

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

my.cnf中的绑定地址是实际的IP地址。

有什么想法吗? 任何人都可以提出进一步诊断?

你的命令:

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

意味着使用环路IP地址127.0.0.1通过TCP套接字连接到服务器。

看来你的mysql守护进程(mysqld)正在监听其中一个接口的IP地址。 您可以通过查看my.cnf文件来确认:

 bind-address = your_server_ip_addr 

并使用:

 $ sudo netstat -lnp | grep mysql 

如果您将bind-address指定为:

  1. 0.0.0.0 :监听所有接口,或者
  2. 127.0.0.1 :只在本地监听

你的命令应该工作。

要解决这个问题,你需要改变你的命令是这样的:

 mysql -h your_sever_ip_addr --protocol=tcp -p 

或者适当地改变绑定地址。

注释掉你的my.cfn文件中的bind-address重新启动deamon并尝试然后mysqld应该监听所有的接口

#bind-address=...

mysqld具有通过127.0.0.1端口3306将TCP / IP DB连接路由到套接字文件的非常恶劣的习惯。

要看到这一点,只需login到MySQL并运行此命令:

 mysql> SELECT USER(),CURRENT_USER(); 

USER()函数告诉你如何尝试进行身份validation

CURRENT_USER()函数告诉你mysqld是如何允许你进行身份validation的

如果您看到CURRENT_USER() root@localhost ,那么TCP / IP没有被使用。

@Khaled已经提到了这样做:

 mysql -h your_sever_ip_addr --protocol=tcp -p 

这是你要研究的东西

运行这个命令

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

你应该已经有了root@localhost 。 您也应该拥有[email protected]并使用与root@localhost相同的密码,如果您[email protected] ,也可以使用不同的密码。

如果您没有[email protected] ,那么以下是如何使用与root@localhost相同的密码创build[email protected]

 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; 

以下是如何使用root@localhost的不同密码创build[email protected]

 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; 

试一试 !!!