すべてのプロダクト
Search
ドキュメントセンター

PolarDB:同時実行制御

最終更新日:Apr 21, 2026

同時実行制御 (CCL) は、Alibaba Cloud が提供する機能で、トラフィックの急増やリソース消費の激しい SQL ステートメントの実行、アクセスモデルの変更が発生した場合でも、ご利用の PolarDB クラスターの安定した運用を保証します。CCL は SQL ステートメントに基づいたルールを使用し、DBMS_CCL ツールキットで管理できます。

前提条件

ご利用の PolarDB クラスターは、次のいずれかのバージョンである必要があります。

  • PolarDB for MySQL 8.0。

  • PolarDB for MySQL 5.7 (マイナーエンジンバージョン 5.7.1.0.6 以降)。

    説明

    ご利用のクラスターが PolarDB for MySQL 5.7 (マイナーエンジンバージョン 5.7.1.0.27 以降) の場合、CCL はスレッドプールと互換性があります。

  • PolarDB for MySQL 5.6。

注意事項

CCL ルールはプライマリノードでのみ変更してください。変更は他のノードに自動的に同期されます。

特徴量の設計

ディメンション特徴量

CCL は 5 つのディメンション特徴量を定義します。SQL ステートメントは、これらの特徴量に基づいて CCL ルールと照合されます。

ディメンション

説明

TYPE

SQL ステートメントのタイプ (SELECT、UPDATE、INSERT、DELETE、DDL など)。

SCHEMA

SQL 操作が実行されるデータベースの名前。

TABLE

SQL 操作が実行されるテーブルまたはビューの名前。

KEYWORD

SQL ステートメント内のキーワード。1 つの CCL ルールに複数のキーワードを設定できます。複数のキーワードはセミコロン (;) で区切ります。

DIGEST

SQL ステートメントから生成されたハッシュ文字列。詳細については、「STATEMENT_DIGEST()」をご参照ください。

SQL ステートメントと CCL ルールの照合方法

  • CCL ルールの DIGEST 値が空の場合、照合方法は次のとおりです。

    • DIGEST 値が空で、TYPE、SCHEMA、TABLE の値が空でない場合、SQL ステートメントの TYPE、SCHEMA、TABLE がすべて CCL ルールの対応する値と一致する場合にのみルールが有効になります。

    • DIGEST 値が空で、SCHEMA と TABLE の値が空、TYPE の値が空でない場合、SQL ステートメントの TYPE が CCL ルールの TYPE と一致する場合にのみルールが有効になります。

    説明

    CCL ルールの KEYWORD 値が空でない場合、キーワードもチェックされます。

    • CCL ルールに 1 つのキーワードが設定されている場合、SQL ステートメントにそのキーワードが含まれていれば照合は成功します。

    • CCL ルールに複数のキーワードが設定されている場合、SQL ステートメントに設定されたすべてのキーワードが含まれている場合にのみ照合は成功します。SQL ステートメント内のキーワードの順序は問いません。

  • CCL ルールの DIGEST 値が空でない場合、SQL ステートメントの SCHEMA と DIGEST 値の両方が CCL ルールの対応する値と一致する場合にのみルールが有効になります。

  • CCL ルールの SCHEMA 値が空の場合、SQL ステートメントの DIGEST 値が CCL ルールの DIGEST 値と一致すればルールが有効になります。

SQL ステートメントと CCL ルールの照合順序

1 つの SQL ステートメントは 1 つの CCL ルールにのみ一致します。ステートメントが複数のルールに一致する場合、最も優先度の高いルールが使用されます。優先度は次の順序で決定されます。複数のルールが同じ優先度を持つ場合、ID の小さい方のルールが使用されます。

  1. DIGEST 値による照合。

  2. TYPE、SCHEMA、TABLE による照合。

  3. TYPE のみによる照合。

パラメーター

PolarDB コンソールで次のパラメーターを変更できます。詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。

パラメーター

説明

loose_ccl_mode

