CREATE-SQL-BLOCK-RULE
Name
CREATE SQL BLOCK RULE
Description
该语句创建SQL阻止规则,该功能仅用于限制查询语句,不会限制explian语句的执行。
支持按用户配置SQL黑名单:
- 通过正则匹配的方式拒绝指定SQL
- 通过设置partition_num, tablet_num, cardinality, 检查一个查询是否达到其中一个限制
- partition_num, tablet_num, cardinality 可以一起设置,一旦一个查询达到其中一个限制,查询将会被拦截
语法:
1. CREATE SQL_BLOCK_RULE rule_name
2. [PROPERTIES ("key"="value", ...)];
参数说明:
- sql:匹配规则(基于正则匹配,特殊字符需要转译,如
select *使用select \\*),可选,默认值为 “NULL”, 最后不要带分号 - sqlHash: sql hash值,用于完全匹配,我们会在
fe.audit.log打印这个值,可选,这个参数和sql只能二选一,默认值为 “NULL” - partition_num: 一个扫描节点会扫描的最大partition数量,默认值为0L
- tablet_num: 一个扫描节点会扫描的最大tablet数量,默认值为0L
- cardinality: 一个扫描节点粗略的扫描行数,默认值为0L
- global:是否全局(所有用户)生效,默认为false
- enable:是否开启阻止规则,默认为true
Example
- 创建一个名称为 test_rule 的阻止规则
1. CREATE SQL_BLOCK_RULE test_rule
2. PROPERTIES(
3. "sql"="select \\* from order_analysis;",
4. "global"="false",
5. "enable"="true"
6. );
1. 当我们去执行刚才我们定义在规则里的sql时就会返回异常错误,示例如下:
3. ```sql
4. mysql> select * from order_analysis;
5. ERROR 1064 (HY000): errCode = 2, detailMessage = sql match regex sql block rule: order_analysis_rule
2. 2. 创建 test\_rule2,将最大扫描的分区数量限制在30个,最大扫描基数限制在100亿行,示例如下:
1. CREATE SQL_BLOCK_RULE test_rule2
2. PROPERTIES
3. (
4. "partition_num" = "30",
5. "cardinality" = "10000000000",
6. "global" = "false",
7. "enable" = "true"
8. );
9. Query OK, 0 rows affected (0.01 sec)
10. ```
- 创建包含特殊字符的 SQL BLOCK RULE:
1. CREATE SQL_BLOCK_RULE test_rule3
2. PROPERTIES
3. (
4. "sql" = "select count\\(1\\) from db1.tbl1"
5. );
6. CREATE SQL_BLOCK_RULE test_rule4
7. PROPERTIES
8. (
9. "sql" = "select \\* from db1.tbl1"
10. );
Keywords
1. CREATE, SQL_BLCOK_RULE
