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

[[196907]]

实战

Part1:写在最前

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

Part2:种类

  1. [Warning] Aborted connection 305628 to db: 'db' user'dbuser' host: 'hostname' (Got an error reading communication packets) 
  2. [Warning] Aborted connection 81 to db:'unconnected' user'root' host: '127.0.0.1' (Got timeout reading communication 
  3. packets) 
  4. [Warning] Aborted connection 109 to db:'helei1' user'sys_admin' host: '192.168.1.1' (Got an error writing communication packets) 
  5. [Warning] Access denied for user 'root'@'127.0.0.1' (using password: YES) 
  6. [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. mysql> show global variables like '%timeout%'
  2. +----------------------------+----------+ 
  3. | Variable_name              | Value    | 
  4. +----------------------------+----------+ 
  5. | connect_timeout            | 10       | 
  6. | delayed_insert_timeout     | 300      | 
  7. | innodb_lock_wait_timeout   | 50       | 
  8. | innodb_rollback_on_timeout | OFF      | 
  9. |interactive_timeout        | 28800    | 
  10. | lock_wait_timeout          | 31536000 | 
  11. | net_read_timeout           | 30       | 
  12. | net_write_timeout          | 60       | 
  13. | slave_net_timeout          | 3600     | 
  14. |wait_timeout               | 28800    | 
  15. +----------------------------+----------+ 
  16. 10 rows in set (0.01 sec)  

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

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

Part4:案例1

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

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

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

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

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

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

Part5:案例2

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

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

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

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

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

error log中记载的是

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

Part6:案例3

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

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

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

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

而错误日志没有任何记录

Part7:案例4

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

clients上涨

  1. mysql>show global status like 'aborted%'
  2. +------------------+-------+ 
  3. |Variable_name    | Value | 
  4. +------------------+-------+ 
  5. |Aborted_clients  | 28    | 
  6. |Aborted_connects | 10    | 
  7. +------------------+-------+ 
  8. 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错误是常见的错误,这类错误出现的时候脑海里要有一个理论知识,知道什么情况下,会出现什么样的错误,以便快速定位问题。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/252040.html<

(0)
管理的头像管理
上一篇2025-04-29 06:23
下一篇 2025-04-29 06:24

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注