MySQL令人头疼的Aborted告警案例分析
MySQL关于aborted告警日志的分析
实战
Part1:写在最前
在MySQL的error log中,我们会经常性看到一些各类的Aborted connection错误,本文中会针对这类错误进行一个初步分析,并了解一个问题产生后的基本排查思路和方法。掌握这种方法是至关重要的,而不是出现问题了,去猜,去试。数据库出现问题的时候需要DBA在短时间内快速解决问题,因此一个好与坏的DBA,区别也在于此。
Part2:种类
[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:警告这两个参数建议一起调节,能够避免一些坑。
本文的两个参数值采用的是默认值
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 会提升
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的哪个参数记载了这一问题
[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 记录了密码错误的这一问题
mysql>show global status like 'aborted%'; +------------------+-------+ |Variable_name | Value | +------------------+-------+ |Aborted_clients | 19 | |Aborted_connects | 5 | +------------------+-------+ 2 rows inset (0.00 sec)
error log中,也记载了这类密码输错的信息
[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秒
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参数控制的,已经连接上数据的连接被杀掉。
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中记载的是
[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
在这个案例中我们看下最大连接数对数据库连接的行为影响
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)
这里看到爆出了连接数过多的问题
[root@HE3~]# mysql -uroot -pMANAGER -h127.0.0.1 ERROR 1040 (HY000): Too many connections
而错误日志没有任何记录
Part7:案例4
第三方工具navicat select结果没有出来的时候选择停止则出现
clients上涨
mysql>show global status like 'aborted%'; +------------------+-------+ |Variable_name | Value | +------------------+-------+ |Aborted_clients | 28 | |Aborted_connects | 10 | +------------------+-------+ 2 rows in set (0.00 sec)
error log日志记录
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:原因总结
在MySQL中sleep状态数百秒的而且经常重复连接是应用程序在工作后没有关闭连接的症状之一,而是依靠数据库wait_timeout来关闭它们。强烈建议在操作结束时更改应用程序逻辑以正确关闭连接;
检查以确保max_allowed_packet的值足够高,并且客户端没有收到“数据包太大”消息。 这种情况他会中止连接,而不正确关闭它;
另一种可能性是TIME_WAIT。建议您确认连接被妥善管理并且是在应用端正常关闭;
确保事务正确提交(开始和提交),以便一旦应用程序“完成”连接,它将处于“clean”的状态;
您应该确保客户端应用程序不中止连接。 例如,如果PHP的选项max_execution_time设置为5秒,增加connect_timeout是没用的,因为PHP会杀死脚本。 其他编程语言和环境也有类似的选项;
连接延迟的另一个原因是DNS问题。 检查是否启用了skip-name-resolve,检查主机根据其IP地址而不是其主机名进行身份验证;
尝试增加MySQL的net_read_timeout和net_write_timeout值,看看是否减少了错误的数量。
——总结——
通过这4个案例,我们能够了解到,Aborted_clients、和Aborted_connects的区别,以及什么情况下会爆出什么样的错误日志,文章第二节中的几个Aborted错误是常见的错误,这类错误出现的时候脑海里要有一个理论知识,知道什么情况下,会出现什么样的错误,以便快速定位问题。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。
喜欢的读者可以点个赞来个关注,您的赞美和关注是对笔者继续发文的最大鼓励与支持!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
日订单超1000万,美团外卖是如何设计广告推送系统的?
在 2013 年,美团一直靠资本推动拉新,到 2015 年,为了达到收支平衡,美团开始考虑商业变现。从 2016 年初到 2017 年,美团针对商业变现做了两套广告系统,并上线投入使用。本文由美团外卖商业技术负责人王兴星与大家分享外卖业务合理变现系统的设计过程及相关经验。 美团的外卖业务特点 外卖与团购的区别 提到美团,大家接触更多的是团购,以下是外卖与团购两大业务之间的对比: 用户需求。团购的出发点是追求性价比,价格会便宜一些。而外卖,前期商家用第一单免费的方式吸引用户,后期在解决一部分用户刚需的同时更加方便快捷,所以用户的消费频次较高。 支付方式。两个都是线上支付,外卖业务平台也会有一部分,但流量不是很多。 就餐地点。就餐形式上团购需要到店消费,而外卖是需要把物品送到消费者手中,背后需要配送团队的支撑。 消费频率。两者差异比较大,团购消费时间集中在月底,而外卖的重度用户,一周点单可达到十次以上。 外卖业务的特点 除了以上这些对比,相对传统的互联网产品,外卖业务有移动化、场景化、本地化三大特点: 移动化。美团绝大部分订餐都是在移动端进行,日志采集相比 PC 端复杂很多。 场景化。用户...
- 下一篇
corosync+pacemaker+http高可用操作手记
前言: 因为公司大量用到了corosync+packmaker,本人之前只是了解,并没深入比较keepalive及heatbeatcorosync+packmaker的区别,原理方面不探讨,可以查看官网,或者查看网上资料。 这里仅仅分享一下自己做的一个小实验,算是基础入门。新公司东西比较多,因此最近博客更新会很慢,但是以后有时间分享的东西,则都是网上少见的,加上自己的经验之谈,热爱开源,热爱分享。 实验目的: 利corosync+packmaker,做到http高可用访问。当然可以结合drdb,nfs,MySQL等服务,玩出新花样。 实验规划: node1:httpd 192.168.179.129 业务地址 192.168.107.128 心跳地址 192.168.8.111 访问地址 node2 httpd 192.168.179.130 业务地址 192.168.107.129 心跳地址 192.168.8.112 node3 NFS-Server 192.168.179.131 业务地址 192.168.107.130 访问地址 fip(vip):192.168.8.140 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块