Tüm Ürünler
Search
Belge Merkezi

PolarDB:Eşzamanlılık denetimi

Son Güncelleme:Oct 07, 2026

PolarDB kümenizin kararlı çalışmasını sağlamak için, veritabanı trafiğindeki ani artışları, kaynak yoğun SQL deyimlerini ve SQL erişim kalıplarındaki değişiklikleri yönetmek üzere eşzamanlılık denetimi (CCL) özelliğini kullanabilirsiniz. PolarDB bu özelliğin yönetimini kolaylaştırmak amacıyla DBMS_CCL araç setini sunar.

Önkoşullar

PolarDB kümeniz aşağıdaki sürümlerden birini çalıştırıyor olmalıdır:

  • PolarDB for MySQL 8,0.

  • PolarDB for MySQL 5,7 (revizyon sürümü 5,7.1.0.6 veya üzeri).

    Not

    Kümeniz revizyon sürümü 5,7.1.0.27 veya üzeri olan PolarDB for MySQL 5,7 çalıştırıyorsa CCL özelliği iş parçacığı havuzu özelliği ile uyumludur.

  • PolarDB for MySQL 5,6.

Kullanım notları

CCL kurallarını yalnızca birincil düğümde değiştirebilirsiniz. Değişiklikler diğer tüm düğümlere otomatik olarak yansıtılır.

Çalışma mekanizması

Eşleşme boyutları

CCL, gelen bir SQL deyimi ile bir kuralı eşleştirmek için aşağıdaki beş boyutu kullanır:


Boyut


Açıklama


TYPE


SQL deyiminin türü (örneğin SELECT, UPDATE, INSERT, DELETE veya DDL).


SCHEMA


SQL deyiminin üzerinde işlem yaptığı veritabanının adı.


TABLE


SQL deyiminin üzerinde işlem yaptığı tablo veya görünümün adı.


KEYWORD


SQL deyimi içindeki bir anahtar sözcük. Bir CCL kuralında birden fazla anahtar sözcük belirtebilirsiniz. Anahtar sözcükleri noktalı virgül (;) ile ayırın.


DIGEST


SQL deyiminden oluşturulan karma dizesi. Daha fazla bilgi için bkz. STATEMENT_DIGEST().

Eşleşme mantığı

  • Bir CCL kuralında DIGEST değeri belirtilmemişse:

    • TYPE, SCHEMA ve TABLE değerleri belirtilmişse kuralın uygulanması için bir SQL deyiminin bu üç boyutun tamamıyla eşleşmesi gerekir.

    • Yalnızca TYPE değeri belirtilmişse kuralın uygulanması için bir SQL deyiminin TYPE boyutuyla eşleşmesi gerekir.

    Not

    KEYWORD boyutu da belirtilmişse ek kontroller yapılır:

    • Tek bir anahtar sözcük belirtilmişse eşleşmenin başarılı olması için SQL deyiminin bu anahtar sözcüğü içermesi gerekir.

    • Birden fazla anahtar sözcük belirtilmişse eşleşmenin başarılı olması için SQL deyiminin belirtilen tüm anahtar sözcükleri içermesi gerekir. Anahtar sözcüklerin SQL deyimi içindeki sırası önemli değildir.

  • Bir CCL kuralında DIGEST değeri belirtilmişse SQL deyiminin DIGEST değerinin kuraldaki DIGEST değeriyle eşleşmesi gerekir. Kuralda SCHEMA değeri de belirtilmişse deyimin SCHEMA değerinin de eşleşmesi gerekir.

  • Bir CCL kuralında SCHEMA değeri belirtilmemişse kuralın uygulanması için bir SQL deyiminin yalnızca DIGEST değeriyle eşleşmesi gerekir.

Eşleşme önceliği

Bir SQL deyimi yalnızca bir CCL kuralıyla eşleşebilir. Bir deyim birden fazla kuralla eşleşiyorsa PolarDB en yüksek önceliğe sahip kuralı uygular. Birden fazla kural aynı önceliğe sahipse PolarDB en küçük ID'ye sahip kuralı kullanır. Bir kuralın önceliği, azalan sırada aşağıdaki gibi eşleşme boyutlarına dayanır:

  1. DIGEST

  2. TYPE, SCHEMA ve TABLE

  3. Yalnızca TYPE

