如何解决 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_clients 或 aborted_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_clients 或 aborted_connects 指标值的状态计数器加一时,就会触发该警告。Amazon RDS 使用数据库错误日志来检索此信息。有关详细信息,请参阅 MySQL 服务器网站上的通信错误和连接中止。
可能触发连接中止警告的因素包括(但不限于)以下几项:
- 客户端或驱动程序不兼容
- 可能会关闭空闲连接或阻止连接的防火墙或代理。
- 不当关闭客户端-服务器连接,导致 Amazon RDS MySQL 中的睡眠连接数量增加。
- 超过 wait_timeout 或 interactive_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_timeout 和 wait_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