メインコンテンツまでスキップ

Blacklist

ブラックリストの管理

一部の場合では、管理者はクラスタのクラッシュや予期せぬ高並行クエリの発生を避けるために、特定のSQLのパターンを無効にする必要があります。

StarRocksでは、ユーザーがSQLのブラックリストを追加、表示、削除することができます。

構文

enable_sql_blacklisttrueに設定することでSQLのブラックリストが有効になります。デフォルトはFalse(無効)です。

admin set frontend config ("enable_sql_blacklist" = "true")

ADMIN_PRIV権限を持つadminユーザーは、次のコマンドを実行することでブラックリストを管理できます:

ADD SQLBLACKLIST #sql# 
DELETE SQLBLACKLIST #sql#
SHOW SQLBLACKLISTS
  • enable_sql_blacklisttrueの場合、すべてのSQLクエリはsqlblacklistによってフィルタリングされる必要があります。マッチする場合、ユーザーはそのSQLがブラックリストにあることを知らされます。それ以外の場合、SQLは通常通り実行されます。SQLがブラックリストにある場合、次のようなメッセージが表示される場合があります:

ERROR 1064 (HY000): Access denied; sql 'select count (*) from test_all_type_select_2556' is in blacklist

ブラックリストの追加

ADD SQLBLACKLIST #sql#

**#sql#**は特定のタイプのSQLに対する正規表現です。SQL自体は、正規表現の意味と混同される可能性がある共通の文字 ()*.を含んでいるため、それらを区別するためにエスケープ文字を使用する必要があります。()はSQLで頻繁に使用されるため、エスケープ文字を使用する必要はありません。その他の特殊文字は、エスケープ文字 \ を接頭辞として使用する必要があります。例:

  • count(\*)を禁止する場合:
ADD SQLBLACKLIST "select count(\\*) from .+"
  • count(distinct)を禁止する場合:
ADD SQLBLACKLIST "select count(distinct .+) from .+"
  • order by limit xy1 <= x <=75 <=y <=7を禁止する場合:
ADD SQLBLACKLIST "select id_int from test_all_type_select1 order by id_int limit [1-7], [5-7]"
  • 複雑なSQLを禁止する場合:
ADD SQLBLACKLIST "select id_int \\* 4, id_tinyint, id_varchar from test_all_type_nullable except select id_int, id_tinyint, id_varchar from test_basic except select (id_int \\* 9 \\- 8) \\/ 2, id_tinyint, id_varchar from test_all_type_nullable2 except select id_int, id_tinyint, id_varchar from test_basic_nullable"

ブラックリストの表示

SHOW SQLBLACKLIST

結果の形式:Index | Forbidden SQL

例:

mysql> show sqlblacklist;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Index | Forbidden SQL |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | select count\(\*\) from .+ |
| 2 | select id_int \* 4, id_tinyint, id_varchar from test_all_type_nullable except select id_int, id_tinyint, id_varchar from test_basic except select \(id_int \* 9 \- 8\) \/ 2, id_tinyint, id_varchar from test_all_type_nullable2 except select id_int, id_tinyint, id_varchar from test_basic_nullable |
| 3 | select id_int from test_all_type_select1 order by id_int limit [1-7], [5-7] |
| 4 | select count\(distinct .+\) from .+ |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Forbidden SQLに表示されるSQLは、すべてのSQLの意味的な文字がエスケープされています。

ブラックリストの削除

DELETE SQLBLACKLIST #indexlist#

例えば、上記のブラックリストからsqlblacklist 3と4を削除する場合:

delete sqlblacklist  3, 4;   -- #indexlist#はカンマ(,)で区切られたIDのリストです。

その後、残りのsqlblacklistは以下の通りです:

mysql> show sqlblacklist;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Index | Forbidden SQL |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | select count\(\*\) from .+ |
| 2 | select id_int \* 4, id_tinyint, id_varchar from test_all_type_nullable except select id_int, id_tinyint, id_varchar from test_basic except select \(id_int \* 9 \- 8\) \/ 2, id_tinyint, id_varchar from test_all_type_nullable2 except select id_int, id_tinyint, id_varchar from test_basic_nullable |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+