MySQL Aborted connection告警日志的分析
前言:
有时候,连接MySQL的会话经常会异常退出,错误日志里会看到"Gotanerrorreadingcommunicationpackets"类型的告警。本篇文章我们一起来讨论下该错误可能的原因以及如何来规避。
1.状态变量Aborted_clients和Aborted_connects
首先我们来了解下Aborted_clients和Aborted_connects这两个状态变量的含义,当出现会话异常退出时,这两个状态值会有变化。根据官方文档描述,总结如下:
造成Aborted_connects状态变量增加的可能原因:
- 客户端试图访问数据库,但没有数据库的权限。
- 客户端使用了错误的密码。
- 连接包不包含正确的信息。
- 获取一个连接包需要的时间超过connect_timeout秒。
造成Aborted_clients状态变量增加的可能原因:
- 程序退出前,客户机程序没有调用mysql_close()。
- 客户端睡眠时间超过了wait_timeout或interactive_timeout参数的秒数。
- 客户端程序在数据传输过程中突然终止。
简单来说即:数据库会话未能正常连接到数据库,会造成Aborted_connects变量增加。数据库会话已正常连接到数据库但未能正常退出,会造成Aborted_clients变量增加。
2.Gotanerrorreadingcommunicationpackets原因分析
哪种情况会导致errorlog中出现“Abortedconnectionxxxxtodb:'db'user:'dbuser'host:'hostname'(Gotanerrorreadingcommunicationpackets)”类似告警呢?下面我们根据上面可能的原因来做下具体测试。每次测试要注意状态变量Aborted_clients和Aborted_connects的变化及错误日志记录。
- 测试一:错误密码,错误用户
1.测试前查看状态变量值mysql>showglobalstatuslike'abort%';+------------------+-------+|Variable_name|Value|+------------------+-------+|Aborted_clients|0||Aborted_connects|0|+------------------+-------+ 2.测试过程#mysql-uroot-pwrongpassmysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:YES)#mysql-uroot1-pwrongpassmysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.ERROR1045(28000):Accessdeniedforuser'root1'@'localhost'(usingpassword:YES) 3.查看状态变化及错误日志mysql>showglobalstatuslike'abort%';+------------------+-------+|Variable_name|Value|+------------------+-------+|Aborted_clients|0||Aborted_connects|2|+------------------+-------+错误日志记录:2020-03-16T17:58:35.318819+08:006[Note]Accessdeniedforuser'root'@'localhost'(usingpassword:YES)2020-03-16T17:59:04.153753+08:007[Note]Accessdeniedforuser'root1'@'localhost'(usingpassword:YES) 结果:Aborted_connects有增加errorlog无Abortedconnection相关记录
- 测试二:睡眠时间超时或手动杀会话
1.测试前查看状态变量值mysql>showglobalstatuslike'abort%';+------------------+-------+|Variable_name|Value|+------------------+-------+|Aborted_clients|0||Aborted_connects|2|+------------------+-------+ 2.手动杀会话测试mysql>showprocesslist;+----+------+-----------+------+---------+------+----------+------------------+|Id|User|Host|db|Command|Time|State|Info|+----+------+-----------+------+---------+------+----------+------------------+|9|root|localhost|NULL|Query|0|starting|showprocesslist||10|root|localhost|NULL|Sleep|7||NULL|+----+------+-----------+------+---------+------+----------+------------------+2rowsinset(0.00sec)mysql>kill10;QueryOK,0rowsaffected(0.00sec) 3.查看状态变化及错误日志mysql>showglobalstatuslike'abort%';+------------------+-------+|Variable_name|Value|+------------------+-------+|Aborted_clients|1||Aborted_connects|2|+------------------+-------+ 结果:Aborted_clients有增加errorlog无记录,类似的,睡眠时间超时后Aborted_clients有增加errorlog中有Abortedconnection相关记录。
会话异常退出一般会造成Abortedconnection告警,即我们可以通过Aborted_clients状态变量的变化来反映出是否存在异常会话,那么出现“Gotanerrorreadingcommunicationpackets”类似告警的原因就很明了了,查询相关资料,总结出造成Abortedconnection告警的可能原因如下:
- 会话链接未正常关闭,程序没有调用mysql_close()。
- 睡眠时间超过wait_timeout或interactive_timeout参数的秒数。
- 查询数据包大小超过max_allowed_packet数值,造成链接中断。
- 其他网络或者硬件层面的问题。
3.问题避免与总结
其实Abortedconnection告警是很难避免的,errorlog里或多或少会有少量Abortedconnection信息,这种情况是可以忽略的,但是当你的errorlog里频繁出现Abortedconnection告警,这时候就应该注意了,可能会对业务产生较大的影响。下面列举出几点避免错误的建议,希望对你有所帮助。
- 建议业务操作结束后,应用程序逻辑会正确关闭连接,以短连接替代长连接。
- 检查以确保max_allowed_packet的值足够高,并且客户端没有收到“数据包太大”消息。
- 确保客户端应用程序不中止连接,例如,如果PHP设置了max_execution_time为5秒,增加connect_timeout并不会起到作用,因为PHP会kill脚本。其他程序语言和环境也有类似的安全选项。
- 确保事务提交(begin和commit)都正确提交以保证一旦应用程序完成以后留下的连接是处于干净的状态。
- 检查是否启用了skip-name-resolve,检查主机根据其IP地址而不是其主机名进行身份验证。
- 尝试增加MySQL的net_read_timeout和net_write_timeout值,看看是否减少了错误的数量。
以上就是MySQLAbortedconnection告警日志的分析的详细内容,更多关于MySQLAbortedconnection告警日志的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。