Parametreler

Aşağıdaki parametreleri PolarDB konsolunda değiştirebilirsiniz. Daha fazla bilgi için bkz. Küme ve düğüm parametrelerini yapılandırma.

Parametre

Açıklama

loose_ccl_mode

Eşzamanlılık sınırı aşıldığında gerçekleştirilecek eylem. Geçerli değerler:

  • WAIT (Varsayılan): SQL deyimi bir kuyruğa yerleştirilir ve diğer deyimlerin tamamlanmasını bekler.

  • REFUSE: Bir hata döndürülür.

Not

Bu parametre yalnızca PolarDB for MySQL 8,0 için desteklenir. 5,6 ve 5,7 sürümleri için sistem deyimleri otomatik olarak kuyruğa alır.

loose_ccl_max_waiting_count

loose_ccl_mode WAIT olarak ayarlandığında bu parametre tek bir CCL kuralı için kuyruğa alınacak maksimum SQL deyimi sayısını belirtir. Bu sınır aşılırsa sistem bir hata döndürür.

Geçerli değerler: 0 ila 65536. Varsayılan değer: 0.

Not

Bu parametre yalnızca PolarDB for MySQL 5,7 ve 8,0 için desteklenir.

CCL kural tablosu

PolarDB CCL kurallarını concurrency_control sistem tablosunda saklar. Sistem bu tabloyu başlangıçta otomatik olarak oluşturur; sizin manuel olarak oluşturmanız gerekmez. Aşağıdaki CREATE TABLE deyimi tablonun yapısını gösterir:

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;

Aşağıdaki tabloda concurrency_control tablosundaki parametreler açıklanmaktadır.

Parametre

Açıklama

Id

CCL kuralının ID'si.

Type

SQL deyiminin türü (örneğin SELECT, UPDATE, INSERT, DELETE veya DDL).

Schema_name

Veritabanının adı.

Table_name

Veritabanındaki tablonun adı.

Concurrency_count

Kural tarafından izin verilen maksimum eşzamanlı deyim sayısı.

Not

Eşleşen sorguların yürütülmesini engelleyen bir SQL engelleme listesi uygulamak için Concurrency_count değerini 0 olarak ayarlayabilirsiniz.

Keywords

Eşleştirilecek anahtar sözcük veya anahtar sözcükler. Birden fazla anahtar sözcüğü noktalı virgül (;) ile ayırın.

State

Kuralın etkin olup olmadığını belirtir. Geçerli değerler:

  • Y (Varsayılan): Kural etkindir.

  • N: Kural devre dışıdır.

Ordered

Keywords alanında birden fazla anahtar sözcük belirtilmişse bu parametre anahtar sözcüklerin belirtilen sırayla eşleştirilmesi gerekip gerekmediğini belirtir. Geçerli değerler:

  • N (Varsayılan): Keywords alanındaki anahtar sözcüklerin sırayla eşleştirilmesi gerekmez.

  • Y: Keywords alanındaki anahtar sözcüklerin sırayla eşleştirilmesi gerekir.

Digest

Digest_text öğesinden oluşturulan 64 baytlık bir karma dizesi. Daha fazla bilgi için bkz. STATEMENT_DIGEST().

Digest_text

SQL deyiminin normalleştirilmiş deyim özetidir.

Extra

Ek bilgiler.

CCL kurallarını yönetme

