使用 mysql_connect() 和 telnet 连接主机偶尔会成功,但我总能成功 ping 通主机?

使用 mysql_connect() 和 telnet 连接主机偶尔会成功,但我总能成功 ping 通主机?

当我尝试使用 连接到 LAN 上的主机时mysql_connect();,连接有时会成功,有时会失败。我总是可以成功 ping MySQL 服务器,但是当我尝试使用telnet通过端口 3306 连接到它时,它并不总是有效。我第一次可以连接到端口 3306,但之后就不行了。

5.1.58-1ubuntu1)[n9pK8'Ym7j1Q'khH Got packets out of order
Lost connection with host

C:\Documents and Settings\Administrator>telnet 10.253.48.49 3306
Connecting to 10.253.48.49... Cannot open connection to the host on port 3306:
Connect failed

Pinging is always successful, however:
Reply from 10.253.48.49: bytes=32 time<1ms TTL=64
Reply from 10.253.48.49: bytes=32 time<1ms TTL=64
Reply from 10.253.48.49: bytes=32 time<1ms TTL=64
Reply from 10.253.48.49: bytes=32 time<1ms TTL=64
Reply from 10.253.48.49: bytes=32 time<1ms TTL=64

此外,局域网上的其他客户端可以连接到主机,而我无法连接。我每次都能成功连接到另一台主机。我该如何解决这个错误?

答案1

这里可能性不大,但网络上是否有重复的 IP 地址?例如,一个托管 mysql,另一个不托管 mysql,而您随机连接到正确的 IP 地址?

尝试执行 arp -a 并检查您认为正确的 IP 的 MAC 地址。这可能需要几次尝试,但如果您有重复的 IP,您最终会为同一 IP 获得不同的 MAC 地址。

答案2

在 MySQL 的主机上(根据您的错误消息,我假设它正在运行 Ubuntu),尝试运行以下命令:

sudo netstat -lntp | grep 3306

您应该看到mysqld守护进程正在运行。否则,问题可能是机器的 MySQL 守护进程没有运行。我认为 Ubuntu 上的命令是以/etc/init.d/mysql startroot 身份运行的,如果守护进程没有运行,它将启动它。(我不使用 Ubuntu,但谷歌搜索后得到了这个结果。在 Arch 上是这样的,rc.d start mysqld但它不能完全翻译成 Ubuntu)。

如果问题不是出在主机上,即守护进程正在运行,则问题可能是防火墙配置不正确,端口未打开。尝试使用此命令查看端口是否打开(这两个命令都在运行 MySQL 的主机上运行,​​而不是在您使用 PHP 的本地机器上运行)

nmap -v -sT localhost

如果你没有看到3306列出的端口为打开状态,并且该机器正在用作iptables防火墙,则此命令应该打开该端口

iptables -I INPUT -p tcp --dport 3306 -d host.machine.ip.address -s your.machine.ip.address -j ACCEPT

它应该允许您的客户端计算机(正在运行的计算机mysql_connect(),即使它不应该运行)访问 MySQL 主机。

另外,正如我在评论中提到的那样(感谢六道仙人为此):请不要将mysql_*函数用于新代码。它们不再维护,社区已经开始弃用流程. 请参阅红色盒子你应该了解准备好的语句并使用原产地保护组织或者MySQL 的如果你无法决定选择哪一个,本文会帮助你。如果你想学习,这是很好的 PDO 教程

编辑:在网上搜索了几次之后,我发现ServerFault 上的另一个用户用我提出的三个命令中的两个回答了这个问题,所以我链接到该问题,因为它可能相关。

相关内容