当前位置: 首页 > news >正文

MySQL令人头疼的Aborted告警案例分析

实战


Part1:写在最前

在MySQL的error log中,我们会经常性看到一些各类的Aborted connection错误,本文中会针对这类错误进行一个初步分析,并了解一个问题产生后的基本排查思路和方法。掌握这种方法是至关重要的,而不是出现问题了,去猜,去试。数据库出现问题的时候需要DBA在短时间内快速解决问题,因此一个好与坏的DBA,区别也在于此。




Part2:种类

1
2
3
4
5
6
[Warning] Aborted connection 305628 to db:  'db'  user:  'dbuser'  host:  'hostname'  (Got an error reading communication packets)
[Warning] Aborted connection 81 to db: 'unconnected'  user:  'root'  host:  '127.0.0.1'  (Got timeout reading communication
packets)
[Warning] Aborted connection 109 to db: 'helei1'  user:  'sys_admin'  host:  '192.168.1.1'  (Got an error writing communication packets)
[Warning] Access denied  for  user  'root' @ '127.0.0.1'  (using password: YES)
[Warning] Got an error writing communication packets




Part3:重点参数分析


wait_timeout

Command-Line Format--wait-timeout=#
System VariableNamewait_timeout
Variable ScopeGlobal, Session
Dynamic VariableYes
Permitted Values (Windows)Typeinteger
Default28800
Min Value1
Max Value2147483
Permitted Values (Other)Typeinteger
Default28800
Min Value1
Max Value31536000

这个参数指的是数据库系统在关闭它之前,服务器等待非交互式连接上的活动的秒数。


interactive_timeout

Command-Line Format--interactive-timeout=#
System VariableNameinteractive_timeout
Variable ScopeGlobal, Session
Dynamic VariableYes
Permitted ValuesTypeinteger
Default28800
Min Value1

这个参数指的是在关闭交互式连接之前,服务器等待活动的秒数

Warning:警这两个参数建议一起调节,能够避免一些坑。


本文的两个参数值采用的是默认值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> show global variables like  '%timeout%' ;
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
|interactive_timeout        | 28800    |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 3600     |
|wait_timeout               | 28800    |
+----------------------------+----------+
10 rows  in  set  (0.01 sec)


另外在数据库中,我们重点关注下这两个参数,看看什么情况下Aborted_clients会提升,什么情况下Aborted_connects 会提升

1
2
3
4
5
6
7
8
mysql>show global status like  'aborted%' ;
+------------------+-------+
|Variable_name    | Value |
+------------------+-------+
|Aborted_clients  | 19    |
|Aborted_connects | 0     |
+------------------+-------+
2 rows inset (0.00 sec)



Part4:案例1

这里我故意输入错误的密码5次,来看下数据库的error log和Aborted的哪个参数记载了这一问题

1
2
3
4
5
6
7
8
9
10
[root@HE3~] # mysql -uroot -pwrongpass -h127.0.0.1
ERROR 1045 (28000): Access denied  for  user  'root' @ '127.0.0.1'  (using password: YES)
[root@HE3~] # mysql -uroot -pwrongpass -h127.0.0.1
ERROR 1045 (28000): Access denied  for  user  'root' @ '127.0.0.1'  (using password: YES)
[root@HE3~] # mysql -uroot -pwrongpass -h127.0.0.1
ERROR 1045 (28000): Access denied  for  user  'root' @ '127.0.0.1'  (using password: YES)
[root@HE3~] # mysql -uroot -pwrongpass -h127.0.0.1
ERROR 1045 (28000): Access denied  for  user  'root' @ '127.0.0.1'  (using password: YES)
[root@HE3~] # mysql -uroot -pwrongpass -h127.0.0.1
ERROR 1045 (28000): Access denied  for  user  'root' @ '127.0.0.1'  (using password: YES)


可以看出,这里的Aborted_connects 记录了密码错误的这一问题

1
2
3
4
5
6
7
8
mysql>show global status like  'aborted%' ;
+------------------+-------+
|Variable_name    | Value |
+------------------+-------+
|Aborted_clients  | 19    |
|Aborted_connects | 5     |
+------------------+-------+
2 rows inset (0.00 sec)


error log中,也记载了这类密码输错的信息

1
2
3
4
5
[Warning] Access denied  for  user 'root' @ '127.0.0.1'  (using password: YES)
[Warning] Access denied  for  user  'root' @ '127.0.0.1'  (using password:YES)
[Warning] Access denied  for  user  'root' @ '127.0.0.1'  (using password:YES)
[Warning] Access denied  for  user  'root' @ '127.0.0.1'  (using password:YES)
[Warning] Access denied  for  user  'root' @ '127.0.0.1'  (using password:YES)




Part5:案例2

接下来我们看下文章第三节提到的两个重点参数对数据库连接的行为影响

这里我们将这两个参数均配置为10秒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> set  global wait_timeout=10;
Query OK,0 rows affected (0.00 sec)
  
mysql> set  global interactive_timeout=10;
Query OK,0 rows affected (0.00 sec)
mysql>show processlist;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect... Connection  id : 79 Current database: *** NONE ***
  
+----+------+-----------------+------+---------+------+-------+------------------+
| Id |User | Host            | db   | Command | Time | State | Info             |
+----+------+-----------------+------+---------+------+-------+------------------+
| 79 |root | 127.0.0.1:42016 | NULL | Query  |    0 | NULL  | show processlist |
+----+------+-----------------+------+---------+------+-------+------------------+
1 row  in  set  (0.00 sec)

 

这里三次操作,可以看到clients数上升,这是由于timeout参数控制的,已经连接上数据的连接被杀掉。

