PHP - 无法连接到远程MySQL数据库

时间:2014-07-06 05:05:23

标签: php mysql mysql-error-2003

我有一个MySQL数据库,由我在Windows服务器上托管,我想从远程网络服务器查询它。当我尝试使用PHP连接到MySQL数据库时(我知道,我应该使用mysqli):

$connection = @mysql_connect("203.0.113.0:3306", "username", "password");

无论是否指定端口,经过长时间加载后,我都会遇到errorno 2003 的错误:

  

无法在'203.0.113.0'(4)

上连接到MySQL服务器

以下是我在托管MySQL服务器的服务器上的命令提示符中运行netstat -n时得到的结果:http://pastebin.com/pbRJNqCZ。它填满了屏幕所以我无法复制所有内容,但我知道其他一切都是(我看到一些值为3306的端口,这是MySQL端口):

TCP    127.0.0.1:port        127.0.0.1:port        ESTABLISHED

当我运行netstat -a | find "LISTENING"时,我得到:http://pastebin.com/Lqj2BrQK

这是我目前所知道的:

  • MySQL服务器没有启动并不是错误,因为我可以在本地连接它。
  • 网络服务器无法连接到MySQL数据库并不是错误,因为我可以连接到其他数据库
  • 这不是身份验证错误(用户名和密码正确,远程服务器有权限)
  • 这不是端口转发错误,因为端口3306在TCP& UDP。
  • 能够连接到托管服务器的计算机并不是一个错误,因为我可以ping它。
  • 服务器不仅侦听localhost接口。我的skip-networking文件中注释了bind-addressmy.cnf

我如何编辑我的连接代码,或编辑我的MySQL服务器来修复此错误?

1 个答案:

答案 0 :(得分:1)

总结our discussion/chat

在my.cnf:bind-address = 0.0.0.0中绑定网址0.0.0.0并确保skip-networking已注释掉或不存在。

检查netstat -a | find "LISTENING"

根据您的pastebin,有一个服务侦听3306.测试服务器本身的NIC地址是否可以访问该端口。这样外部防火墙就不会生效。一个简单的测试是尝试telnet连接到该端口。工具nmap可以捕获更详细的信息。 Nmap已将mysql端口显示为已过滤。这解决了本地数据包过滤器的问题,在本例中是Windows防火墙。

确保将Windows防火墙配置为允许从所有或特定计算机公共访问TCP端口3306。在公共配置文件中设置规则,或者,如果两个服务器由同一域控制器控制,则在域配置文件中设置规则。当本地计算机的访问成功时,请尝试从远程Web服务器进行访问。

如果未能正确配置对MySql端口的远程访问,请考虑在两台计算机之间建立SSH隧道。一旦建立,您就可以像在本地计算机上一样访问MySql。然后通过隧道转发端口,在数据库服务器端,您可以访问localhost环回IP上的服务。