暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ProxySQL “大变语句”

AustinDatabases 2019-09-29
1805


事情前几天有一个顾问(也可以叫项目经理),在测试库上执行了一条她认为OK 的语句,她的目的是删除表中的数据,而她忘记了测试数据库中的表的量在2千2百万。然后就发生了一些不大让人愿意回忆的事情。MYSQL 的DBER们都懂,并且还KILL 了语句,然后数据库又开始回滚。


为了避免这样的事情发生,以及数据库的安全,想到了PROXYSQL 的SQL 语句重写功能。

1 我没法杜绝不懂MYSQL的人去使用它 

2 我也没法事后说点什么,忍受是人生的一种“享受”


如何想辙呗!!  解决的方法就是语句转换,或禁止他


PROXYSQL 的语句转换功能主要是由match + replace 的方式进行的。以下内容需要你懂得PROXYSQL ,如果你还不懂什么是PROXYSQL,可以翻看我之前的文章,应该是几个月前的。

 我们来一个实例来说清这个问题

举例我们有一个数据库test 里面有一个表t1 而这个表经常被人select * from t1; 这样操作,说了多少遍了,不能 select * 去操作,还有人select * from t1; 我们就的想法来让他无法做到这样查询。


一般来说如果没有中间件,要想控制用户输入无聊的语句,是很困难的,这里我们下面说用proxysql 来prohibition那些无聊的语句。


我们进入proxysql 并且直接输入如下语句

INSERT INTO mysql_query_rules (rule_id, active, match_pattern, error_msg, apply) VALUES (2,1,'^SELECT \* from t1$','Query not allowed',1);


LOAD MYSQL QUERY RULES TO RUNTIME;


SAVE MYSQL QUERY RULES TO DISK;


然后我们对比一下之前和之后的效果;

这样就杜绝了,某些人士不合时宜的访问数据库的行为,当然如果是危险的操作,我们也可以禁止,例如delete from test.t1; delete from t1; 这样的操作。


我们做下面的操作

INSERT INTO mysql_query_rules (rule_id, active, match_pattern, error_msg, apply) VALUES (3,1,'^DELETE FROM t1$','Query not allowed',1);


LOAD MYSQL QUERY RULES TO RUNTIME;


SAVE MYSQL QUERY RULES TO DISK;

我们可以看到相关的查询,凡是和我们预先设置的都被禁止了,但有漏网之鱼,还是把数据表给删除了。这就需要在设置规则的时候,尽量将一些可以进行同样操作的但不一样的语句都进行规则化。


当然如果强制让客户的语句报错,对于运维可能会产生新的问题,就是会有人投诉。那如果在这样的环境我们可以使用另一种方式,Query Rewrite

这种方式是使用匹配+替换的模式来对语句进行处理,而不是抛出一个错误。


我们在做下面一个测试


INSERT INTO mysql_query_rules (rule_id, active, match_pattern,replace_pattern, apply) VALUES (4,1,'^DELETE FROM t1$','select * from test.t1',1);


还是对原来的Delete 语句进行转换,将DELETE 语句转换为 select 语句。

下面就开始给客户变魔术了。




如果这样来处理某些大表防止误操作是很不错的选择,如果有人问你我命名是delete操作怎么变成了select 操作,那就的去好好盘问他了。


当然 PROXYSQL 的功能还很多,今天speacking的也不够,不过今天到此为止,休息休息一下。

最后修改时间:2019-11-22 16:59:57
文章转载自AustinDatabases,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论