Tous les produits
Search
Centre de documentation

PolarDB:Preemptive DDL

Dernière mise à jour :Aug 11, 2026

PolarDB for MySQL propose la fonctionnalité Preemptive DDL pour éviter l'échec des opérations de langage de définition de données (DDL) causé par des requêtes volumineuses ou des transactions longues sur les tables des nœuds en lecture seule.

Symptômes

Lors de l'exécution d'une opération DDL dans une base de données PolarDB for MySQL, une erreur signale l'impossibilité d'obtenir un verrou de métadonnées (MDL). Les messages d'erreur suivants s'affichent :

ERROR HY000: Fail to get MDL on replica during DDL synchronize
ERROR HY000: Fail to get table lock on replica; you can 'set polar_support_mdl_sync_preemption = ON' and try restarting transaction

Prérequis

Votre cluster PolarDB for MySQL doit utiliser l'une des révisions suivantes :

  • PolarDB for MySQL 5.6 : révision 5.6.1.0.43 ou ultérieure.

  • PolarDB for MySQL 5.7 : révision 5.7.1.0.34 ou ultérieure.

  • PolarDB for MySQL 8.0.1 : révision 8.0.1.1.39 ou ultérieure.

  • PolarDB for MySQL 8.0.2 : révision 8.0.2.2.14 ou ultérieure.

Pour vérifier la révision de votre cluster, consultez Consulter la version d'un cluster.

Limites

La fonctionnalité Preemptive DDL est prise en charge uniquement sur les nœuds en lecture seule, et non sur le nœud principal.

Remarques d'utilisation

  • L'activation de Preemptive DDL peut interrompre les connexions qui accèdent à la table cible sur un nœud en lecture seule ou annuler les requêtes SQL en cours d'exécution sur cette table. Utilisez cette fonctionnalité avec prudence.

  • Cette fonctionnalité n'est effective que si la valeur du paramètre loose_replica_lock_wait_timeout dépasse de plus de 5 la valeur du paramètre loose_polar_mdl_sync_preempt_after_wait_second.

  • Pour PolarDB for MySQL 8.0.1 et PolarDB for MySQL 8.0.2, les opérations de renommage ne sont pas prises en charge. Nous vous recommandons d'utiliser plutôt l'instruction ALTER TABLE ... RENAME.

Informations générales

PolarDB for MySQL repose sur une architecture de stockage partagé. Lors d'une opération DDL, le nœud principal acquiert d'abord un verrou de métadonnées exclusif (MDL-X), puis demande à tous les nœuds en lecture seule d'acquérir ce même verrou. Si une transaction accède à la table cible sur un nœud en lecture seule, le processus de synchronisation du verrou MDL se bloque. Faute d'obtenir le verrou MDL-X dans le délai imparti, le client renvoie l'erreur ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize. Ce problème survient fréquemment dans les clusters PolarDB for MySQL comportant plusieurs nœuds en lecture seule. La fonctionnalité Preemptive DDL a été conçue pour y remédier.

Procédure

Activez la fonctionnalité Preemptive DDL via le paramètre loose_polar_support_mdl_sync_preemption et définissez le délai d'attente de préemption avec le paramètre loose_polar_mdl_sync_preempt_after_wait_second. Pour plus d'informations, consultez Spécifier les paramètres du cluster et des nœuds. Le tableau suivant décrit ces paramètres.

Paramètre

Niveau

Description

loose_polar_support_mdl_sync_preemption

Session

Contrôle la fonctionnalité Preemptive DDL. Valeurs valides :

  • ON : active la fonctionnalité Preemptive DDL.

  • OFF (par défaut) : désactive la fonctionnalité Preemptive DDL.

loose_polar_mdl_sync_preempt_after_wait_second

Global

Définit le délai d'attente en secondes lorsqu'une synchronisation de verrou MDL est bloquée. Passé ce délai, le système lance la préemption des threads bloquants si le verrou n'a pas été acquis.

Valeurs valides : de 1 à 31536000. Unité : secondes. Valeur par défaut : 10.

Exemples

Preemptive DDL désactivé

  1. Sur un nœud en lecture seule, exécutez une requête sur la table test.t1.

    mysql> use test;
    Database changed
    # A large query that runs for 100 seconds
    mysql> select sleep(100) from t1;
  2. Sur le nœud principal, ajoutez une colonne à la table.

    mysql > alter table t1 add column c int;
    ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize

    Cet exemple montre qu'avec Preemptive DDL désactivé, l'opération DDL est bloquée et finit par échouer. En effet, la transaction longue sur le nœud en lecture seule empêche la synchronisation du verrou MDL.

    mysql> select sleep(100) from t1;
    +------------+
    | sleep(100) |
    +------------+
    |          0 |
    +------------+
    1 row in set (1 min 40.00 sec)

Preemptive DDL activé

  1. Sur un nœud en lecture seule, exécutez une requête sur la table test.t1.

    mysql> use test;
    Database changed
    # A large query that runs for 100 seconds
    mysql> select sleep(100) from t1;
  2. Sur le nœud principal, ajoutez une colonne à la table.

    mysql> alter table t1 add column c int;
    Query OK, 0 rows affected (11.13 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    Cet exemple illustre qu'avec Preemptive DDL activé, la synchronisation du verrou MDL est d'abord bloquée par la transaction longue. Après un délai d'attente, la fonctionnalité preempte le thread bloquant, permettant ainsi la réussite de l'opération DDL.

    mysql> select sleep(100) from t1;
    ERROR 2013 (HY000): Lost connection to MySQL server during query

Nous contacter

Si vous avez des questions concernant les opérations DDL, veuillez contacter le support technique.