代码改变世界

Aborted connection 1055898 to db: 'xxx' user: 'yyy' host: 'xxx.xxx.xxx.xxx' (Got timeout reading communication packets)

  abce  阅读(9917)  评论(0编辑  收藏  举报

mysql错误日志中,发现大量以下类似信息:(mysql 5.7.18)

1
[Note] Aborted connection 1055898 to db: 'xxx' user: 'yyy' host: 'xxx.xxx.xxx.xxx' (Got timeout reading communication packets)

 

这种Aborted connection情况下,mysql会增加aborted_clients状态计数器的值。这也意味着以下几个问题:

(1)客户端正常连接,但是被异常结束(可能是程序没有正常关闭连接)
(2)客户端sleep的时间超过了wait_timeout、或interactive_timeout的值(这会导致连接被mysql强制关闭)
(3)客户端异常终端,或者查询超出max_allowed_packet的值

1
2
3
4
5
6
7
mysql> show variables like '%max_allowed_packet%';
+--------------------------+------------+
| Variable_name            | Value      |
+--------------------------+------------+
| max_allowed_packet       | 16777216   |
| slave_max_allowed_packet | 1073741824 |
+--------------------------+------------+

  

当然,也可能是其它原因导致的。坦白讲,异常中断是很难诊断的,也有可能是和网络、防火墙有关。可以从以下几个方面考虑:

1.如果有大量的连接进程处于sleep状态时间较长,也就意味着应用没有正确、及时关闭数据库连接。强烈建议在应用中能恰当地关闭数据库连接,否则就需要依赖mysql的wait_timeout的设置来关闭连接了。

2.建议检查max_allowed_packet的值,确保该值设置的合理,这样客户端就不会接收到"packet too large"消息提示。如果设置不合理,会异常中断连接。

3.建议关注线程的time_wait数量。如果netstat发现有大量的连接处于time_wait状态,表示该建议应用端调整连接关闭问题了。

1
2
3
4
5
6
7
8
9
#               netstat -ano|grep TIME_WAIT
tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55586      TIME_WAIT   timewait (32.97/0/0)
tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55367      TIME_WAIT   timewait (27.82/0/0)
tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55776      TIME_WAIT   timewait (37.09/0/0)
tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:56505      TIME_WAIT   timewait (54.61/0/0)
tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55553      TIME_WAIT   timewait (31.94/0/0)
tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:56643      TIME_WAIT   timewait (57.73/0/0)
tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55221      TIME_WAIT   timewait (23.70/0/0)
tcp        0      0 xxx.xxx.xxx.xxx:10054       xxx.xxx.xxx.xxx:55920      TIME_WAIT   timewait (41.18/0/0)

4.确保事务被正确、及时地提交了。

5.确保应用端没有异常中断连接,比如php如果设置了max_execution_time=5,即使你增加connect_timeout的值也不会有效果。其它编程语言也会有类似的问题。

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

7.如果是percona,可以开启审计日志。如果没有审计,可以暂时开启general log进行观察。

8.增加net_read_timeout、net_write_timeout的值,并观察是否还有该错误发生。net_read_timeout很少会导致出错,除非网络环境非常差。

连接异常中断是因为连接没有被正常关闭。server端不会导致连接abort,除非客户端/服务器端发生了网络问题。但这也是网络导致的,而不是server端的问题。网络问题可以借助工具来查看,比如:tcpdump,netstat -s

 

 

回到问题的本身,先看看mysql的参数设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| connect_timeout             | 10       |
| interactive_timeout         | 1800     |
| lock_wait_timeout           | 31536000 |
| net_read_timeout            | 30       |
| net_write_timeout           | 60       |
| wait_timeout                | 1800     |
+-----------------------------+----------+
mysql> show global variables like '%log_warning%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_warnings  | 2     |
+---------------+-------+
1 row in set (0.00 sec)
 
mysql>

如果log_warnings的值大于1,mysql会将类似信息写入错误日志:

1
2
[Warning] Aborted connection 305628 to db: 'db' user: 'dbuser' host: 'hostname' (Got an error reading communication packets)
[Warning] Aborted connection 305627 to db: 'db' user: 'dbuser' host: 'hostname' (Got an error reading communication packets)

如果不想在日志中记录这些信息,可以修改一下log_waring的值:

1
mysql>set global log_warnings=1;

  

  

  

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2015-06-23 PDB重命名
2015-06-23 CDB中plug PDB
2015-06-23 Oracle Flashback Technologies - 闪回查询
2015-06-23 Oracle Flashback Technologies - 闪回被drop的表
2015-06-23 Oracle Flashback Technologies - 估算不同时间段闪回日志的产生量
2015-06-23 Oracle Flashback Technologies - 闪回数据库
2015-06-23 Oracle Flashback Technologies (总)
点击右上角即可分享
微信分享提示