我有 100 个 PC 客户端通过 LAN 连接到 MySQL。
它们运行 INSERT 查询,没有特定的时间段。从统计上看,同时尝试运行 INSERT 查询的 PC 不超过 10 台。这不是设计限制,只是查询执行取决于每台 PC 的用户活动。
每个客户端每次需要运行 INSERT 查询时都会连接和断开连接(连接 - 插入 - 断开连接)。
几个月来一切都运行良好,但几天前客户端开始出现连接失败。
每天大约有两次,每次 5-10 分钟,客户端无法连接。它们会收到超时错误。在此期间,所有 PC 客户端都无法连接。它们都无法连接。
失败时间是随机的。有时发生在 09:00,有时发生在 13:00,等等。每个用户的活动都很有规律,所以每天之间没有太大差异。我的意思是,一天中的某个时间似乎并不重要。
查看服务器端,我发现 mysql 日志中没有错误,没有服务崩溃,也没有服务器重启。我只启用了错误日志(没有查询日志,没有慢查询日志)。
然后我搜索网络问题,但从 PC 到服务器以及从服务器到 PC 的 tracert 是正确的。
我在服务器上进行了网络捕获(使用 wireshark)以查看是否可以在那里找到错误。
在错误期间(这 5-10 分钟),我发现 PC 客户端的连接卡在“问候”消息中。客户端 PC 不会发送“登录”请求作为响应。
答案1
深入研究网络跟踪我发现了一些名称解析问题。
我正在运行 MySQL 社区版 5.1.41 版本。我不知道其他实际版本是否也如此,但在这个版本中,“名称解析”功能默认启用。
启用名称解析后,每次网络连接启动时,MySQL 都会尝试从客户端的 IP 解析其 PC 名称。
如果此名称解析因某种原因失败或延迟,则可能会导致连接问题。
随着名称解析度的下降,每次客户端 PC 重试时,我们都会遇到更多的失败和延迟连接,最终无法成功建立网络连接。
解决方案是禁用名称解析。如果您为某些依赖客户端主机名的 MySQL 用户定义了权限,则此功能非常重要。但由于我们没有任何基于客户端主机名的权限(而是使用 IP 地址),因此我们可以安全地禁用“名称解析”功能。
这个链接可以解释这一点,并指出正确的方向以及在网络捕获中要搜索的内容: