主机 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
为:
0.0.0.0
:监听所有接口,或者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;
试一试 !!!