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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

实战


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 Variable Name wait_timeout
Variable Scope Global, Session
Dynamic Variable Yes
Permitted Values (Windows) Type integer
Default 28800
Min Value 1
Max Value 2147483
Permitted Values (Other) Type integer
Default 28800
Min Value 1
Max Value 31536000

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


interactive_timeout

Command-Line Format --interactive-timeout=#
System Variable Name interactive_timeout
Variable Scope Global, Session
Dynamic Variable Yes
Permitted Values Type integer
Default 28800
Min Value 1

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

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,如需转载请自行联系原作者


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
11 0
|
25天前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
20 1
|
25天前
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
14 1
|
25天前
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
21 2
|
20天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
93 0
|
9天前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
75 0
|
15天前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
|
25天前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
17天前
|
SQL 关系型数据库 MySQL
【MySQL】慢SQL分析流程
【4月更文挑战第1天】【MySQL】慢SQL分析流程
|
20天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)(一)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)
29 0