PolarDB CCL kurallarını yönetmek için DBMS_CCL paketinde aşağıdaki altı saklı yordamı sunar:

  • add_ccl_rule: TYPE, SCHEMA, TABLE ve KEYWORD'a dayalı bir CCL kuralı ekler.

    Sözdizimi

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

    Example

    • Eşzamanlılık sayısı 10 olan SELECT deyimleri için bir CCL kuralı ekleyin. Bu sınıra ulaşıldığında sistem sonraki deyimleri kuyruğa alır veya reddeder.

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 10, '');
    • key1 anahtar sözcüğünü içeren SELECT deyimleri için eşzamanlılık sayısı 20 olan bir CCL kuralı ekleyin.

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');
    • key1, key2 ve key3 anahtar sözcüklerini içeren SELECT deyimleri için eşzamanlılık sayısı 20 olan bir CCL kuralı ekleyin. Anahtar sözcükler herhangi bir sırada görünebilir.

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1;key2;key3');
    • TYPE olarak SELECT, SCHEMA olarak test ve TABLE olarak t içeren bir CCL kuralı ekleyin. SELECT deyimlerinin eşzamanlılık sayısı 10'a ulaştığında deyimler kuyruğa alınır veya bir hata bildirilir.

      CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 10, '');
  • add_ccl_digest_rule: Bir deyim özetine dayalı olarak bir CCL kuralı ekler.

    Not

    Aşağıdaki veritabanı altyapısı sürümleri add_ccl_digest_rule saklı yordamını destekler:

    • PolarDB for MySQL 8,0.1 (revizyon sürümü 8,0.1.1.31 veya üzeri).

    • PolarDB for MySQL 8,0.2 (revizyon sürümü 8,0.2.2.12 veya üzeri).

    Sözdizimi

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

    Example

    • Eşzamanlılık sayısı 10'a ulaştığında istekleri kuyruğa almak veya bir hata bildirmek için SELECT * FROM t1 SQL deyimiyle eşleşen bir CCL kuralı ekleyin.

      CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1", 10);
    • test şeması ve SELECT * FROM t1 ile eşleşen SQL deyimleri için eşzamanlılık sayısı 10 olduğunda istekleri kuyruğa almak veya bir hata bildirmek üzere bir CCL kuralı ekleyin.

      CALL dbms_ccl.add_ccl_digest_rule("test", "SELECT * FROM t1", 10);
    • Eşzamanlılık sayısı 10 olduğunda istekleri kuyruğa almak veya bir hata bildirmek için SELECT * FROM t1 WHERE col1=1 SQL deyimiyle eşleşen bir CCL kuralı ekleyin.

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

      Bir SQL deyimi sabit içeriyorsa sabit değerler farklı olsa bile eşleşme gerçekleşir. Örneğin önceki CCL kuralı SELECT * FROM t1 WHERE col1 = 2 SQL deyimiyle de eşleşir.

  • add_ccl_digest_rule_by_hash: Önceden hesaplanmış bir özet karmasına dayalı olarak bir CCL kuralı ekler.

    Not

    add_ccl_digest_rule_by_hash saklı yordamı yalnızca PolarDB for MySQL altyapı sürümü 8,0.1 ve revizyon sürümü 8,0.1.1.31 veya üzeri ise desteklenir.

    Sözdizimi

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

    Example

    • DIGEST değeri 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a ile eşleşen SQL deyimleri için eşzamanlılık sayısı 10 olduğunda istekleri kuyruğa almak veya bir hata bildirmek üzere bir CCL kuralı ekleyin.

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

      Bu durumda 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a değeri SELECT * FROM t1 için hesaplanan DIGEST değeridir. Bu değeri hesaplamak veya başka modüllerden elde etmek için SELECT statement_digest("SELECT * FROM t1") komutunu kullanabilirsiniz.

    • SCHEMA'nın test olduğu ve SQL deyiminin DIGEST değerinin 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a ile eşleştiği SQL deyimleri için bir CCL kuralı ekleyin. Eşzamanlılık sayısı 10'a ulaştığında istekler kuyruğa alınır veya bir hata döndürülür.

      CALL dbms_ccl.add_ccl_digest_rule_by_hash('test', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);
  • del_ccl_rule: Bir CCL kuralını siler.

    Sözdizimi

    dbms_ccl.del_ccl_rule(<Id>);

    Example

    ID'si 15 olan CCL kuralını silin.

    CALL dbms_ccl.del_ccl_rule(15);

    Silinecek kural mevcut değilse sistem bir uyarı bildirir. Uyarı içeriğini görüntülemek için SHOW WARNINGS; komutunu kullanabilirsiniz. Aşağıda bir örnek verilmiştir:

    1. ID'si 100 olan CCL kuralını silin.

      CALL dbms_ccl.del_ccl_rule(100);

      Aşağıdaki çıktı döndürülür:

      Query OK, 0 rows affected, 2 warnings (0.00 sec)
    2. Uyarı mesajını görüntülemek için aşağıdaki komutu çalıştırın:

      SHOW WARNINGS;

      Aşağıdaki çıktı döndürülür:

      +---------+------+----------------------------------------------------+
      | 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 |
      +---------+------+----------------------------------------------------+
    Not

    Önceki örnekte PolarDB for MySQL sürüm 8,0 için Code değeri 7517, PolarDB for MySQL sürüm 5,7 için Code değeri 3267 ve PolarDB for MySQL sürüm 5,6 için Code değeri 3045 şeklindedir.

  • show_ccl_rule: Şu anda bellekte bulunan etkin CCL kurallarını görüntüler.

    Sözdizimi

    dbms_ccl.show_ccl_rule();

    Example

    CALL dbms_ccl.show_ccl_rule();

    Aşağıdaki çıktı döndürülür:

    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
    | 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 |          |
    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+​
    Not

    Aşağıdaki tabloda MATCHED, RUNNING ve WAITTING sütunları açıklanmaktadır.

    • MATCHED: Kuralın bir deyimle kaç kez eşleştiğinin toplam sayısı.

    • RUNNING: Bu kural kapsamında şu anda çalışan iş parçacığı sayısı.

    • WAITTING: Bu kural kapsamında şu anda çalışmayı bekleyen iş parçacığı sayısı.

  • Bir kuralın ID'sini değiştirmek ve böylece önceliğini değiştirmek için bir UPDATE deyimi kullanabilirsiniz.

    Sözdizimi

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

    Example

    1. Bellekteki etkin CCL kurallarını görüntülemek için aşağıdaki komutu çalıştırın:

      CALL dbms_ccl.show_ccl_rule();

      Aşağıdaki çıktı döndürülür:

      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      | 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'si 17 olan CCL kuralının ID'sini 20 olarak değiştirerek önceliğini değiştirmek için aşağıdaki komutu çalıştırın:

      UPDATE mysql.concurrency_control SET ID = 20 WHERE ID = 17;
    3. Değiştirilen kuralları görüntülemek için aşağıdaki komutu çalıştırın:

      CALL dbms_ccl.show_ccl_rule();

      Aşağıdaki çıktı döndürülür:

      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      | ID   | TYPE   | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | 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 tablosundaki içeriği değiştirerek bir CCL kuralını değiştirirseniz kuralın etkili olması için aşağıdaki komutu da kullanmanız gerekir.

    Sözdizimi

    dbms_ccl.flush_ccl_rule();

    Example

    Bir kuralın eşzamanlılık sayısını değiştirmek için bir UPDATE deyimi kullanın.

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

    Aşağıdaki çıktı döndürülür:

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

    Değişikliği uygulamak için aşağıdaki komutu çalıştırın:

    CALL dbms_ccl.flush_ccl_rule();

    Aşağıdaki çıktı döndürülür:

    Query OK, 0 rows affected (0.00 sec)​

Özelliği test etme

  1. Farklı eşleşme boyutlarına sahip üç CCL kuralı oluşturun:

    CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, '');  // Limit SELECT statements on the test.sbtest1 table to a concurrency of 3.
    CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2');       // Limit SELECT statements containing the keyword 'sbtest2' to a concurrency of 2.
    CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, '');            // Limit all other SELECT statements to a concurrency of 2.
  2. Aşağıdaki yapılandırmayla Sysbench kullanarak bir test çalıştırın:

    • 64 iş parçacığı

    • 4 tablo

    • select.lua

  3. Gerçek zamanlı eşzamanlılık durumunu görüntüleyin:

    CALL dbms_ccl.show_ccl_rule();

    Aşağıdaki çıktı döndürülür:

    +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
    | ID   | TYPE   | SCHEMA | TABLE   | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | 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 sütununu kontrol edin. Değerler belirtilen eşzamanlılık sınırlarıyla eşleşir; bu da kuralların doğru çalıştığını gösterir.