公司的开发环境数据库有很多开发人员使用,主要是开发人员分散在各地,在外地的开发人员使用的时候经常出现如下错误:
Host is blocked because of many connection errors;unblock with 'mysqladmin flush-hosts'
原因:
同一个ip在短时间内产生太多(超过mysql数据库max_connection_errors的最大值)中断的数据库连接而导致的阻塞,一遇到这个问题就要联系我去处理,我只能在数据库中执行如下SQL清除
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;