同時実行数制限を超えた場合の SQL ステートメントの動作。有効値:

  • WAIT (デフォルト):ステートメントはキューに追加されます。他の SQL ステートメントが終了するのを待ってから実行されます。

  • REFUSE:エラーが報告されます。

説明

このパラメーターは PolarDB for MySQL 8.0 でのみサポートされています。バージョン 5.6 および 5.7 では、ステートメントは直接キューに追加されます。

loose_ccl_max_waiting_count

loose_ccl_mode パラメーターが WAIT に設定されている場合、これは単一の CCL ルールに対してキューに追加できる SQL ステートメントの最大数です。この数を超えると、エラーが報告されます。

有効値の範囲:0~65536。デフォルト値:0。

説明

このパラメーターは PolarDB for MySQL 5.7 および 8.0 でのみサポートされています。

CCL ルールテーブル

PolarDBconcurrency_control という名前のシステムテーブルを使用して CCL ルールを格納します。このテーブルは起動時に自動的に作成されるため、手動で作成する必要はありません。このシステムテーブルの CREATE ステートメントは次のとおりです。

CREATE TABLE concurrency_control (
  Id bigint AUTO_INCREMENT NOT NULL,
  Type varchar(64),
  Schema_name varchar(64),
  Table_name varchar(64),
  Concurrency_count bigint NOT NULL,
  Keywords text,
  State enum('N','Y') COLLATE utf8_general_ci DEFAULT 'Y' NOT NULL,
  Ordered enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
  Digest varchar(64),
  Digest_text longtext,
  Extra mediumtext,
  PRIMARY KEY Rule_id(id)
) Engine=InnoDB STATS_PERSISTENT=0 CHARACTER SET utf8 COLLATE utf8_bin
  comment='Concurrency control' TABLESPACE=mysql;

パラメーターは次の表で説明します。

パラメーター

説明

Id

CCL ルールの ID。

Type

SQL ステートメントのタイプ (SELECT、UPDATE、INSERT、DELETE、DDL など)。

Schema_name

データベース名。

Table_name

データベース内のテーブル名。

Concurrency_count

同時実行数制限。

説明

Concurrency_count を 0 に設定して SQL ブラックリストを実装できます。これにより、このタイプのクエリの実行が禁止されます。

Keywords

キーワード。複数のキーワードはセミコロン (;) で区切ります。

State

ルールが有効かどうかを示します。有効値:

  • Y (デフォルト):ルールは有効です。

  • N:ルールは無効です。

Ordered

Keywords に複数のキーワードが設定されている場合、このパラメーターはそれらを順序通りに照合する必要があるかどうかを指定します。有効値:

  • N (デフォルト):Keywords に複数のキーワードが設定されている場合、それらを順序通りに照合する必要はありません。

  • YKeywords に複数のキーワードが設定されている場合、それらを順序通りに照合する必要があります。

Digest

Digest_text から生成された 64 バイトのハッシュ文字列。詳細については、「STATEMENT_DIGEST()」をご参照ください。

Digest_text

SQL ステートメントの特徴

Extra

その他の情報。

CCL ルールの管理

