安卓查看程序异常退出日志_关于Aborted connection告警日志的分析

前言: 

有时候,连接MySQL的会话经常会异常退出,错误日志里会看到"Got an error reading communication packets"类型的告警。本篇文章我们一起来讨论下该错误可能的原因以及如何来规避。

1.状态变量Aborted_clients和Aborted_connects

首先我们来了解下Aborted_clients和Aborted_connects这两个状态变量的含义,当出现会话异常退出时,这两个状态值会有变化。根据官方文档描述,总结如下:

39907cc114247998cbfeba2a256554f4.png

造成Aborted_connects状态变量增加的可能原因:

  1. 客户端试图访问数据库,但没有数据库的权限。

  2. 客户端使用了错误的密码。

  3. 连接包不包含正确的信息。

  4. 获取一个连接包需要的时间超过connect_timeout秒。

1196bca0c39c32e798060a2f3f94c819.png

造成Aborted_clients状态变量增加的可能原因:

  1. 程序退出前,客户机程序没有调用mysql_close()。

  2. 客户端睡眠时间超过了wait_timeout或interactive_timeout参数的秒数。

  3. 客户端程序在数据传输过程中突然终止。

简单来说即:数据库会话未能正常连接到数据库,会造成Aborted_connects变量增加。数据库会话已正常连接到数据库但未能正常退出,会造成Aborted_clients变量增加。

2.Got an error reading communication packets原因分析

哪种情况会导致error log中出现“Aborted connection xxxx to db: 'db' user: 'dbuser' host: 'hostname' (Got an error reading communication packets)”类似告警呢?下面我们根据上面可能的原因来做下具体测试。每次测试要注意状态变量Aborted_clients和Aborted_connects的变化及错误日志记录。

  • 测试一:错误密码,错误用户

1.测试前查看状态变量值mysql> show global status like 'abort%';+------------------+-------+| Variable_name    | Value |+------------------+-------+| Aborted_clients  | 0     || Aborted_connects | 0     |+------------------+-------+2.测试过程# mysql -uroot -pwrongpassmysql: [Warning] Using a password on the command line interface can be insecure.ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)# mysql -uroot1 -pwrongpassmysql: [Warning] Using a password on the command line interface can be insecure.ERROR 1045 (28000): Access denied for user 'root1'@'localhost' (using password: YES)3.查看状态变化及错误日志mysql> show global status like 'abort%';+------------------+-------+| Variable_name    | Value |+------------------+-------+| Aborted_clients  | 0     || Aborted_connects | 2     |+------------------+-------+错误日志记录:2020-03-16T17:58:35.318819+08:00 6 [Note] Access denied for user 'root'@'localhost' (using password: YES)2020-03-16T17:59:04.153753+08:00 7 [Note] Access denied for user 'root1'@'localhost' (using password: YES)结果:Aborted_connects有增加 error log无Aborted connection相关记录
  • 测试二:睡眠时间超时或手动杀会话

1.测试前查看状态变量值mysql> show global status like 'abort%';+------------------+-------+| Variable_name    | Value |+------------------+-------+| Aborted_clients  | 0     || Aborted_connects | 2     |+------------------+-------+2.手动杀会话测试mysql> show processlist;+----+------+-----------+------+---------+------+----------+------------------+| Id | User | Host      | db   | Command | Time | State    | Info             |+----+------+-----------+------+---------+------+----------+------------------+|  9 | root | localhost | NULL | Query   |    0 | starting | show processlist || 10 | root | localhost | NULL | Sleep   |    7 |          | NULL             |+----+------+-----------+------+---------+------+----------+------------------+2 rows in set (0.00 sec)mysql> kill 10;Query OK, 0 rows affected (0.00 sec)3.查看状态变化及错误日志mysql> show global status like 'abort%';+------------------+-------+| Variable_name    | Value |+------------------+-------+| Aborted_clients  | 1     || Aborted_connects | 2     |+------------------+-------+结果:Aborted_clients有增加 error log无记录 ,类似的,睡眠时间超时后Aborted_clients有增加 error log中有Aborted connection相关记录。

会话异常退出一般会造成Aborted connection告警,即我们可以通过Aborted_clients状态变量的变化来反映出是否存在异常会话,那么出现“Got an error reading communication packets” 类似告警的原因就很明了了,查询相关资料,总结出造成Aborted connection告警的可能原因如下:

  1. 会话链接未正常关闭,程序没有调用mysql_close()。

  2. 睡眠时间超过wait_timeout或interactive_timeout参数的秒数。

  3. 查询数据包大小超过max_allowed_packet数值,造成链接中断。

  4. 其他网络或者硬件层面的问题。

3.问题避免与总结

其实Aborted connection告警是很难避免的,error log里或多或少会有少量Aborted connection信息,这种情况是可以忽略的,但是当你的error log里频繁出现Aborted connection告警,这时候就应该注意了,可能会对业务产生较大的影响。下面列举出几点避免错误的建议,希望对你有所帮助。

  1. 建议业务操作结束后,应用程序逻辑会正确关闭连接,以短连接替代长连接。

  2. 检查以确保max_allowed_packet的值足够高,并且客户端没有收到“数据包太大”消息。

  3. 确保客户端应用程序不中止连接,例如,如果PHP设置了max_execution_time为5秒,增加connect_timeout并不会起到作用,因为PHP会kill脚本。其他程序语言和环境也有类似的安全选项。

  4. 确保事务提交(begin和commit)都正确提交以保证一旦应用程序完成以后留下的连接是处于干净的状态。

  5. 检查是否启用了skip-name-resolve,检查主机根据其IP地址而不是其主机名进行身份验证。

  6. 尝试增加MySQL的net_read_timeout和net_write_timeout值,看看是否减少了错误的数量。

参考: 

  • https://dev.mysql.com/doc/refman/5.7/en/communication-errors.html

PS:最近有很多小伙伴私信我咨询相关问题,由于时间问题未能及时回复,在这里说声抱歉。我一个人的力量是有限的,近期打算创建微信群供大家一起交流,有意向的小伙伴可以扫一扫下方二维码加我微信,后续统一邀请大家入群。加微信请备注“加群”,非诚勿扰,谢谢配合,后续我会继续更新干货文章!

dee8cd9b4309b11c399c893a81ab904c.png


推荐阅读

(点击标题可跳转阅读)

MySQL DDL详情揭露

时间戳,这样用就对了

在线修改主从复制选项

— END —

如果你喜欢我的文章

请在文末右下角点一下在看

b5053e82646c47dc9940c4c2b360cc50.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值