【MySQL技术专题】「标题实战系列」MySQL报错Got an error reading communi ...

小小小幸运  金牌会员 | 2024-6-23 18:00:35 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 793|帖子 793|积分 2379


前因配景

当体系服务的MySQL错误日记中,发现大量以下类似信息:经常收到客户关于通讯故障错误的标题—客户面对间歇性的”Got an error reading communication packet”错误,这里分析这个错误出现的原因,以及如何解决这个标题。
  1. Aborted connection 1055898 to db: 'xxx' user: 'yyy' host: 'xxx.xxx.xxx.xxx' (Got timeout reading communication packets)
复制代码
官方解释

下面看看官网怎么说:
Aborted_connects:

   If a client is unable even to connect, the server increments the Aborted_connects status variable.
  1. A client attempts to access a database but has no privileges for it.
  2. #客户端没有权限但是尝试访问MySQL数据库
  3. A client uses an incorrect password.
  4. #客户端输入的密码有误。
  5. A connection packet does not contain the right information.
  6. #连接包不包含正确信息
  7. takes more than connect_timeout seconds to obtain a connect packet.
  8. #超过连接时间限制,主要是这个系统变量connect_timeout控制(mysql默认是10s,基本上,除非网络环境极端不好,一般不会超时。)
复制代码
Aborted_clients:

   lIf a client successfully connects but later disconnects improperly or is terminated, the server increments the Aborted_clients status variable
  1. The client program did not call mysql_close() before exiting…
  2. #客户端没有进行关闭
  3. The client had been sleeping more than wait_timeout or interactive_timeout seconds without issuing any requests to the server.
  4. #客户端睡眠时间超过了wait_timeout或interactive_timeout秒,而没有向服务器发出任何请求。
  5. The client program ended abruptly in the middle of a data transfer.
  6. #客户端程序在数据传输过程中突然终止。
复制代码
Aborted_connects OR Aborted_clients:

Other reasons for problems with aborted connections or aborted clients:
  1. the max_allowed_packet variable value is too small or queries require more memory than you have allocated for mysqld
  2. #max_allow_packet设置过小
  3. Use of Ethernet protocol with Linux, both half and full duplex. Some Linux Ethernet drivers have this bug
  4. #Linux以太网驱动程序有这个bug
  5. A problem with the thread library that causes interrupts on reads.#线程库中导致读取中断的问题。
  6. Badly configured TCP/IP. #tcp/iip 配置信息混乱
  7. Faulty Ethernets, hubs, switches, cables, and so forth. This can be diagnosed properly only by replacing hardware.
  8. #故障的以太网、集线器、交换机、电缆等等
复制代码
  https://dev.mysql.com/doc/refman/5.7/en/communication-errors.html
  Aborted connection情况下,这也意味着以下几个标题:

  • 客户端正常连接,但是被非常结束(可能是程序没有正常关闭连接)
  • 客户端sleep的时间超过了wait_timeout、或interactive_timeout的值(这会导致连接被mysql逼迫关闭)
  • 客户端非常终端,或者查询超出max_allowed_packet的值
临时配置解决办法

设置最大包巨细

  1. set global max_allowed_packet = 1024*1024*1024;
复制代码
检察包巨细

  1. mysql> show variables like '%max_allowed_packet%';
  2. +--------------------------+------------+
  3. | Variable_name            | Value      |
  4. +--------------------------+------------+
  5. | max_allowed_packet       | 16777216   |
  6. | slave_max_allowed_packet | 1073741824 |
  7. +--------------------------+------------+
复制代码
永久配置解决办法

  1. [mysqld]
  2. max_allowed_packet=256M
复制代码
固然,也可能是别的原因导致的。坦白讲,非常中断是很难诊断的,也有可能是和网络、防火墙有关。
从以下几个方面思量:


  • 假如有大量的连接历程处于sleep状态时间较长,也就意味着应用没有精确、及时关闭数据库连接。猛烈建议在应用中能适当地关闭数据库连接,否则就必要依赖mysql的wait_timeout的设置来关闭连接了。
  • 建议检查max_allowed_packet的值,确保该值设置的合理,这样客户端就不会吸收到"packet too large"消息提示。假如设置不合理,会非常中断连接。
  • 建议关注线程的time_wait数目。假如netstat发现有大量的连接处于time_wait状态,表现该建议应用端调整连接关闭标题了。
TIME_WAIT的处理方案

  1. netstat -ano|grep TIME_WAIT
  2. tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55586      TIME_WAIT   timewait (32.97/0/0)
  3. tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55367      TIME_WAIT   timewait (27.82/0/0)
  4. tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55776      TIME_WAIT   timewait (37.09/0/0)
  5. tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:56505      TIME_WAIT   timewait (54.61/0/0)
  6. tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55553      TIME_WAIT   timewait (31.94/0/0)
  7. tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:56643      TIME_WAIT   timewait (57.73/0/0)
  8. tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55221      TIME_WAIT   timewait (23.70/0/0)
  9. tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55920      TIME_WAIT   timewait (41.18/0/0)
复制代码
网络标题分析



  • 检查DNS配置是否有延迟标题。

    • 检查是否同时配置了skip_name_resolve,且使用IP验证主机而不是使用主机名。设置该参数后,使用ip验证主机,而不是使用主机名。使用该参数后,mysql授权表中的host列必须是IP地址或者localhost。

  • 增加net_read_timeout、net_write_timeout的值,并观察是否还有该错误发生;

    • net_read_timeout很少会导致堕落,除非网络情况非常差。

mysql的参数设置:

  1. mysql> show variables like '%timeout%';
  2. +-----------------------------+----------+
  3. | Variable_name               | Value    |
  4. +-----------------------------+----------+
  5. | connect_timeout             | 10       |
  6. | interactive_timeout         | 1800     |
  7. | lock_wait_timeout           | 31536000 |
  8. | net_read_timeout            | 30       |
  9. | net_write_timeout           | 60       |
  10. | wait_timeout                | 1800     |
  11. +-----------------------------+----------+
复制代码


  • 连接非常中断是由于连接没有被正常关闭。

    • server端不会导致连接abort,除非客户端/服务器端发生了网络标题。而不是server端的标题。

  1. tcpdump,netstat -s
复制代码
log_warnings掩耳盗铃



  1. mysql> show global variables like '%log_warning%';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | log_warnings  | 2     |
  6. +---------------+-------+
  7. 1 row in set (0.00 sec)
复制代码
假如log_warnings的值大于1,mysql会将类似信息写入错误日记:
  1. [Warning] Aborted connection 305628 to db: 'db' user: 'dbuser' host: 'hostname' (Got an error reading communication packets)
  2. [Warning] Aborted connection 305627 to db: 'db' user: 'dbuser' host: 'hostname' (Got an error reading communication packets)
复制代码
可以修改一下log_waring的值:
  1. set global log_warnings=1;
复制代码
但这样直接修改,重启后会失效,修改配置文件mysql.cnf log_warnings = 1

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表