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

本文详细分析了MySQL中出现的各种Aborted连接错误,包括错误类型、相关参数如`wait_timeout`和`interactive_timeout`的解析,以及不同场景下的案例研究,如密码错误、超时和最大连接数限制等。通过案例,展示了如何理解和解决这些问题,以减少Aborted Clients和Aborted Connects的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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错误是常见的错误,这类错误出现的时候脑海里要有一个理论知识,知道什么情况下,会出现什么样的错误,以便快速定位问题。 由于

者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值