MySQL 排错 - blocked because of many connection errors

文章目录

    • 说明
    • 1. host_cache
    • 2. 问题复现
      • 2.1 未调用 close()
      • 2.2 MySQL 协议握手错误
    • 3. 解决方法

说明

前几天收到了研发同学反馈,测试环境的数据库出现了无法连接的情况,并附上了报错,本篇文章分析该异常的原因。

ERROR 1129 (HY000): Host ‘xxxxxx’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’

1. host_cache

首先,需要介绍一下 host_cache 表,它记录了 MySQL 服务器缓存的连接信息,常用于排查连接错误的问题。

select * from performance_schema.host_cache;

比如常见的用户登陆密码错误:

# 用 Python 代码模拟 1000 次,密码错误登陆
import pymysqldef mysql_coon(query_text: str):with pymysql.connect(host='172.16.104.56',port=3306,user='bing',password='abc23', # 错误的密码charset='utf8',database='information_schema',) as cursor:cursor.execute(query_text)content = cursor.fetchall()return contentfor i in range(1000):try:mysql_coon('select 1')except Exception as info:print(info)

得到的结果:

+----------------+---------------+----------------+-----------------------------+
| IP             | HOST          | HOST_VALIDATED | COUNT_AUTHENTICATION_ERRORS |
+----------------+---------------+----------------+-----------------------------+
| 192.168.115.44 | NULL          | YES            |                        1000 |
+----------------+---------------+----------------+-----------------------------+

可以看到 COUNT_AUTHENTICATION_ERRORS 字段的值等于 1000,表示该地址发起了 1000 次权限验证错误连接。

2. 问题复现

分析该异常,需要先让问题复现,本小节介绍如何模拟复现。

2.1 未调用 close()

研发在提出问题前,自己也分析了错误日志,发现有很多如下的报错,不知是否与 blocked because of many connection errors 有关联。

[Note] Aborted connection 3642 to db: 'information_schema' user: 'bing' host: '192.168.115.44' (Got an error reading communication packets)
[Note] Aborted connection 3643 to db: 'information_schema' user: 'bing' host: '192.168.115.44' (Got an error reading communication packets)
[Note] Aborted connection 3644 to db: 'information_schema' user: 'bing' host: '192.168.115.44' (Got an error reading communication packets)

经过测试,该异常与 blocked because of many connection errors 无关,出现的原因是客户端没有正确的关闭连接,比如使用代码连接数据库,没有主动调用 close() 方法。

import pymysqldef mysql_coon(query_text: str):with pymysql.connect(host='172.16.104.56',port=3306,user='bing',password='abc123',charset='utf8',database='information_schema',) as cursor:cursor.execute(query_text)content = cursor.fetchall()# 这行注释掉和不注释掉,都试试看# cursor.close()return contentfor i in range(1000):try:mysql_coon('select 1')except Exception as info:print(info)

上面提供了一个 Demo,感兴趣的朋友可以试试看,把 cursor.close() 注释打开和注释状态下都试试,观察 tail -f 错误日志。

2.2 MySQL 协议握手错误

刚开始在网上查该问题,发现大多数都说是如果短时间内连接错误数量大于 max_connect_errors 参数的值,就会抛出异常。

ERROR 1129 (HY000): Host ‘xxxxxx’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’

通过上方代码,模拟了用户登陆错误,执行 SQL 错误,均未触发该异常,随后在官方文档中 host_cache Table 介绍中,提到了一个 SUM_CONNECT_ERRORS 字段。

SUM_CONNECT_ERRORS 表示被 “阻塞” 的连接错误数量,仅对协议握手错误进行计数,并且仅针对通过验证 ( HOST_VALIDATED = YES) 的主机。一旦 SUM_CONNECT_ERRORS 给定主机达到的值 max_connect_errors,来自该主机的新连接将被阻止。

推荐阅读:25.12.16.1 The host_cache Table

从文档描述中,了解到这里的错误指的是协议握手错误。接下来进行模拟,首先将 max_connect_errors 调整为 2。

set global max_connect_errors = 2;

使用 telnet 命令,对数据库端口进行探测。

# 第一次探测
telnet 172.16.104.56 3306# 第二次探测
telnet 172.16.104.56 3306

此时,查看 host_cache 表中的 SUM_CONNECT_ERRORS 等于 2 达到了 max_connect_errors 上限。

>>>select IP,SUM_CONNECT_ERRORS from host_cache;
+----------------+--------------------+
| IP             | SUM_CONNECT_ERRORS |
+----------------+--------------------+
| 172.16.104.57  |                  2 |
+----------------+--------------------+

尝试发起连接,错误得到复现。

[root@172-16-104-57 ~]# mysql -h172.16.104.56 -ubing -pabc123
ERROR 1129 (HY000): Host '172.16.104.57' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

上面使用 telnet 来模拟协议握手失败的例子,由于 telnet 只是发送了 TCP 的握手包,并不会发送 MySQL 登录认证包,服务器端等待 10 秒(mysql 的 connect_timeout=10)就关闭了连接,造成 MySQL 协议握手失败。

3. 解决方法

临时解决方法是使用 flush hosts 命令,重新加载一次 host_cache 表,异常计数会被清空,就暂时不会出现报错了。也可以调大 max_connect_errors 参数,建议最大值为 1000。

set global max_connect_errors = 1000;

上面介绍的是临时解决方法,实际遇到此类异常时,建议先查 host_cache 表,找到发起 MySQL 协议握手失败的程序,定位问题的根源,才能彻底解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/737841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘Google Gemini:AI界的多模态革命者与ChatGPT-4的较量

在人工智能的快速发展浪潮中,Google DeepMind的最新力作——Gemini,以其多模态的超凡能力,正引领着AI技术的新一轮革命。本文将深入探讨Gemini的核心特性、不同版本的特点,以及它与ChatGPT-4的对比优势和差异。 一、Gemini简介 A…

Java SE入门及基础(35)

接口 1. 概念 在软件工程中,软件与软件的交互很重要,这就需要一个约定。每个程序员都应该能够编写实现这样的约定。接口就是对约定的描述。 In the Java programming language, an interface is a reference type, similar to a class, that can con…

float32 float16 bfloat16 推理训练GPU速度和内存调研

概念: 参考:Accelerating Large Language Models with Mixed-Precision Techniques - Lightning AI 3种数量类型表示的数据范围不一样,以float32为例其中有1个符号位,8位表示指数,23位表示尾数 标准训练推理是用的fl…

团体程序设计天梯赛 L2-013 红色警报(连通分量)

L2-013 红色警报 分数 25 战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域&#xff0c…

eclipse maven 项目导入报错

错误:Internal compiler error: java.lang.NullPointerException at org.eclipse.jdt.internal.compiler.apt.dispatch.AnnotationDiscoveryVisitor 环境:eclipse Kepler Service Release 2 ,JDK1.7 解决办法:编码不对,修改

前端自带的base64转化方法

前端html的base64使用方法window.btoa()和window.atob()_html用window.btoa();-CSDN博客

ubuntu20.04缺少libssl.so.1.0.0的解决方法

Index of /ubuntu/pool/main/o/openssl 使用一下下载命令,注意如果提示安装包不存在,可以从上述链接中找到合适的安装包,下载安装 wget http://security.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.0.0_1.0.2g-1ubuntu4.20_amd64.debsu…

指令调用模板

也就是这边指令通过id和map会定位到一个结构体,然后这个结构再赋值两个成员,一个是函数一个是指令类型,然后这个函数是模板的实例化 使用的时候就传进去,这只是参数,最开始初始化的时候模板就已经实例化了。然后关于模…

为什么美国硅谷作为服务器托管的首选地?

在数字化时代,服务器托管已成为企业运营不可或缺的一部分。而美国硅谷作为全球科技创新的摇篮,其服务器托管服务备受全球企业青睐。那么,为什么众多企业选择美国硅谷作为服务器托管的首选地呢? 硅谷拥有得天独厚的地理位置和网络基础设施。硅…

[HackMyVM]Quick 2

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

若依框架的使用

文章目录 1,前端2,后端3,数据库4,测试 1,前端 2,后端 3,数据库 4,测试

Vision Transformers的注意力层概念解释和代码实现

2017年推出《Attention is All You Need》以来,transformers 已经成为自然语言处理(NLP)的最新技术。2021年,《An Image is Worth 16x16 Words》,成功地将transformers 用于计算机视觉任务。从那时起,许多基于transformers的计算机…

刘敏:楼氏动铁和麦克风助力听力健康技术发展 | 演讲嘉宾公布

一、助辅听器材Ⅱ专题论坛 助辅听器材Ⅱ专题论坛将于3月28日同期举办! 听力贯穿人的一生,听觉在生命的各个阶段都是至关重要的功能,听力问题一旦出现,会严重影响生活质量。助辅听器材能有效提高生活品质。在这里,我们将…

Redis哨兵模式(Sentinel)的搭建与配置

创建三个Redis实例所需的目录,生产环境需独立部署在不同主机上,提高稳定性。 Redis 哨兵模式(Sentinel)是一个自动监控处理 redis 间故障节点转移工作的一个redis服务端实例,它不提供数据存储服务,只进行普通 redis 节点监控管理,使用redis哨兵模式可以实现redis服务端故…

八、软考-系统架构设计师笔记-系统质量属性和架构评估

1、软件系统质量属性 软件架构的定义 软件架构是指在一定的设计原则基础上,从不同角度对组成系统的各部分进行搭配和安排,形成系统的多个结构而组成架构,它包括该系统的各个构件,构件的外部可见属性及构件之间的相互关系。 软件架…

STM32串口:DMA空闲中断实现接收不定长数据(基于HAL库)

STM32串口:DMA空闲中断实现接收不定长数据(基于HAL库): 第一步:设置rcc,时钟频率,下载方式 设置system core->RCC如图所示:(即High Speed Clock和Low Speed Clock都选…

ansible基础与基础命令模块

一Ansible 1. ansible 的概念 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能批量配置、部署、…

什么是RESTful API? 详解@ResponseBody @RequestBosy @PathVariable@RestController

什么是RESTful API? RESTful API 是一种遵循 REST(Representational State Transfer,表现层状态转移)架构风格的网络 API 设计。它强调资源的定位和操作,通常使用 HTTP 协议的标准方法,如 GET、POST、PUT、DELETE 等…

手机群控软件开发必备源代码分享!

随着移动互联网的飞速发展,手机群控技术在市场推广、自动化测试、应用管理等领域的应用越来越广泛,手机群控软件作为一种能够同时控制多台手机设备的工具,其开发过程中,源代码的编写显得尤为重要。 1、设备连接与识别模块 设备连…

RGMII 接口调试

目录 硬件检查 软件检查 调试步骤 硬件检查 硬件工程师检查原理图和PCB,核查RGMII线路连接是否正确,PHY的 TX连接对端 RX,PHY的RX连接对端TX,原理图上以引脚序号引脚名 引脚类型(输入还是输出)逐一核查RGMII接口各个网络&#…