Tous les produits
Search
Centre de documentation

PolarDB:Empêcher les transactions longues sur les nœuds en lecture seule de bloquer les opérations DDL

Dernière mise à jour :Oct 12, 2026

PolarDB prend en charge le paramètre polar_slave_work_on_nonblock_mdl_mode. Une fois ce paramètre activé, il empêche les transactions de longue durée exécutées sur les nœuds en lecture seule de PolarDB de bloquer les opérations DDL sur le nœud principal. Cette rubrique explique comment activer ce paramètre pour PolarDB.

Limites

Les versions des clusters PolarDB doivent satisfaire à l'une des exigences suivantes :

  • PolarDB for MySQL 8.0 avec une version de révision 8.0.1.1.23 ou ultérieure

  • PolarDB for MySQL 5.7 avec une version de révision 5.7.1.0.19 ou ultérieure

  • PolarDB for MySQL 5.6 avec une version de révision 5.6.1.0.32 ou ultérieure

Remarque

Pour vérifier la version du noyau de votre cluster, consultez la rubrique Interroger la version du moteur.

Le niveau d'isolation des transactions sur les nœuds en lecture seule de PolarDB doit être défini sur Read Committed ou Read Uncommitted pour que le paramètre polar_slave_work_on_nonblock_mdl_mode prenne effet.

Le paramètre polar_slave_work_on_nonblock_mdl_mode s'applique uniquement aux nœuds en lecture seule de PolarDB.

Informations contextuelles

Les nœuds en lecture seule de PolarDB exécutent des transactions de longue durée qui conservent continuellement des verrous de métadonnées (MDL) sur les tables auxquelles elles accèdent. Ces verrous empêchent les opérations DDL sur le nœud principal de PolarDB de terminer la synchronisation des MDL. Les opérations DDL finissent par expirer et renvoient l'erreur ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize.

Remarque

Le délai d'expiration de la synchronisation des MDL est contrôlé par le paramètre replica_lock_wait_timeout, dont la valeur par défaut est de 50 secondes.

Lorsque ce problème survient, exécutez la commande show processlist sur le nœud principal de PolarDB. Si le champ State du résultat de la requête affiche Wait for syncing with replicas, exécutez la commande suivante sur un nœud en lecture seule de PolarDB pour interroger les informations MDL en état d'attente : select * from information_schema.innodb_log_mdl_slot where slot_state = "SLOT_ACQUIRING". Si cette commande renvoie le résultat suivant, un problème d'attente MDL existe sur le nœud en lecture seule de PolarDB.

+---------+----------------+-----------+----------+-----------+
| slot_id | slot_state     | slot_name | slot_lsn | thread_id |
+---------+----------------+-----------+----------+-----------+
|       0 | SLOT_ACQUIRING | test/t    | 35025648 | thread-0  |
+---------+----------------+-----------+----------+-----------+

Remarques d'utilisation

Le paramètre polar_slave_work_on_nonblock_mdl_mode ne résout que les blocages DDL causés par des transactions de longue durée. Après avoir activé polar_slave_work_on_nonblock_mdl_mode, vous pouvez toujours rencontrer des échecs de synchronisation MDL provoqués par des requêtes volumineuses (c'est-à-dire des requêtes dont la durée d'exécution dépasse le délai d'expiration de la synchronisation MDL).

Les MDL acquis par les commandes LOCK TABLES et FLUSH TABLES doivent être explicitement libérés en exécutant UNLOCK TABLES. Par conséquent, polar_slave_work_on_nonblock_mdl_mode ne peut pas résoudre les blocages MDL causés par LOCK TABLES et FLUSH TABLES.

Procédure

  1. Connectez-vous à la console PolarDB.

  2. Dans le coin supérieur gauche, sélectionnez la région où le cluster est déployé.

  3. Localisez le cluster cible et cliquez sur son ID.

  4. Dans le volet de navigation de gauche, choisissez Settings and Management > Parameters.

  5. Recherchez le paramètre cible loose_polar_slave_work_on_nonblock_mdl_mode et cliquez sur Modify Parameter.

    Dans la zone de recherche, saisissez loose_polar_slave_work_on_nonblock_mdl_mode. Vous constatez que la valeur actuelle de ce paramètre pour le cluster est ON, que le paramètre global est Yes et que la plage de modification est [ON|OFF]. Cliquez sur Modify Parameter.

  6. Après avoir modifié le paramètre, cliquez sur Submit Changes. Dans la boîte de dialogue Save Changes, cliquez sur OK.

Exemples

Après avoir activé polar_slave_work_on_nonblock_mdl_mode, la même transaction sur un nœud en lecture seule peut voir des schémas de table différents, comme illustré dans l'exemple suivant :

  1. Tout d'abord, interrogez test.t sur un nœud en lecture seule :

    mysql> begin;
    mysql> select * from test.t;
    +------+
    | a    |
    +------+
    |    1 |
    +------+
    1 row in set (0.00 sec)
  2. Ensuite, effectuez une opération DDL sur test.t sur le nœud principal :

    mysql> alter table test.t add column b int;
    Query OK, 0 rows affected (0.32 sec)
    Records: 0  Duplicates: 0  Warnings: 0
  3. Enfin, interrogez à nouveau test.t sur le nœud en lecture seule :

    mysql> select * from test.t;
    +------+------+
    | a    | b    |
    +------+------+
    |    1 | NULL |
    +------+------+
    1 row in set (0.00 sec)

L'exemple précédent montre que lorsque polar_slave_work_on_nonblock_mdl_mode est activé, une opération DDL sur le nœud principal entraîne une différence du nombre de colonnes visibles pour la même transaction sur le nœud en lecture seule. Si vous désactivez polar_slave_work_on_nonblock_mdl_mode, l'opération DDL sur le nœud principal reste en attente de la transaction sur le nœud en lecture seule jusqu'à ce que la transaction soit validée ou que l'attente expire (erreur : ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize).

Contact us

Si vous avez des questions concernant les opérations DDL, Contact us.