CCL ルールの管理を支援するために、PolarDBDBMS_CCL に次の 6 つのローカルストアドプロシージャを提供します。

  • add_ccl_rule:TYPE、SCHEMA、TABLE、KEYWORD で照合する CCL ルールを追加します。

    構文

    dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');

    • SELECT タイプの CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 10, '');
    • キーワード `key1` を含む SELECT ステートメントの CCL ルールを追加します。同時実行数が 20 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');
    • キーワード `key1`、`key2`、`key3` を含む SELECT ステートメントの CCL ルールを追加します。キーワードの順序は問いません。同時実行数が 20 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1;key2;key3');
    • test スキーマの t テーブルに対する SELECT ステートメントの CCL ルールを追加します。SELECT ステートメントの同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。

      CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 10, '');
  • add_ccl_digest_rule:DIGEST 値で照合する CCL ルールを追加します。

    説明

    add_ccl_digest_rule ストアドプロシージャは、次のデータベースエンジンバージョンでのみサポートされています。

    • PolarDB for MySQL 8.0.1 (マイナーエンジンバージョン 8.0.1.1.31 以降)。

    • PolarDB for MySQL 8.0.2 (マイナーエンジンバージョン 8.0.2.2.12 以降)。

    構文

    dbms_ccl.add_ccl_digest_rule('<Schema_name>', '<Query>', <Concurrency_count>);

    • SQL ステートメント SELECT * FROM t1 に一致する CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。

      CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1", 10);
    • test スキーマの SQL ステートメント SELECT * FROM t1 に一致する CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。

      CALL dbms_ccl.add_ccl_digest_rule("test", "SELECT * FROM t1", 10);
    • SQL ステートメント SELECT * FROM t1 WHERE col1=1 に一致する CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。

      CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1 WHERE col1 = 1", 10);
      説明

      SQL ステートメントに定数が含まれている場合、定数値が異なっていても照合できます。たとえば、上記の CCL ルールは SQL ステートメント SELECT * FROM t1 WHERE col1 = 2 にも一致します。

  • add_ccl_digest_rule_by_hash:DIGEST 値で照合する CCL ルールを追加します。このプロシージャは、SQL ステートメントの代わりに、事前に計算された DIGEST 値を使用します。

    説明

    add_ccl_digest_rule_by_hash ストアドプロシージャは、PolarDB for MySQL 8.0.1 (マイナーエンジンバージョン 8.0.1.1.31 以降) でのみサポートされています。

    構文

    dbms_ccl.add_ccl_digest_rule_by_hash('<Schema_name>', '<Digest>', <Concurrency_count>);

    • DIGEST 値 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a に一致する CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。

      CALL dbms_ccl.add_ccl_digest_rule_by_hash('', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);

      533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a は、SELECT * FROM t1 に対して計算された DIGEST 値です。この値は、SELECT statement_digest("SELECT * FROM t1") コマンドを実行して計算するか、他のモジュールから取得できます。

    • test スキーマに対して、DIGEST 値 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a に一致する CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。

      CALL dbms_ccl.add_ccl_digest_rule_by_hash('test', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);
  • del_ccl_rule:CCL ルールを削除します。

    構文

    dbms_ccl.del_ccl_rule(<Id>);

    ID 15 の CCL ルールを削除します。

    CALL dbms_ccl.del_ccl_rule(15);

    削除したいルールが存在しない場合、システムは警告を報告します。SHOW WARNINGS; コマンドを実行して警告の詳細を表示できます。以下に例を示します。

    1. ID 100 の CCL ルールを削除します。

      CALL dbms_ccl.del_ccl_rule(100);

      出力は次のとおりです。

      Query OK, 0 rows affected, 2 warnings (0.00 sec)
    2. 次のコマンドを実行して警告の詳細を表示します。

      SHOW WARNINGS;

      出力は次のとおりです。

      +---------+------+----------------------------------------------------+
      | Level   | Code | Message                                            |
      +---------+------+----------------------------------------------------+
      | Warning | 7517 | Concurrency control rule 100 is not found in table |
      | Warning | 7517 | Concurrency control rule 100 is not found in cache |
      +---------+------+----------------------------------------------------+
    説明

    たとえば、PolarDB for MySQL 8.0 の コード7517PolarDB for MySQL 5.7 の コード3267PolarDB for MySQL 5.6 の コード3045 です。

  • show_ccl_rule:メモリ内で有効になっている CCL ルールを表示します。

    構文

    dbms_ccl.show_ccl_rule();

    CALL dbms_ccl.show_ccl_rule();

    出力は次のとおりです。

    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
    | ID   | TYPE   | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING  | KEYWORDS |
    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
    |   17 | SELECT | test   | t     | Y     | N     |                30 |       0 |       0 |        0 |          |
    |   16 | SELECT |        |       | Y     | N     |                20 |       0 |       0 |        0 | key1     |
    |   18 | SELECT |        |       | Y     | N     |                10 |       0 |       0 |        0 |          |
    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+​
    説明

    MATCHEDRUNNINGWAITING パラメーターは次のように説明されます。

    • MATCHED:ルールが正常に照合された回数。

    • RUNNING:このルールで同時に実行されているスレッドの数。

    • WAITING:このルールで実行を待機しているスレッドの数。

  • UPDATE ステートメントを使用して CCL ルールの ID を変更し、その優先度を調整できます。

    構文

    UPDATE mysql.concurrency_control SET ID = xx WHERE ID = xx;

    1. 次のコマンドを実行して、メモリ内で有効になっている CCL ルールを表示します。

      CALL dbms_ccl.show_ccl_rule();

      出力は次のとおりです。

      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      | ID   | TYPE   | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS |
      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      |   17 | SELECT | test   | t     | Y     | N     |                30 |       0 |       0 |        0 |          |
      |   16 | SELECT |        |       | Y     | N     |                20 |       0 |       0 |        0 | key1     |
      |   18 | SELECT |        |       | Y     | N     |                10 |       0 |       0 |        0 |          |
      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
    2. 次のコマンドを実行して、ID 17 の CCL ルールの優先度を調整します。これにより、ID が 20 に変更されます。

      UPDATE mysql.concurrency_control SET ID = 20 WHERE ID = 17;
    3. 次のコマンドを実行して、更新された有効な CCL ルールを表示します。

      CALL dbms_ccl.show_ccl_rule();

      出力は次のとおりです。

      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      | ID   | TYPE   | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING  | KEYWORDS |
      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      |   16 | SELECT |        |       | Y     | N     |                20 |       0 |       0 |        0 | key1     |
      |   18 | SELECT |        |       | Y     | N     |                10 |       0 |       0 |        0 |          |
      |   20 | SELECT | test   | t     | Y     | N     |                30 |       0 |       0 |        0 |          |
      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
  • flush_ccl_rule:concurrency_control テーブルを変更して CCL ルールを修正した場合、変更を有効にするにはこのコマンドを実行する必要があります。

    構文

    dbms_ccl.flush_ccl_rule();

    UPDATE ステートメントで CCL ルール ID を変更することで、宛先ルールの優先度を調整できます。

    UPDATE mysql.concurrency_control SET CONCURRENCY_COUNT = 15 WHERE Id = 18;

    出力は次のとおりです。

    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0

    次のコマンドを実行して設定を有効にします。

    CALL dbms_ccl.flush_ccl_rule();

    出力は次のとおりです。

    Query OK, 0 rows affected (0.00 sec)​

機能テスト

  1. 3 つのディメンションに対して CCL ルールを作成します。

    CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, '');  // test データベースの sbtest1 テーブルに対する SELECT ステートメントの場合、同時実行数は 3 です。
    CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2');       // キーワード sbtest2 を含む SELECT ステートメントの場合、同時実行数は 2 です。
    CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, '');            // SELECT ステートメントの場合、同時実行数は 2 です。
  2. Sysbench を使用して、次の構成でテストを実行します。

    • 64 スレッド

    • 4 テーブル

    • select.lua

  3. ルールの同時実行数を表示します。

    CALL dbms_ccl.show_ccl_rule();

    出力は次のとおりです。

    +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
    | ID   | TYPE   | SCHEMA | TABLE   | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING  | KEYWORDS |
    +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
    |   20 | SELECT | test   | sbtest1 | Y     | N     |                 3 |     389 |       3 |        9 |          |
    |   21 | SELECT |        |         | Y     | N     |                 2 |     375 |       2 |       14 | sbtest2  |
    |   22 | SELECT |        |         | Y     | N     |                 2 |     519 |       2 |       34 |          |
    +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
    3 rows in set (0.00 sec)

    RUNNING 列を確認します。値は期待される同時実行数と一致しています。