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 :
|
|
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é
Preemptive DDL activé
Nous contacter
Si vous avez des questions concernant les opérations DDL, veuillez contacter le support technique.