waiting in connection_control plugin
一、现象 应用程序连接mysql数据库报错,帐号无法连接, show processlist查看mysql进程, show plugins查看mysql数据的插件
二、原因 connection_control 插件,主要用来控制客户端在登录操作连续失败一定次数后的响应的延迟。那就是当客户端连接数据库连续失败到达一定次数后,服务端会进行一段时间的响应延迟,连续失败尝试的次数越多,响应延迟时间越长。 该插件可有效的防止客户端暴力登录的风险。该插件包含以下两个组件: CONNECTION_CONTROL:用来控制登录失败的次数及延迟响应时间。 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS:将登录失败的操作记录至 information
三、connection_control插件介绍 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [mysqld] plugin-load-add=connection_control.so connection-control=FORCE_PLUS_PERMANENT connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT connection_control_failed_connections_threshold=5 connection_control_max_connection_delay=2147483647 connection_control_min_connection_delay=1500 配置说明: plugin-load-add=connection_control.so#插件预加载 connection-control=FORCE_PLUS_PERMANENT#强制打开插件 connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT#强制打开插件 以下3个参数均可以利用 set global 的方式在线修改 connection_control_failed_connections_threshold=5 #允许帐户进行的连续失败尝试的次数。默认为3,表示当连接失败3次后启用连接控制,0表示不开启 connection_control_max_connection_delay=2147483647 #超出阈值的连接失败的最大延迟(以毫秒为单位),默认 2147483647 毫秒,约25天 connection_control_min_connection_delay=1500 #超过阈值的连接失败的最小延迟(以毫秒为单位),默认 1000 毫秒,即 1 秒 show plugins; show variables like "connection_control%"; 查看失败记录 SELECT * FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS; 正常情况下,输错密码是即刻返回错误的,当连续失败次数达到阈值后,再次进行连接尝试,则会延迟响应,具体表现就是一直卡着,到延迟结束后才返回错误。information_schema 系统库中的表会记录登录失败的用户名及失败次数,当延迟发生时,从 processlist 中也可以查到正在延迟的 连接。若输入密码正确,则会取消延迟、重新计数。 尝试3次错误输入密码后,在第4次登录时会delay 1秒(由connection_control_min_connection_delay指定),同时Connection_control_delay_generated计数+1(若登录密码继续输入错误,则delay秒数与计数器继续增加。直到成功登录为止之后,此时 delay清零,但计数器不清零。需要注意的是,即使后续密码正确,依然要先延迟一定的秒数,才会进入账号校验流程) 这里注意的是delay的值并不是说每次都是1500毫秒,而是以(当前失败总次数-失败阈值)*1500,所以假如当前设定为上,当我失败登陆第6次时,我的等待时间不是1.5秒而是3秒,还有就是想不让尝试登陆超过一次,可以把阈值改为0。
四、解决方法 1 2 3 4 5 6 7 8 9 10 11 12 13 1.使用kill 杀掉连接的id ,应用会一直连接,这种方法不行 select ID from information_schema.PROCESSLIST where Command='Connect' and STATE='Waiting in connection_control plugin' ;select * from information_schema.processlist where state='waiting in connection_control plugin"; select * from information_schema.PROCESSLIST where USER=' mpi'; 2.排查应用连接的账号密码,更改正确,然后重启数据库,重启应用 重启服务,重启服务后会刷新CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS表下账号的对应失败登录错误次数 命令修改参数: SET GLOBAL connection_control.failed_login_threshold = 100; 3.将插件取消使用,不建议