绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
ProxySQL “大变语句”
2019-07-09 17:45:39


事情前几天有一个顾问(也可以叫项目经理),在测试库上执行了一条她认为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的也不够,不过今天到此为止,休息休息一下。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

数据库杂货铺
创建时间:2021-12-10 09:57:47
分享数据库管理,运维,源代码 ,业界感受, 吐槽
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • liuaustin
    栈主

小栈成员

查看更多
  • miemieMIA
  • 578154454
  • ylfxml
戳我,来吐槽~