MySQL运维实战之ProxySQL(9.6)SQL黑名单
利用mysql_query_rules表中的error_msg字段,可以实现SQL黑名单的功能。如果规则设置了error_msg,当SQL语句匹配这条规则时,proxysql会直接将error_msg的内容返回给客户端。
当遇到一些大查询严重影响数据库性能时,可以使用proxysql规则临时屏蔽这些SQL。
查询stats_mysql_query_digest
可以先从stats_mysql_query_digest查询需要屏蔽的SQL,这里我们选择按查询的digest精确屏蔽某一类SQL:
mysql> select * from stats.stats_mysql_query_digest limit 1\G *************************** 1. row *************************** hostgroup: 101 schemaname: information_schema username: user1 client_address: digest: 0x7ae1f8f3a35c883d digest_text: select * from information_schema.tables as t limit ? count_star: 1 first_seen: 1690941618 last_seen: 1690941618 sum_time: 2822 min_time: 2822 max_time: 2822 sum_rows_affected: 0 sum_rows_sent: 1
配置屏蔽规则
我们选择按查询的digest来屏蔽,往mysql_query_rules写入如下规则:
insert into mysql_query_rules (rule_id, username, digest, error_msg, active, apply, comment ) values (10, 'user1', '0xa6843869f14d13ce', 'request denied by rule' ,1,1, 'request denied by rule'); load mysql query rules to runtime; save mysql query rules to disk;
需要注意,屏蔽规则的rule_id需要比其它规则的rule_id小,proxysql是按rule_id的顺序依次判断是否匹配规则。
测试屏蔽效果
使用digest,屏蔽的是一类SQL,如果SQL只是传入的参数有差异,则SQL的digest一样,那么也会匹配该规则:
mysql> select * from information_schema.tables limit 1; ERROR 1148 (42000): request denied by rule mysql> select * from information_schema.tables limit 2; ERROR 1148 (42000): request denied by rule