当前位置: 首页 > 科技观察

MySQL麻烦的Aborted报警案例分析

时间:2023-03-14 09:32:01 科技观察

实用Part1:在MySQL的错误日志中,我们经常会看到一些Aborted连接错误。本文将对此类错误进行初步分析,了解出现问题后的基本排查思路和方法。掌握这个方法很关键,不要走错,要猜,要试。当数据库出现问题时,DBA需要在短时间内快速解决问题,所以好与不好的DBA的区别就在于此。Part2:种类[Warning]Abortedconnection305628todb:'db'user:'dbuser'host:'hostname'(Gotanerrorreadingcommunicationpackets)[Warning]Abortedconnection81todb:'unconnected'user:'root'host:'127.0.0.1'(Gottimeoutreadingcommunicationpackets)[Warning]Abortedconnection109todb:'helei1'user:'sys_admin'host:'192.168.1.1'(??Gotanerrorwritingcommunicationpackets)[Warning]Accessdeniedforuser'root'@'127.0.0.1'(usingpassword:YES)[Warning]GotanerrorwritingcommunicationpacketsPart3:重点参数分析wait_timeout命令行格式--wait-timeout=#系统变量名wait_timeout变量范围全局,会话动态变量是允许值(Windows)类型integer默认28800最小值1最大值2147483允许值(其他)类型整数默认值28800最小值1最大值31536000该参数是指服务器在数据库系统关闭之前等待非交互式连接上的活动的秒数。interactive_timeout命令行格式--interactive-timeout=#系统变量名interactive_timeout变量作用域全局,会话动态变量是允许值类型整数默认28800最小值1该参数是指服务器在关闭前等待活动的秒数交互连接Warning:Warning建议将这两个参数一起调整,避免一些陷阱。本文两个参数值使用默认值mysql>showglobalvariableslike'%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|315♂00||net_read_timeout|30||net_write_timeout|60||slave_net_timeout|3600||wait_timeout|28800|+----------------------------+----------+10rowsinset(0.01sec)另外,在数据库中,我们重点关注这两个参数,看看什么情况下Aborted_clients会增加,什么情况下Aborted_connects会增加mysql>showglobalstatuslike'aborted%';+----------------+--------+|Variable_name|Value|+------------------+------+|Aborted_clients|19||Aborted_connects|0|+----------------+--------+2rowsinset(0.00sec)Part4:案例一,我故意输错密码5次,看是哪个参数数据库错误日志的er和Aborted记录了这个问题[root@HE3~]#mysql-uroot-pwrongpass-h127.0.0.1ERROR1045(28000):Accessdeniedforuser'root'@'127.0.0.1'(usingpassword:是的)[root@HE3~]#mysql-uroot-pwrongpass-h127.0.0.1ERROR1045(28000):Accessdeniedforuser'root'@'127.0.0.1'(usingpassword:YES)[root@HE3~]#mysql-uroot-pwrongpass-h127.0.0.1ERROR1045(28000):Accessdeniedforuser'root'@'127.0.0.1'(usingpassword:YES)[root@HE3~]#mysql-uroot-pwrongpass-h127.0.0.1ERROR1045(28000):Accessdeniedforuser'root'@'127.0.0.1'(usingpassword:YES)[root@HE3~]#mysql-uroot-pwrongpass-h127.0.0.1ERROR1045(28000):Accessdeniedforuser'root'@'127.0.0.1'(usingpassword:YES)可以看出这里的Aborted_connects记录了密码错误一题mysql>showglobalstatuslike'aborted%';+----------------+------+|Variable_name|Value|+----------------+--------+|Aborted_clients|19||Aborted_connects|5|+----------------+-------+2rowsinset(0.00sec)errorlog也记录了此类密码错误的信息[Warning]Accessdeniedforuser'root'@'127.0.0.1'(usingpassword:YES)[Warning]Accessdeniedforuser'root'@'127.0.0.1'(使用密码:是)[警告]拒绝用户'root'@'127.0.0.1'(使用密码:是)[Warning]拒绝用户'root'@'127.0.0.1'的访问(使用密码:YES)[Warning]Accessdeniedforuser'root'@'127.0.0.1'(usingpassword:YES)Part5:Case2接下来我们看一下文章第三节提到的两个关键参数对行为的影响数据库连接。这里我们将两个参数都配置为10秒mysql>setglobalwait_timeout=10;QueryOK,0rowsaffected(0.00sec)mysql>setglobalinteractive_timeout=10;QueryOK,0rowsaffected(0.00sec)mysql>showprocesslist;ERROR2006(HY000):MySQLserverhasgoneawayNoconnection。正在尝试重新连接...Connectionid:79Currentdatabase:***NONE***+----+-----+----------------+------+---------+------+--------+----------------+|Id|用户|主机|db|命令|时间|状态|信息|+----+-----+----------------+------+--------+--------+--------+----------------+|79|root|127.0.0.1:42016|NULL|Query|0|NULL|showprocesslist|+----+-----+----------------+-----+--------+-----+--------+----------------+1rowinset(0.00sec)下面是三个操作,可以看到clients的数量增加了。这是由于timeout参数的控制,已经连接数据的连接被kill掉了。mysql>showglobalstatuslike'aborted%';ERROR2006(HY000):MySQLserverhasgoneawayNoconnection.Tryingtoreconnect...Connectionid:81Currentdatabase:***NONE***+------------------+------+|Variable_name|Value|+----------------+------+|Aborted_clients|22||Aborted_connects|5|+----------------+--------+2rowsinset(0.01sec)错误日志记录[Warning]Abortedconnection81todb:'unconnected'user:'root'host:'127.0.0.1'(Gottimeoutreadingcommunicationpackets)[警告]Abortedconnection78todb:'unconnected'user:'root'host:'127.0.0.1'(Gottimeoutreadingcommunicationpackets)[警告]Abortedconnection79todb:'unconnected'user:'root'host:'127.0.0.1'(Gottimeoutreadingcommunicationpackets)Part6:Case3在本例中,让我们看看***连接数如何影响数据库连接的行为mysql>showglobalvariableslike'max_conn%';+--------------------+--------+|变量名|值|+----------------+-------+|max_connect_errors|1000||max_connections|1024|+--------------------+--------+2rowsinset(0.00sec)mysql>setglobalmax_connections=2;QueryOK,0rowsaffected(0.00sec)这里看到连接过多的问题[root@HE3~]#mysql-uroot-pMANAGER-h127.0.0.1ERROR1040(HY000):Toomanyconnections错误日志Part7中没有记录:案例4,当第三方工具navicatselect结果出不来时,选择停止,客户端会上升。mysql>showglobalstatuslike'aborted%';+----------------+-------+|Variable_name|Value|+------------------+--------+|Aborted_clients|28||Aborted_connects|10|+----------------+-------+2rowsinset(0.00sec)errorloglogging17062616:26:56[Warning]Abortedconnection109todb:'helei1'user:'sys_admin'host:'192.168.1.1'(??Gotanerrorwritingcommunicationpackets)Part8:原因总结在MySQL中,睡眠状态数百秒和频繁重复连接是应用程序下班后不关闭连接的症状之一,而是依赖数据库wait_timeout关闭他们强烈建议更改应用程序逻辑以在结束时正确关闭连接操作;检查以确保max_allowed_pa??cket的值足够高,并且客户端没有收到“数据包太大”消息。在这种情况下,他会在不正确关闭连接的情况下中止连接;另一种可能性是TIME_WAIT。建议您在应用端确认连接被妥善管理并优雅关闭;确保事务被正确提交(启动和??提交),以便一旦应用程序“完成”连接,它将处于“干净”状态;您应该确保客户端应用程序的连接没有中止。例如,如果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错误是常见的错误,出现这种错误的时候,脑子里一定要有理论知识,知道什么情况下会出现什么样的错误,这样才能快速定位问题.由于作者水平有限,写作时间仓促,文章中难免存在一些错误或不准确的地方。不当之处敬请广大读者批评指正。