1
2
3
4
5
6
7
8
9
10
11
mysql>show global status like  'aborted%' ;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect... Connection  id :    81 Current database: *** NONE ***
  
+------------------+-------+
|Variable_name    | Value |
+------------------+-------+
|Aborted_clients  | 22    |
|Aborted_connects | 5     |
+------------------+-------+
2 rows  in  set  (0.01 sec)


error log中记载的是

1
2
3
[Warning] Aborted connection 81 to db:  'unconnected'  user:  'root'  host:  '127.0.0.1'  (Got timeout reading communication packets)
[Warning] Aborted connection 78 to db:  'unconnected'  user:  'root'  host:  '127.0.0.1'  (Got timeout reading communication packets) 
[Warning] Aborted connection 79 to db:  'unconnected'  user:  'root'  host:  '127.0.0.1'  (Got timeout reading communication packets)



Part6:案例3

在这个案例中我们看下最大连接数对数据库连接的行为影响

1
2
3
4
5
6
7
8
9
10
11
12
mysql>show global variables like  'max_conn%' ;
+--------------------+-------+
|Variable_name      | Value |
+--------------------+-------+
|max_connect_errors | 1000  |
|max_connections    | 1024  |
+--------------------+-------+
2 rows  in  set  (0.00 sec)
  
  
mysql> set  global max_connections=2;
Query OK,0 rows affected (0.00 sec)


这里看到爆出了连接数过多的问题 

1
2
[root@HE3~] # mysql -uroot -pMANAGER -h127.0.0.1
ERROR 1040 (HY000): Too many connections

 

而错误日志没有任何记录





Part7:案例4

第三方工具navicat select结果没有出来的时候选择停止则出现

clients上涨

1
2
3
4
5
6
7
8
mysql>show global status like  'aborted%' ;
+------------------+-------+
|Variable_name    | Value |
+------------------+-------+
|Aborted_clients  | 28    |
|Aborted_connects | 10    |
+------------------+-------+
2 rows  in  set  (0.00 sec)



error log日志记录

1
170626 16:26:56 [Warning] Aborted connection 109 to db:  'helei1'  user:  'sys_admin'  host:  '192.168.1.1'  (Got an error writing communication packets)



Part8:原因总结

  1. 在MySQL中sleep状态数百秒的而且经常重复连接是应用程序在工作后没有关闭连接的症状之一,而是依靠数据库wait_timeout来关闭它们。强烈建议在操作结束时更改应用程序逻辑以正确关闭连接;

  2. 检查以确保max_allowed_packet的值足够高,并且客户端没有收到“数据包太大”消息。 这种情况他会中止连接,而不正确关闭它;

  3. 另一种可能性是TIME_WAIT。建议您确认连接被妥善管理并且是在应用端正常关闭;

  4. 确保事务正确提交(开始和提交),以便一旦应用程序“完成”连接,它将处于“clean”的状态;

  5. 您应该确保客户端应用程序不中止连接。 例如,如果PHP的选项max_execution_time设置为5秒,增加connect_timeout是没用的,因为PHP会杀死脚本。 其他编程语言和环境也有类似的选项;

  6. 连接延迟的另一个原因是DNS问题。 检查是否启用了skip-name-resolve,检查主机根据其IP地址而不是其主机名进行身份验证;

  7. 尝试增加MySQL的net_read_timeout和net_write_timeout值,看看是否减少了错误的数量。





——总结——

通过这4个案例,我们能够了解到,Aborted_clients、和Aborted_connects的区别,以及什么情况下会爆出什么样的错误日志,文章第二节中的几个Aborted错误是常见的错误,这类错误出现的时候脑海里要有一个理论知识,知道什么情况下,会出现什么样的错误,以便快速定位问题。由于者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。




 本文转自 dbapower 51CTO博客,原文链接:http://blog.51cto.com/suifu/1942302,如需转载请自行联系原作者


相关文章:

  • 用C#完成Swift远程推送通知
  • 3不原则:如何在HIT行业找到合适的“东家”
  • 容易被忽视的Linux磁盘配额设置
  • 存储过程与函数的区别
  • eclipse在线安装jetty插件的方法
  • [C#]猫叫人醒老鼠跑 C#的委托及事件
  • 3星|《财经天下周刊》2017年21期:海外购几乎是亚马逊中国的最后一根救命稻草...
  • java对象与json对象间的相互转换
  • ELK日志分析单机系统详解
  • IDEA Git 配置及使用
  • ssh批量管理分发项目实战介绍与实践
  • Linux防火墙详解(一)
  • Linux内核驱动基础(一)常用宏定义【转】
  • xshell使用xftp传输文件、使用pure-ftpd搭建ftp服务
  • hibernate增删改
  • crontab执行失败的多种原因
  • HTTP中GET与POST的区别 99%的错误认识
  • Java的Interrupt与线程中断
  • Java多线程(4):使用线程池执行定时任务
  • Js基础知识(一) - 变量
  • Laravel 菜鸟晋级之路
  • Netty源码解析1-Buffer
  • PAT A1050
  • Tornado学习笔记(1)
  • underscore源码剖析之整体架构
  • 闭包--闭包作用之保存(一)
  • 实现简单的正则表达式引擎
  • 学习使用ExpressJS 4.0中的新Router
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 数据库巡检项
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​如何防止网络攻击?
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #Lua:Lua调用C++生成的DLL库
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (力扣题库)跳跃游戏II(c++)
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (轉)JSON.stringify 语法实例讲解
  • ***利用Ms05002溢出找“肉鸡
  • .chm格式文件如何阅读
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .Net Remoting常用部署结构
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .Net8 Blazor 尝鲜
  • .net中生成excel后调整宽度
  • .pop ----remove 删除
  • ??myeclipse+tomcat
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存