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

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介:

实战


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


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
5月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
444 158
|
4月前
|
存储 消息中间件 监控
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
蒋星熠Jaxonic,数据领域技术深耕者。擅长MySQL到ClickHouse链路改造,精通实时同步、数据校验与延迟治理,致力于构建高性能、高一致性的数据架构体系。
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
|
5月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
421 156
|
5月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
524 161
|
4月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
633 5
|
5月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
6月前
|
存储 关系型数据库 MySQL
深入理解MySQL索引类型及其应用场景分析。
通过以上介绍可以看出各类MySQL指标各自拥有明显利弊与最佳实践情墁,在实际业务处理过程中选择正确型号极其重要以确保系统运作流畅而稳健。
224 12
|
7月前
|
存储 SQL 关系型数据库
MySQL的Redo Log与Binlog机制对照分析
通过合理的配置和细致的管理,这两种日志机制相互配合,能够有效地提升MySQL数据库的可靠性和稳定性。
253 10
|
7月前
|
SQL 关系型数据库 MySQL
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
|
10月前
|
SQL 关系型数据库 MySQL
【MySQL】SQL分析的几种方法
以上就是SQL分析的几种方法。需要注意的是,这些方法并不是孤立的,而是相互关联的。在实际的SQL分析中,我们通常需要结合使用这些方法,才能找出最佳的优化策略。同时,SQL分析也需要对数据库管理系统,数据,业务需求有深入的理解,这需要时间和经验的积累。
344 12

推荐镜像

更多