当程序存在异常、SQL效率大幅降低等状况出现时,可能致使对后端数据库不堪重负,此时须要快速终止会话,保护后端数据库能提供正常的服务。mysql
在该环节中,能够定位出“客户端IP”、“异常SQL”、“使用的数据库用户名”、“访问的Schema”等信息,以上信息越多,越能准确地终止异常会话。git
注意:对于当前大部分的应用程序而言,均设置了数据库重连的功能,这意味这若是只是单纯地终止会话,每每难以起到应有的效果。所以比较好的作法是在终止前,先设置异常会话黑名单,自动的阻止异常请求的进入。如下各小节则介绍了常见的黑名单设置方法。github
注意:因为路由规则根据
rule_id
顺序应用的,所以能够预留前100个ID用于作异常会话的黑名单。
此时,该IP应用发起请求时,将报错ERROR 1148 (42000): Blocking Error Connection
。正则表达式
假设异常的请求来源于11.25.151.20这个IP,则登陆ProxySQL管理端后,对黑名单设置的步骤及操做过程以下。sql
Admin> insert into mysql_query_rules(rule_id,active,client_addr,error_msg,apply) values (1,1,'11.25.151.20','Blocking Error Connection', 1); --将内存暂存配置加载为运行配置(不须要将配置存至disk) Admin> load mysql query rules to runtime;
假设异常的请求来源于11.25.151.20这个IP,异常请求为INSERT
,则登陆ProxySQL管理端后,对黑名单设置的步骤及操做过程以下。数据库
Admin> insert into mysql_query_rules(rule_id,active,client_addr,match_digest,error_msg,apply) values (1,1,'11.25.151.20','^INSERT*','Blocking Error Connection', 1); --将内存暂存配置加载为运行配置(不须要将配置存至disk) Admin> load mysql query rules to runtime;
^INSERT*
为正则表达式,表明以INSERT
开头的任意SQL语句。后端
在ProxySQL环境下,终止会话使用KILL CONNECTION+[session_id]
的语法。session
[session_id]
即为stats_mysql_processlist.SessionID
字段。app
例如,要批量终止test_user用户的会话,则可按以下语句拼接出终止会话的SQL。code
Admin> SELECT 'KILL CONNECTION '||SessionID||';', cli_host, srv_host, command FROM stats_mysql_processlist WHERE user='test_user';