MySQL升级8.4重启后Host blocked问题的解决

背景

旧的数据库服务器是CentOS 7.9,已经停止维护更新,当初划分磁盘空间也不够,导致经常存储空间紧张,需要手动清理。
安装新的linux,并把mysql从8.0升级到了8.4。

问题

之前配置每天凌晨备份完数据库,会重启服务器,应用服务会自动重连。升级到8.4就会出现错误:
Host ‘192.168.0.1’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’

解决方案

初版

网上的解决方案

1、配置max_connect_errors,试了配置10000;没有效果,不再尝试;
2、mysql进入sql界面,执行sql: flush hosts;报错1064,查看8.4文档flush命令已经不再支持hosts参数;
3、mysqladmin命令行,执行: mysqladmin -u root -p flush-hosts;可行,但需要人工每天手动执行;

终版

仔细阅读官方文档(参考网址3)部分的说明"To flush the host cache, use any of these methods:",主要就是三种方案:
1、通过提供 SUPER 权限,你可以更改 host_cache_size 系统变量的值。
2、通过赋予 DROP 权限,截断host_cache 表。你可以使用 TRUNCATE TABLE 语句来完成。
3、使用 mysqladmin -u username -p password flush-hosts; 清除 host_cache 表。

根据以上方案,考虑从2入手,走ETL方式。

参考网址

<think> 我们正在解决的是MySQL连接时出现的“Host is blocked because of many connection errors”错误。根据引用内容,这个错误通常是因为同一个IP在短时间内产生了太多中断的数据库连接(超过了max_connection_errors设置的值)而导致的。 解决步骤: 1. 临时解决方法(快速解除阻塞): 使用`mysqladmin flush-hosts`命令或者登录MySQL后执行`FLUSH HOSTS;`命令来清除主机缓存和错误计数。 但是需要注意,这只能暂时解决问题,如果错误连接继续产生,问题会再次出现。 2. 永久解决方法(调整配置): 增加MySQL的`max_connect_errors`参数的值,这样同一个IP需要产生更多的错误连接才会被阻塞。 修改配置文件(通常是my.cnf或my.ini),在[mysqld]部分添加或修改: max_connect_errors = 100000 然后重启MySQL服务使配置生效。 3. 查找并解决错误连接的根源: - 检查错误日志(error.log)确定是哪些IP被阻塞以及原因(如引用[2]所述)。 - 检查应用程序的连接配置,确保连接池设置合理,避免频繁建立和断开连接。 - 检查网络问题,确保客户端与MySQL服务器之间的网络稳定。 4. 对于Docker环境(如引用[4]): - 进入MySQL容器内部执行`mysqladmin flush-hosts`或者登录MySQL执行`FLUSH HOSTS;`。 - 同样建议修改配置文件并重启容器。 详细步骤如下: ### 临时解决方法:清除阻塞 方法1:使用mysqladmin命令(需要在服务器上执行) ```bash mysqladmin flush-hosts -u root -p ``` 输入密码后即可清除阻塞。 方法2:登录MySQL后执行SQL命令 ```sql FLUSH HOSTS; ``` ### 永久解决方法:调整max_connect_errors 1. 编辑MySQL配置文件: ```bash # 例如,在Linux上 sudo vi /etc/my.cnf ``` 在[mysqld]部分添加(或修改): ``` [mysqld] max_connect_errors=100000 ``` 2. 重启MySQL服务: ```bash # 根据系统不同,重启命令可能不同 sudo systemctl restart mysql ``` 3. 验证设置是否生效: 登录MySQL,执行: ```sql SHOW VARIABLES LIKE 'max_connect_errors'; ``` 应该会显示新设置的值。 ### 检查错误日志 查看MySQL错误日志,找到被阻塞的IP和具体错误信息,以便进一步排查问题。错误日志的位置可以通过以下SQL查询: ```sql SHOW VARIABLES LIKE 'log_error'; ``` ### 预防措施 - 优化应用程序的连接管理,使用连接池避免频繁建立连接。 - 确保网络稳定,减少连接中断。 - 定期监控MySQL的`max_connect_errors`状态和错误日志。 注意:在Docker环境中,修改配置文件后需要重启容器。 示例步骤(Docker): 1. 修改配置文件:将配置文件挂载到容器中,修改宿主机上的配置文件,然后重启容器。 2. 或者进入容器修改配置文件并重启MySQL服务(不推荐,因为容器重启后修改会丢失,建议使用挂载卷)。 如果上述方法仍不能解决问题,可能需要进一步检查网络或应用程序代码。 §§相关问题§§ 1. 如何查看MySQL的当前连接错误计数? 2. 如何调整MySQL的最大连接错误数(max_connect_errors)? 3. 在Docker中运行MySQL时如何避免主机被阻塞的情况? </think> ### 解决 MySQL "Host is blocked because of many connection errors" 错误的方法 该错误表明某个客户端 IP 地址因**短时间内过多失败的连接尝试**被 MySQL 服务器阻止访问。以下是逐步解决方案: #### 🔒 1. 临时解决方案:解除主机阻塞 ```sql FLUSH HOSTS; -- 在 MySQL 内执行清除主机错误计数[^5] ``` 或使用命令行工具: ```bash mysqladmin flush-hosts -u root -p # 需要管理员权限[^1][^3] ``` #### ⚙ 2. 永久解决方案:调整配置参数 1. **修改配置文件**(需重启 MySQL): ```ini [mysqld] max_connect_errors = 100000 -- 将默认值(100)提高[^5] ``` 2. **动态修改**(无需重启): ```sql SET GLOBAL max_connect_errors = 100000; -- 临时生效[^5] ``` #### 🔍 3. 诊断问题根源 1. 检查错误日志: ```sql SHOW VARIABLES LIKE 'log_error'; ``` 在日志中查找类似警告: ```log [Warning] Host 'xxx.xxx.xxx.xxx' is blocked... [^2] ``` 2. 查看当前阻塞列表: ```sql SELECT * FROM performance_schema.host_cache; ``` #### 🐳 Docker 环境特殊处理 ```bash docker exec -it mysql-container mysql -uroot -p -e "FLUSH HOSTS;" [^4] ``` #### 🛡 预防措施 1. **优化客户端连接配置**: - 应用程序使用连接池 - 增加连接超时时间 2. **网络层面检查**: - 确保客户端与服务器间网络稳定 - 排查防火墙或代理中断问题 3. **监控设置**: ```sql SHOW GLOBAL STATUS LIKE 'Connection_errors%'; ``` > **关键原理**:当某 IP 的连接错误次数超过 `max_connect_errors`(默认 100),MySQL 会自动阻塞该主机。`FLUSH HOSTS` 会重置错误计数器[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值