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

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 中的 bind-address 是实际的 IP 地址。

有什么想法吗?有人可以建议进一步的诊断吗?

答案1

您的命令:

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

表示使用 loopack 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

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

答案2

在 my.cfn 文件中注释掉 bind-address 行,然后重新启动守护进程并尝试,之后 mysqld 应该会监听所有接口

#bind-address=...

答案3

mysqld 有一个非常讨厌的习惯,就是将通过 127.0.0.1 端口 3306 的 TCP/IP DB 连接路由到套接字文件中。

要查看此功能,只需登录 mysql 并运行以下命令:

mysql> SELECT USER(),CURRENT_USER();

USER()函数会告诉您如何尝试进行身份验证

CURRENT_USER()函数告诉你 mysqld 如何允许你进行身份验证

如果看到,则root@localhost表明CURRENT_USER()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

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;

以下是如何使用[email protected]不同于的密码创建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;

试一试 !!!

相关内容