我有一个 MySQL 数据库,它完全停止接受来自我的 Web 服务器的连接。因此,我通过 SSH 进入服务器并开始检查其重要性。硬盘有足够的开放空间,并且有足够的可用内存和交换空间。没有任何东西占用 CPU(接近 100% 空闲)。我甚至在本地连接到 MySQL 并运行了一些查询,没有任何问题。但 SHOW PROCESSLIST 只显示我自己的连接,没有显示其他连接。
最糟糕的是,在 MySQL 日志中,没有任何错误与服务器不可用有丝毫相似。
在 Web 服务器上,在开始出现不可用情况时,我收到一条错误消息,提示“查询期间与 MySQL 服务器失去连接”,随后出现一堆“MySQL 服务器已消失”的错误。
服务器上只有另一个应用程序接受网络连接,我终止了那个应用程序(以防它持有太多打开的连接或类似的东西),但这没有帮助。
最后,我只是重新启动了 MySQL 进程,一切(现在)都恢复正常工作了。
在这种情况下,我还应该检查什么?知道问题可能是什么吗?我如何验证这确实是问题所在?
答案1
按照上面的回复,验证 iptables 没有发生任何阻止 3306 的更改。另外,确保您的 /etc/my.cnf 没有被覆盖,可能是由分发包更新覆盖。您不应该在 [mysqld] 下看到 skip-networking 指令
答案2
您应该使用 lsof 或 netstat 检查进程是否在正确的接口上侦听端口 3306(它是否仅绑定到 127.0.0.1 或绑定到主机 ip 或 *)。您还应该检查进程打开了多少个文件(您可能遇到了 ulimit)。您还应该确保您的 iptables 规则没有发生任何导致其阻塞的更改(但除非您使用某些高级模块,否则重新起草不会有帮助)。还要确保您没有使用可能更新 tcp 包装器规则的东西,例如拒绝主机(检查 /etc/hosts.* - 但同样,这不太可能通过重新启动来解决)。下次发生这种情况时,请在您的 myswl 服务器和应用程序服务器上启动 wireshark,并在您尝试通过网络连接到 mysql 时过滤端口 3306。