根据 DB Engine网站,MySQL 是仅次于 Oracle的世界第二著名数据库。MySQL之所以出名,可能是因为它是一个非常快速、可靠和灵活的数据库管理系统。MySQL 也是Cluster Control 中支持的数据库之一。您可以使用 ClusterControl 轻松部署、扩展、监控和做很多事情。
今天我们不打算讨论其中任何一个,但我们将讨论 MySQL 的一个常见错误和可能的故障排除技巧。在处理工单时,很多时候我们在查看错误报告或日志时,经常会看到“读取通信数据包时出错”这一行。我们认为,如果我们不仅为我们的客户而且为其他读者撰写与此错误相关的博客,这将是有益的。
MySQL 客户端/服务器协议
首先,我们需要了解MySQL客户端和服务器之间的通信方式。客户端和服务器都使用 MySQL 协议,该协议由连接器、MySQL 代理以及主从复制服务器之间的通信实现。MySQL 协议支持通过 SSL 透明加密、透明压缩、连接阶段和命令阶段等功能。
整数和字符串都是 MySQL 协议中使用的基本数据类型。每当 MySQL 客户端和服务器想要相互通信或发送数据时,它会将数据分成最大大小为 16MB 的数据包,并且还会在每个数据块前附加一个数据包头。在每个数据包内,将有一个有效载荷,数据类型(整数/字符串)在其中发挥作用。
考虑到CLIENT_PROTOCOL_41已启用,对于客户端发送到服务器的几乎每个命令,服务器都会回复以下任何数据包作为响应:
如何诊断问题
通常,有两种类型的连接问题,即通信错误或连接中止。每当发生任何这些连接问题时,以下信息来源都是故障排除和分析的良好起点:
连接错误和可能的原因
如果发生任何连接错误,并且根据错误,它将增加状态变量中 Aborted_clients 或 Aborted_connects的状态计数器。从 MySQL 文档中获取,Aborted_clients表示由于客户端在没有正确关闭连接的情况下死亡而被中止的连接数。至于Aborted_connects,它表示尝试连接到 MySQL 服务器的失败次数。
如果您使用–log-warnings 选项启动 MySQL 服务器,您可能会在错误日志中看到以下消息的示例。正如您所注意到的,该消息明确表示它与中止连接有关,因此 Aborted_connects 状态计数器将在状态变量中递增:
[警告] 与数据库的连接 154669 中止:‘wordpress’ 用户:‘wpuser’ 主机:‘主机名’(读取通信数据包时出错)
通常,连接尝试失败可能是由于以下原因造成的。当您注意到这一点时,它可能表明未经授权的人即将破坏数据库,您可能希望尽快查看它:
- 客户端没有访问数据库的权限。
- 使用了错误的凭据。
- 包含错误信息的连接数据包。
- 由于达到了connect_timeout 连接的限制。
如果客户端设法连接但以不正确的方式断开连接或终止,服务器将增加 Aborted_clients的状态变量。除此之外,服务器还将中止连接消息记录到错误日志中。对于这种类型的错误,通常可能是由于以下原因:
- 客户端在退出前没有正确关闭连接(没有调用mysql_close())。
- 客户端已超过wait_timeout 或interactive_timeout 秒。
- 客户端程序或应用程序在数据传输过程中突然结束。
除了之前的原因之外,中止连接和中止客户端问题的其他可能原因可能与以下任何一项有关:
- TCP/IP 配置搞砸了。
- 变量值对于max_allowed_packet来说太小了。
- 用于查询的内存分配不足。
- 有故障的硬件,如以太网、交换机、电缆等。
- 线程库问题。
双工综合症问题,即传输进入突发-暂停-突发-暂停模式(如果您在 Linux 中使用以太网协议,则包括半双工和全双工)。
如何修复 MySQL 通信错误
现在我们了解了很多导致 MySQL 连接错误的可能性。根据我们的经验,这个问题大多与防火墙或网络问题有关。公平地说,诊断此类问题并不容易。尽管如此,以下解决方案可能对您解决此错误有所帮助:
- 如果您的应用程序依赖wait_timeout 关闭连接,则值得更改应用程序逻辑,以便在任何操作结束时正确关闭它。
- 确保 max_allowed_packet 的值在可接受的范围内,以便客户端不会收到与“数据包太大”相关的任何错误。
- 对于可能由 DNS 引起的连接延迟问题,值得检查是否启用了跳过名称解析。
- 如果您正在使用 PHP 应用程序或任何其他编程,最好确保它不会中止通常在max_execution_time设置的连接。
- 如果您注意到来自 netstat的大量TIME_WAIT 通知,则值得确认连接在应用程序端得到了很好的管理。
- 如果您使用的是 Linux 并怀疑问题是由网络引起的,最好使用ifconfig-a 命令检查网络接口并检查 MySQL 服务器上的输出是否有任何错误。
- 对于ClusterControl用户,您可以从 Cluster -> Security -> Audit Log 启用 Audit Log。通过启用此功能,它可以帮助您缩小查找问题的范围。
- tcpdump和Wireshark等网络工具可用于识别 MySQL 的潜在网络问题、超时和资源问题。
- 定期检查硬件,确保没有故障设备,尤其是以太网、集线器、交换机、电缆等。更换故障设备以确保连接始终良好是值得的。
结论
有很多原因可能会导致 MySQL 连接数据包问题。每当出现此问题时,肯定会影响业务和日常运营。尽管这种类型的问题不容易诊断,而且大多数情况下是由网络或防火墙引起的,但为了解决问题,还是值得考虑之前建议的所有步骤。我们真的希望这篇博文能够以某种方式帮助您,尤其是当您遇到这个问题时。




