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

PolarDB:同時実行制御

最終更新日:Jan 29, 2026

Alibaba Cloud は、SQL 文ベースの同時実行制御 (CCL) ルールと DBMS_CCL パッケージを提供しています。これらは、データベーストラフィックの急増や、リソース消費の激しい SQL 文、SQL アクセスモデルの変更に対応することで、PolarDB クラスターの安定性を確保します。

前提条件

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

  • PolarDB for MySQL 8.0。

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

    説明

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

  • PolarDB for MySQL 5.6。

注意事項

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

機能設計

ディメンション

CCL は、次の 5 つのディメンションに基づいて SQL 文とルールを照合します。

ディメンション

説明

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 がルール内の対応する値と一致する場合にのみ有効になります。

    • DIGEST 値が空で、SCHEMA と TABLE の値が空、TYPE の値が指定されている場合、ルールは SQL 文の TYPE がルール内の TYPE と一致する場合にのみ有効になります。

    説明

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

    • CCL ルールに単一の KEYWORD が指定されている場合、SQL 文にそのキーワードが含まれていれば一致と見なされます。

    • CCL ルールに複数の KEYWORD が指定されている場合、SQL 文に指定されたすべてのキーワードが含まれている場合にのみ一致と見なされます。SQL 文内のキーワードの順序は一致に影響しません。

  • CCL ルールの DIGEST 値が空でない場合、ルールは SQL 文の SCHEMA と DIGEST 値がルール内の対応する値と一致する場合にのみ有効になります。

  • CCL ルールの SCHEMA が空の場合、ルールは SQL 文の DIGEST 値がルール内の 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 TABLE` 文は次のとおりです。

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');
    • SCHEMA が test、TABLE が 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 ストアドプロシージャは、次のデータベースエンジンバージョンでサポートされています。

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

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

    構文

    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 ストアドプロシージャは、マイナーエンジンバージョンが 8.0.1.1.31 以降の PolarDB for MySQL 8.0.1 でのみサポートされています。

    構文

    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 の CC ルールを削除します。

    CALL dbms_ccl.del_ccl_rule(15);

    指定されたルールが存在しない場合、システムは警告を報告します。SHOW WARNINGS; コマンドを実行して警告を表示できます。例:

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

      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 の Code7517PolarDB for MySQL 5.7 の Code3267PolarDB for MySQL 5.6 の Code3045 です。

  • 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 | 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 |          |
      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
    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 文を使用して CC ルールの 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');       // SELECT 文にキーワード sbtest2 が含まれています。同時実行数は 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 列をチェックして、同時実行数が想定どおりであることを確認します。