如何解决 Amazon RDS for MySQL 或 Aurora MySQL 兼容版中的“Got an error reading communication packets”错误?
上次更新日期:2022 年 12 月 12 日
我收到“Got an error reading communication packets”错误消息。我想解决 Amazon Relational Database Service(Amazon RDS)for MySQL 或 Amazon Aurora MySQL 兼容版数据库实例中的此错误。
简短描述
如果服务器-客户端连接断开、不当关闭或不成功,Amazon RDS 会将 aborted_clients 或 aborted_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 服务器网站上的通信错误和连接中止。
可能触发连接中止警告的因素包括但不限于:
- 客户端或驱动程序不兼容
- 可能会关闭空闲连接或阻止连接的防火墙或代理。
- 不当关闭客户端-服务器连接,导致 RDS for MySQL 中的睡眠连接数量增加。
- 客户端应用程序不当终止连接。如果连接处于空闲状态一段时间,则 MySQL 会强制关闭这些连接。然后,您将看到“连接中止”消息。
- 超过 wait_timeout 或 interactive_timeout 阈值的空闲连接。
- 获取连接数据包时,客户端连接超过 connect_timeout 秒数阈值。
- net_write_timeout 和 net_read_timeout 之类参数的值不足。
- 超出 max_allowed_packet 参数值。如果该值太小或查询需要的内存超过为 RDS for MySQL 分配的内存,则会触发连接中止警告。
解决方法
如果您在 RDS for MySQL 或 Aurora MySQL 兼容版中收到连接中止错误,请务必检查 MySQL 参数的值。确定问题的根本原因后,请更新参数并测试新值,同时监控 MySQL 错误日志。
在对 Amazon RDS 连接中止错误进行问题排查时,请考虑以下方法:
- 查看您是否使用了 Amazon RDS 参数组的原定设置值。与连接超时相关的参数的原定设置值可能不适合您的数据库实例。有关更多信息,请参阅为 Amazon RDS for MySQL 配置参数的最佳实践的与连接超时相关的参数部分。
- 为 connect_timeout 设置一个较高的值,看这样做是否有助于减少连接中止错误消息的发生率。此参数指定 MySQL 服务器实例需要等待多久(以秒为单位)方对不良握手做出响应。
- 修改 interactive_timeout 和 wait_timeout。使用连接池(例如 Java)的应用程序必须具有与连接池设置匹配的超时。
- 如果实例必须处理大型查询,请提高 max_allowed_packet 的值。如果某一行包含的数据超过客户端的 max_allowed_packet 值,则会报告错误。如果您使用的是较大的 BLOB 列或长字符串,请提高该值。有关更多信息,请参阅为 Amazon RDS for MySQL 配置参数的最佳实践的 max_allowed_packet 部分。
- 提高 net_write_timeout 和 net_read_timeout 值。 注意:这些值可以设置为与 wait_timeout 相同的值。
- 确保正确关闭 RDS for MySQL 或兼容 Aurora MySQL 的连接。在退出数据库之前,请务必从客户端应用程序调用 mysql_close() 函数。
问题排查提示
如果您仍然收到连接中止错误消息,请按照以下提示尝试排查问题:
- 打开性能详情以检索触发警告的 SQL 语句的时间范围。有关 Aurora MySQL 兼容版,请参阅在 Amazon Aurora 上使用性能详情监控数据库负载。
- 在您的 Amazon RDS 或 Aurora MySQL 数据库实例上开启慢速查询日志记录。这将捕获并记录任何运行时间超过 long_query_time 的查询,该时间默认情况下为 10 秒。有关更多信息,请参阅如何激活和监控 Amazon RDS for MySQL 数据库实例的日志?
- 考虑开启 VPC 流日志。VPC 流日志允许您查看连接是从哪一端(客户端/服务器)关闭的。
- 确保您的应用程序正确关闭了与 MySQL 的连接。
- 从运行客户端的计算机运行 tcpdump 命令,以测试示例数据包捕获。例如:
sudo tcpdump -vvv --interface eth0 port 3306 -W 10 -C 100