MySQL 常见错误之 Aborted connection xxx

报错示例

1
2
3
4
5
6
7
8
9
10
11
# MySQL 日志报错
2021-09-16T16:23:01.482696+08:00 369 [Note] Aborted connection 369 to db: 'vul_db' user: 'vul_user' host: '10.172.xx.xx' (Got timeout reading communication packets)

# SQLAlchemy 报错
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))")

# pymysql 报错
pymysql.err.OperationalError: (2006, "MySQL server has gone away (ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))")

# mysqlDB 报错
OperationalError: (_mysql_exceptions.OperationalError) (2006, 'MySQL server has gone away')

排错思路

如果出现连接问题,例如通信错误或连接中断,通常使用以下信息源来诊断问题

  • 错误日志。

    1
    2
    3
    4
    5
    # 临时生效,重启失效
    SET GLOBAL log_error = 'path_to_file'

    # 修改配置文件(通常路径为/etc/my.cnf),永久生效
    log_error = 'path_to_file'

    如果 log_error_verbosity 系统变量设置为 3,您可能会在错误日志中找到如下消息:

    1
    [Note] Aborted connection xxx to db: 'employees' user: 'josh'
  • 一般查询日志。

    1
    2
    3
    4
    5
    6
    7
    # 临时生效,重启失效
    SET GLOBAL general_log = 'ON';
    SET GLOBAL general_log_file = 'path_to_file';

    # 修改配置文件(通常路径为/etc/my.cnf),永久生效
    general_log = 'ON';
    general_log_file = 'path_to_file'
  • 状态变量。官方链接

    mysql> show status like '%Threads%';
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | Delayed_insert_threads | 0     |
    | Slow_launch_threads    | 0     |
    | Threads_cached         | 2     |
    | Threads_connected      | 7     |
    | Threads_created        | 105   |
    | Threads_running        | 1     |
    +------------------------+-------+
    6 rows in set (0.00 sec)
    
    
    mysql> show status like '%aborted%';
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | Aborted_clients  | 346   |
    | Aborted_connects | 0     |
    +------------------+-------+
    2 rows in set (0.01 sec)
    

如果客户端甚至无法连接,服务器会增加Aborted_connects状态变量。由于以下原因,可能会发生不成功的连接尝试:

  • 客户端尝试访问数据库但没有权限。

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

  • 连接数据包不包含正确的信息。

  • connect_timeout获取连接数据包需要几秒钟以上的时间。

如果发生此类事情,则可能表明有人试图闯入您的服务器!如果启用了通用查询日志,则会将此类问题的消息记录到其中。

如果客户端成功连接但后来不正确地断开连接或终止,则服务器增加 Aborted_clients状态变量,并将Aborted 连接消息记录到错误日志中。原因可能是以下任何一种:

  • mysql_close()客户端程序在退出前没有调用 。

  • 客户端在没有向服务器发出任何请求的情况下,时间超过 wait_timeoutinteractive_timeout 设置的值

    • wait_timeout
    • interactive_timeout
  • 客户端程序在数据传输过程中突然结束。

中止连接或中止客户端出现问题的其他原因:

  • max_allowed_packet 变量值太小或查询需要的内存比您为 mysqld 分配的更多。

  • 在 Linux 中使用以太网协议,半双工和全双工。一些 Linux 以太网驱动程序有这个错误。您应该通过在客户端和服务器机器之间使用 FTP 传输一个巨大的文件来测试这个错误。如果传输进入burst-pause-burst-pause 模式,您将遇到Linux 双工综合症。将网卡和集线器/交换机的双工模式切换为全双工或半双工,并测试结果以确定最佳设置。

  • 导致读取中断的线程库问题。

  • 配置错误的 TCP/IP,导致 TCP 连接被断开

  • 防火墙切断空闲的 TCP 连接

    • 一些防火墙有一个 TCP 超时时间(通常为半小时或几分钟),对于通过防火墙的所有 TCP 连接,如果在设定时间内没有任何活动,就会被防火墙拆除,这样就会导致连接中断。在拆除连接时,也不会向连接的两端发送任何数据来通知连接已经拆除。
  • 以太网、集线器、交换机、电缆等出现故障。只有更换硬件才能正确诊断。


MySQL 常见错误之 Aborted connection xxx
https://flepeng.github.io/041-MySQL-MySQL-常见错误之-Aborted-connection-xxx/
作者
Lepeng
发布于
2021年3月6日
许可协议