错误2003(HY000):无法连接到MySQL服务器(111)

37
这个问题涉及以下问题: 我正在配置一台新的MySQL(5.1)服务器,需要提供对数据库的远程访问。我完成了以下步骤:
  1. Comment bind-address in my.cnf:

    # bind-address      = 192.168.1.3
    
  2. Grant privileges:

    GRANT ALL PRIVILEGES ON *.* TO 'nickruiz'@'%' IDENTIFIED BY PASSWORD 'xxxx';
    
  3. Set port forwarding on router (TCP and UDP, port 3306, 192.168.1.3)
  4. Configure iptables for firewall

    sudo iptables -I INPUT -p udp --dport 3306 -j ACCEPT
    
    sudo iptables -I INPUT -p tcp --dport 3306 --syn -j ACCEPT
    
    sudo iptables-save
    
  5. Restart mysql server sudo /etc/init.d/mysql restart

当我进行测试时,我得到了以下结果:
局域网:
mysql -h 192.168.1.3 -u nickruiz -p
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 95
Server version: 5.1.63-0ubuntu0.11.04.1 (Ubuntu)

远程:

mysql -h 1xx.xx.4.136 -u nickruiz -p
ERROR 2003 (HY000): Can't connect to MySQL server on '1xx.xx.4.136' (111)

显然有些问题阻止我使用我的全局IP地址。

注:

  • 我尝试在同一台机器上测试远程连接,还通过远程机器的SSH进行测试。
  • 我不确定我的ISP是否给了我一个静态IP。

有什么想法吗?

更新: telnet似乎无法工作。

telnet 192.168.1.3 3306
Trying 192.168.1.3...
Connected to 192.168.1.3.
Escape character is '^]'.
E
5.1.63-0ubuntu0.11.04.1,0g8!:@pX;]DyY0#\)SIConnection closed by foreign host.

1
你的my.cnf中没有skip-networking,对吗? - Michael Berkowski
并且 telnet 192.168.1.3 3306。如果它打开任何类型的提示符,则表示端口正在监听并接受连接。 - Michael Berkowski
在my.cnf文件中不要跳过网络连接。 - Nick Ruiz
1
实际上,这是Telnet正常工作。如果你看到了"connected and Escape character is ^]",那么你已经成功建立了连接。虽然你看不到MySQL提示符,但你已经与MySQL端口建立了原始连接,所以它在正确地监听该地址! - Michael Berkowski
我发现“bind-address”参数在“/etc/mysql/mysql.conf.d/mysqld.cnf”文件中。在那里将其注释掉,然后它就可以工作了! - Yahya
显示剩余3条评论
11个回答

16
请使用以下命令检查您的监听端口:
netstat -nat |grep :3306

如果它显示出来

 tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN 

这对于您的远程连接来说是可以的。

但在这种情况下,我认为您有

tcp        0     192.168.1.3:3306            0.0.0.0:*               LISTEN 

这对于你的远程连接来说没问题。 你也应该检查你的防火墙(如果你是CentOS/RedHat系统,应该检查iptables)。

services iptables stop

用于测试或使用:

iptables -A input -p tcp -i eth0 --dport 3306 -m state NEW,ESTABLISHED -j ACCEPT
iptables -A output -p tcp -i eth0 --sport 3306 -m state NEW,ESTABLISHED -j ACCEPT

还有一件事情需要检查,即您是否授予了远程连接的权限:

GRANT ALL ON *.* TO remoteUser@'remoteIpadress' IDENTIFIED BY 'my_password';

3
如果在执行 netstat 命令时没有看到 '0.0.0.0:3306',请参考此处提供的答案:https://dev59.com/3HI-5IYBdhLWcg3wy7sd#16164426 - FBB
192.168.1.3私人网络IPv4地址空间16位块的一部分,因此如果没有VPN,它就不是很远。 - Cees Timmerman

6

errno 111是ECONNREFUSED,我猜测路由器的DNAT出了问题。

也有可能是你的ISP在过滤该端口。


5
请检查您的远程主机(即您尝试连接的Web托管服务器)是否允许在端口3306上进行出站流量。在这种情况下,我看到了(100)错误。我可以从我的PC / Mac连接,但无法从我的网站连接。 MySQL实例可以通过互联网访问,但是我的托管公司不允许我的网站连接到端口3306上的数据库。一旦我向托管公司请求打开端口3306的出站流量限制,我的网站就可以连接到远程数据库。

这对我来说是个问题,客户端机器的出站端口被关闭了。 - Moad Ennagi

3
/etc/mysql$ sudo nano my.cnf

对我有用的相关部分:

#skip-networking
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = MY_IP

可以使用 ifconfig 或者 curl -L whatismyip.org |grep blue 命令来查找 MY_IP

重新启动 mysql 以确保新的配置已经加载:

/etc/mysql$ sudo service mysql restart

2

我曾经遇到过连接远程mysql数据库的问题。

我通过打开数据库服务器上的防火墙来允许流量通过解决了这个问题:

sudo ufw allow mysql

0

我像上面那样正确设置了我的绑定地址,但是忘记重新启动MySQL服务器(或重新启动电脑):) 扶额 - 所以这就是我遇到此错误的原因!


0
有时,当您的密码中有特殊字符时,您需要将其包在''字符中,以便连接到数据库,您可以使用以下命令:

mysql -uUSER -p'pa$$w0rd'

我遇到了相同的错误,这个解决方案解决了我的问题。


0
我和你有同样的问题,我使用wireshark捕获了发送的TCP数据包,我发现当我使用mysql二进制文件连接远程主机时,它连接到远程的3307端口,这是我的错误在于/etc/mysql/my.cnf配置文件,3307是另一个项目的mysql端口,但是我在my.cnf的[client]部分更改了该配置,当我使用-P选项来指定3306端口时,一切正常。

0
如果您使用的系统是CentOS/RedHat,并且使用rpm安装MySQL,那么在/etc/文件夹中就没有my.cnf文件,您可以使用以下命令: #whereis mysql #cd /usr/share/mysql/ cp -f /usr/share/mysql/my-medium.cnf /etc/my.cnf

0

我曾经遇到过同样的错误,当时我不明白原因,后来发现我的调制解调器正在使用与mysql相同的端口。于是,我通过sudo systemctl stop apache2.service停止了apache2服务,并重新启动了xampp,sudo /opt/lampp/lampp start

如果你之前没有为mysql设置密码,但出现了1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)的错误提示,那么你需要将密码设为空字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接