Mysql使用定时器自动执行FLUSH HOSTS处理
公司的开发环境数据库有很多开发人员使用,主要是开发人员分散在各地,在外地的开发人员使用的时候经常出现如下错误:
Host is blocked because of many connection errors;unblock with mysqladmin flush-hosts
原因:
同一个ip在短时间内产生太多(超过mysql数据库max_connection_errors的最大值)中断的数据库连接而导致的阻塞
FLUSH HOSTS;
我已经把max_connect_errors设置为2000了,但是还是很快就超过最大值,一天要处理很多次才行
实在不堪其扰了,只能设置定时器定时执行FLUSH HOSTS;才行了
设置定时器注意事项:
mysql版本是从5.1开始才支持event的。如果版本太低就升级数据库版本。
下面语句我操作时都是在mysql库中执行的,我的mysql数据库版本是:5.7.17
第一步:先执行
show VARIABLES LIKE %event_scheduler%;
如果event_scheduler的值是OFF或者0或者DISABLED的,执行如下SQL打开event功能开关
SET GLOBAL event_scheduler = 1;
更新后效果如下:
上面命令为临时开启(mysql服务重启后之后失效)
永久开启
在my.cnf中的[mysqld]部分添加如下内容,然后重启mysql event_scheduler=ON
第二步:创建存储过程:
delimiter// drop procedure if exists flush_hosts_proce// create procedure flush_hosts_proce() begin FLUSH HOSTS; end// delimiter;
第三步:创建事件定时器(每隔120秒调用一次flush_hosts_proce存储过程,执行定时器的间隔时间根据自己的需求进行设置):
drop event if exists flush_hosts_event; create event flush_hosts_event on schedule every 120 second on completion preserve disable do call flush_hosts_proce();
第四步:开启事件flush_hosts_event
alter event flush_hosts_event on completion preserve enable;
下面验证定时器的执行状态:
select * from performance_schema.host_cache;
如下图:
时间到定时器执行后:
查看库中的事件:
select * from mysql.event;
关闭事件(定时器)flush_hosts_event:
alter event flush_hosts_event on completion preserve disable;
如果本文有什么错误的地方烦请指出,谢谢!
如果有问题可以留言,希望本文可以帮助有需要的人。