如何解决 Amazon RDS MySQL 中的“Got an error reading communication packets”错误?

上次更新日期:2021 年 8 月 6 日

我在 Amazon RDS MySQL 中收到“Got an error reading communication packets”错误消息。如何解决此错误?

简短描述

如果服务器-客户端连接断开、不当关闭或不成功,Amazon Relational Database Service (Amazon RDS) MySQL 会将 aborted_clientsaborted_connects 的状态计数器加一。

如果 log_error_verbosity 的值超过 2,则 RDS MySQL 将在错误日志中写入以下信息:

[Warning] Aborted connection xxx to db: '<database name>' user: '<user name>' host: '<host IP>' (Got an error reading communication packets)

每当 aborted_clientsaborted_connects 指标值的状态计数器加一时,就会触发该警告。Amazon RDS 使用数据库错误日志来检索此信息。有关详细信息,请参阅 MySQL 服务器网站上的通信错误和连接中止

可能触发连接中止警告的因素包括(但不限于)以下几项:

  • 客户端或驱动程序不兼容
  • 可能会关闭空闲连接或阻止连接的防火墙或代理。
  • 不当关闭客户端-服务器连接,导致 Amazon RDS MySQL 中的睡眠连接数量增加。
  • 超过 wait_timeoutinteractive_timeout 阈值的空闲连接。
  • 客户端应用程序不当终止连接。
  • 获取连接数据包时,客户端连接超过 connect_timeout 秒数阈值。
  • 超出 max_allowed_packet 参数值。如果查询所需的内存超过了实例为 Amazon RDS MySQL 分配的内存,则将触发连接中止警告。

解决方法

如果您在 Amazon RDS for MySQL 中收到连接中止错误,请务必检查 MySQL 参数的值。确定问题的根本原因后,请更新参数并测试新值,同时监控 MySQL 错误日志

在对 Amazon RDS 连接中止错误进行问题排查时,请考虑以下方法:

  • 查看您是否使用了 Amazon RDS 参数组的原定设置值。与连接超时相关的参数的原定设置值可能不适合您的数据库实例。有关这些参数的更多信息,请参阅为 Amazon RDS for MySQL 配置参数的最佳实践与连接超时相关的参数部分。
  • connect_timeout 设置一个较高的值,看这样做是否有助于减少连接中止错误消息的发生率。此参数指定 MySQL 服务器实例需要等待多久(以秒为单位)方对不良握手做出响应。
  • 修改 interactive_timeoutwait_timeout。使用连接池(例如 Java)的应用程序必须具有与连接池设置匹配的超时。
  • 如果实例必须处理大型查询,请提高 max_allowed_packets 的值。如果某一行包含的数据超过客户端的 max_allowed_packet 值,则会报告错误。如果您使用的是较大的 BLOB 列或长字符串,请提高该值。有关更多信息,请参阅为 Amazon RDS for MySQL 配置参数的最佳实践max_allowed_packet 部分。
  • 确保 Amazon RDS for MySQL 连接已正常关闭。在退出数据库之前,请务必从客户端应用程序调用 mysql_close() 函数。

问题排查提示

如果您仍然收到连接中止错误消息,请按照以下提示尝试排查问题:

  • 启用性能详情以检索触发警告的 SQL 语句的时间范围。
  • 从运行客户端的计算机执行 tcpdump 命令,以测试示例数据包捕获。例如:
sudo tcpdump -vvv --interface eth0 port 3306 -W 10 -C 100

这篇文章对您有帮助吗?


您是否需要账单或技术支持?