如何解决 Amazon RDS for MySQL 或 Aurora MySQL 兼容版中的“Got an error reading communication packets”错误?

2 分钟阅读
0

我收到“Got an error reading communication packets”错误。我想解决 Amazon Relational Database Service(Amazon RDS)for MySQL 或 Amazon Aurora MySQL 兼容版数据库实例中的这个错误。

简短描述

如果服务器客户端连接断开、不正确关闭或连接不成功,则 Amazon RDS 会增加 aborted_clientsaborted_connects 的状态计数器。aborted_clients 参数描述的是:由于客户端在失效前未正确关闭连接而导致连接中止的次数。aborted_connects 参数描述的是:尝试连接 MySQL 服务器的失败次数。

log_error_verbosity 指定处理错误日志事件的详细程度。如果此参数的值超过值 2,则 RDS for MySQL 会将此信息写入您的错误日志:

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

每当 aborted_clients 或 aborted_connects 指标值的状态计数器增加时,就会触发此警告。Amazon RDS 使用数据库错误日志来检索此信息。有关更多信息,请参阅 MySQL 服务器网站上的 Communication Errors and Aborted Connections

可能触发连接中止警告的因素包括但不限于:

  • 客户端或驱动程序不兼容
  • 防火墙或代理(可以关闭任何空闲连接或阻止连接)。
  • 不当关闭客户端-服务器连接,导致 RDS for MySQL 内部的休眠连接数量增加。
  • 不当终止连接的客户端应用程序。如果连接处于空闲状态达到一定时间,则 MySQL 会强制关闭这些连接。然后,您将看到“连接中止”消息。
  • 超过 wait_timeoutinteractive_timeout 阈值的空闲连接。
  • 获取连接数据包时超过 connect_timeout 秒数阈值的客户端连接。
  • net_write_timeoutnet_read_timeout 等参数的值过低。
  • 超过了 max_allowed_packet 参数值。如果这个值太小,或者查询需要的内存多于分配给 RDS for MySQL 的内存,则会触发连接中止警告。

解决方法

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

在故障排除 Amazon RDS 中的连接中止错误时,请考虑以下方法:

  • 查看您是否使用的是 Amazon RDS 参数组的默认值。与连接超时相关的参数的默认值可能不适用于您的数据库实例。有关更多信息,请参阅 Best practices for configuring parameters for Amazon RDS for MySQL 中的 Parameters related to security, operational manageability, and connectivity timeout 部分。
  • connect_timeout 设置更高的值,以查看这是否有助于减少连接中止错误消息的发生。此参数指定 MySQL 服务器实例必须等待多长时间(以秒为单位)才响应不良握手。
  • 修改 interactive_timeoutwait_timeout。使用连接池的应用程序(如 Java)的超时时间必须与连接池设置相匹配。
  • 如果实例必须处理大型查询,则增加 max_allowed_packet 的值。如果某行数据超过客户端的 max_allowed_packet 值,则系统会报告错误。如果您使用大型 BLOB 列或长字符串,请增加此值。有关更多信息,请参阅 Best practices for configuring parameters for Amazon RDS for MySQL 中的 max_allowed_packet 部分。
  • 增加 net_write_timeoutnet_read_timeout 值。注意: 这些值可以设置为与 wait_timeout 相同的值。
  • 确保与 RDS for MySQL 或 Aurora MySQL 兼容版的连接已正确关闭。在退出数据库之前,请务必从客户端应用程序调用 mysql_close() 函数。

故障排除提示

如果您仍然收到连接中止错误消息,请尝试按以下故障排除提示操作:

sudo tcpdump -vvv --interface eth0 port 3306 -W 10 -C 100

相关信息

如何修改 Amazon RDS 数据库参数组中的值?

为什么 RDS 数据库实例上的数据库连接断开了?

如何在 Aurora Serverless 集群上启用日志,以便查看和下载日志?