このトピックでは、 が提供する SQL ブロッキング機能を使用して SQL クエリを管理する方法について説明します。 ApsaraDB for SelectDB
概要
本番環境では、DELETE ステートメントやリスクの高い SQL ステートメントなどをブロックするなど、実行できる SQL ステートメントを制限する必要がある場合があります。このようなシナリオの要件を満たすために、ApsaraDB for SelectDB は SQL ブロッキング機能を提供します。 ApsaraDB for SelectDB で実行する SQL ステートメントが SQL ブロッキングルールと一致する場合、ApsaraDB for SelectDB は SQL ステートメントの実行を阻止し、エラーメッセージを返します。
SQL ブロッキングルールの作成
DDL ステートメントと DML ステートメントを含むすべての SQL ステートメントを制限する SQL ブロッキングルールを作成できます。データベースアカウントに基づいて SQL ブラックリストを設定することもできます。
次のいずれかの方法を使用して、SQL ブロッキングルールを設定できます。
正規表現を使用して、指定された SQL クエリを照合して拒否します。
クエリが partition_num、tablet_num、および cardinality パラメーターで指定されたしきい値のいずれかに達しているかどうかを確認します。これらのパラメーターを使用して、同時にしきい値を指定できます。クエリがしきい値のいずれかに達すると、クエリはブロックされます。
構文
CREATE SQL_BLOCK_RULE rule_name
[PROPERTIES ("key"="value", ...)];
パラメーター
パラメーター | 必須 | 説明 |
rule_name | はい | SQL ブロッキングルール名。 |
PROPERTIES | はい | SQL ブロッキングルールのプロパティ。詳細については、次の表を参照してください。 |
次の表は、PROPERTIES パラメーターで指定できる一般的なパラメーターについて説明しています。
パラメーター | 必須 | 説明 |
sql | いいえ | 正規表現を使用して指定された一致ルール。特殊文字はエスケープする必要があります。たとえば、 |
sqlHash | いいえ | 完全一致に使用される SQL ハッシュ値。デフォルト値: NULL。このパラメーターの値は |
partition_num | いいえ | スキャンノードでスキャンできるパーティションの最大数。デフォルト値: 0L(制限なし)。 |
tablet_num | いいえ | スキャンノードでスキャンできるタブレットの最大数。デフォルト値: 0L(制限なし)。 |
cardinality | いいえ | スキャンノードによって概算でスキャンされる行数。デフォルト値: 0L(制限なし)。 |
global | いいえ | すべてのデータベースアカウントに対してルールを有効にするかどうかを指定します。デフォルト値: false。 |
enable | いいえ | SQL ブロッキングルールを有効にするかどうかを指定します。デフォルト値: true。 |
例
test_rule という名前の SQL ブロッキングルールを作成します。サンプルコード:
CREATE SQL_BLOCK_RULE test_rule PROPERTIES( "sql"="select \\* from order_analysis", "global"="false", "enable"="true", "sqlHash"="" )
実行しようとする SQL クエリが上記の SQL ブロッキングルールと一致する場合、次のエラーメッセージが返されます:
SELECT * FROM order_analysis; ERROR 1064 (HY000): errCode = 2, detailMessage = sql match regex sql block rule: order_analysis_rule
test_rule2 という名前の SQL ブロッキングルールを作成します。 partition_num パラメーターを 30 に、cardinality パラメーターを 10000000000 に設定します。サンプルコード:
CREATE SQL_BLOCK_RULE test_rule2 PROPERTIES ( "partition_num" = "30", "cardinality" = "10000000000", "global" = "false", "enable" = "true" ); Query OK, 0 rows affected (0.01 sec)
特殊文字を含む SQL ブロッキングルールを作成します。
(
と)
は正規表現の特殊文字であり、エスケープする必要があります。CREATE SQL_BLOCK_RULE test_rule3 PROPERTIES ( "sql" = "select count\\(1\\) from test_db.test_table" ); CREATE SQL_BLOCK_RULE test_rule4 PROPERTIES ( "sql" = "select \\* from db1.tbl1" );
SQL ブロッキングルールのクエリクエリルール
設定済みの SQL ブロッキングルールをクエリできます。クエリする SQL ブロッキングルール名を指定しない場合は、すべての SQL ブロッキングルールがクエリされます。
構文
SHOW SQL_BLOCK_RULE [FOR RULE_NAME];
パラメーター
パラメーター | 必須 | 説明 |
rule_name | いいえ | SQL ブロッキングルール名。 |
例
すべての SQL ブロッキングルールをクエリします。サンプルコード:
SHOW SQL_BLOCK_RULE; +------------+------------------------+---------+--------------+-----------+-------------+--------+--------+ | Name | Sql | SqlHash | PartitionNum | TabletNum | Cardinality | Global | Enable | +------------+------------------------+---------+--------------+-----------+-------------+--------+--------+ | test_rule | select * from order_analysis | NULL | 0 | 0 | 0 | true | true | | test_rule2 | NULL | NULL | 30 | 0 | 10000000000 | false | true | +------------+------------------------+---------+--------------+-----------+-------------+--------+--------+ 2 rows in set (0.01 sec)
指定された SQL ブロッキングルールをクエリします。サンプルコード:
SHOW SQL_BLOCK_RULE FOR test_rule2; +------------+------+---------+--------------+-----------+-------------+--------+--------+ | Name | Sql | SqlHash | PartitionNum | TabletNum | Cardinality | Global | Enable | +------------+------+---------+--------------+-----------+-------------+--------+--------+ | test_rule2 | NULL | NULL | 30 | 0 | 10000000000 | false | true | +------------+------+---------+--------------+-----------+-------------+--------+--------+ 1 row in set (0.00 sec)
SQL ブロッキングルールの変更変更するルール
SQL ブロッキングルールのパラメーターはすべて変更できます。
構文
ALTER SQL_BLOCK_RULE rule_name
[PROPERTIES ("key"="value", ...)];
パラメーター
パラメーター | 必須 | 説明 |
rule_name | はい | SQL ブロッキングルール名。 |
PROPERTIES | いいえ | SQL ブロッキングルールのプロパティ。詳細については、このトピックのSQL ブロッキングルールの作成セクションを参照してください。 |
例
SQL ブロッキングルールの PROPERTIES パラメーターを変更します。サンプルコード:
ALTER SQL_BLOCK_RULE test_rule PROPERTIES("sql"="select \\* from test_table","enable"="true")
SQL ブロッキングルールに partition_num パラメーターが指定されている場合、sql パラメーターまたは sqlHash パラメーターを変更することはできません。サンプルコード:
ALTER SQL_BLOCK_RULE test_rule2 PROPERTIES("partition_num" = "10","tablet_num"="300","enable"="true")
SQL ブロッキングルールの削除削除ルール
一度に 1 つ以上の SQL ブロッキングルールを削除できます。
構文
DROP SQL_BLOCK_RULE test_rule1,...
パラメーター
パラメーター | 必須 | 説明 |
test_rule1 | はい | SQL ブロッキングルール名。複数のルール名を指定できます。ルール名はカンマ(,)で区切ります。 |
例
test_rule1 と test_rule2 という名前の SQL ブロッキングルールを削除します。サンプルコード:
DROP SQL_BLOCK_RULE test_rule1,test_rule2;
Query OK, 0 rows affected (0.00 sec)
特定のデータベースアカウントに 1 つ以上の SQL ブロッキングルールを関連付ける特定のデータベースアカウントに1つ以上のSQLブロックルールを関連付ける
特定のデータベースアカウントに 1 つ以上の SQL ブロッキングルールを設定する場合、ルールの global
パラメーターを false に設定します。次に、次のステートメントを実行して、1 つ以上の SQL ブロッキングルールをデータベースアカウントに関連付けます。複数の SQL ブロッキングルール名はカンマ(,
)で区切ります。
SET PROPERTY [FOR 'jack'] 'sql_block_rules' = 'test_rule1,test_rule2';