La fonctionnalité DDL sans blocage d'ApsaraDB RDS for MySQL empêche le blocage des sessions et l'accumulation de connexions lorsqu'une opération Data Definition Language (DDL) ne parvient pas à obtenir un verrou de métadonnées (MDL). Cette fonction améliore la stabilité et la disponibilité de l'instance lors de l'exécution des opérations DDL.
Fonctionnement
Contexte : Dans MySQL, une opération DDL doit acquérir un verrou de métadonnées exclusif (MDL-X) sur la table cible afin de garantir la cohérence des métadonnées. Si des transactions non validées ou des requêtes longues sont en cours d'exécution sur la table, le thread DDL passe à l'état d'attente, car il ne peut pas obtenir le verrou immédiatement. Étant donné qu'un verrou MDL-X en attente possède la priorité la plus élevée, il bloque tout accès ultérieur à la table cible. Cela peut entraîner un blocage des sessions, une accumulation de connexions et des retards de réponse. Dans les cas graves, l'ensemble du système métier peut devenir indisponible.
Présentation : La fonctionnalité DDL sans blocage d'ApsaraDB RDS for MySQL modifie la manière dont les threads DDL acquièrent et attendent les verrous de métadonnées (MDL). Elle remplace une seule attente prolongée par une série d'attentes courtes et intermittentes. Entre chaque tentative, le thread DDL libère sa demande de verrou MDL-X, ce qui permet aux nouvelles sessions d'accéder à la table cible. Ainsi, le thread DDL n'empêche pas les autres sessions d'accéder à la table cible pendant une période prolongée.
Notes d'utilisation
Pour utiliser la fonctionnalité DDL sans blocage, votre instance doit satisfaire à l'une des exigences de version suivantes. Si votre instance ne répond pas à ces exigences, vous pouvez mettre à niveau la version mineure du moteur ou mettre à niveau la version majeure de la base de données :
MySQL 8.4
MySQL 8.0 avec une version mineure du moteur égale ou supérieure à 20250531
La fonctionnalité DDL sans blocage présente les limitations suivantes :
Seules les opérations
ALTER TABLE,CREATE INDEXetDROP INDEXsont prises en charge. Pour effectuer une opérationOPTIMIZE TABLE, utilisez plutôtALTER TABLE ... ENGINE = InnoDB.Cette fonction est inactive sur les nœuds secondaires et les instances en lecture seule lorsque les données sont synchronisées depuis le nœud principal.
L'activation de cette fonction réduit la priorité des opérations DDL. Par conséquent, une opération DDL risque davantage d'échouer si elle ne parvient pas à obtenir un verrou de métadonnées (MDL).
Gestion des paramètres
Paramètres
Vous pouvez utiliser les paramètres loose_rds_nonblock_ddl_retry_interval et loose_rds_nonblock_ddl_lock_wait_timeout pour contrôler et ajuster la fonctionnalité DDL sans blocage. Une fois cette fonction activée, le thread DDL tente par intermittence d'acquérir un verrou de métadonnées (MDL). En cas d'échec, le thread libère sa demande de verrou MDL et attend avant de réessayer.
Paramètre | Description |
|
|
|
|
Modifier les paramètres
Accédez à la page Instances. Dans la barre de navigation supérieure, sélectionnez la région où se trouve l'instance RDS. Recherchez ensuite l'instance RDS et cliquez sur son ID.
Dans le volet de navigation de gauche, cliquez sur Parameters.
Sous l'onglet Editable Parameters, recherchez le paramètre à modifier et changez sa valeur.
Cliquez sur OK, puis sur Submit Parameters. Dans la boîte de dialogue, spécifiez le moment où les modifications prendront effet.
Efficacité de la fonctionnalité
Méthode de test
Ce test utilise sysbench pour comparer l'impact sur les performances d'une opération DDL avec et sans la fonctionnalité DDL sans blocage. Procédez comme suit :
-
Utilisez sysbench pour créer une table et y insérer des données.
sysbench oltp_read_write --db-ps-mode=auto --percentile=95 --mysql-host=$HOST --mysql-port=$PORT --mysql-user=$USER --mysql-db=$DB --tables=1 --table-size=50 --threads=16 prepare -
Démarrez un test de charge sysbench pour simuler le trafic métier en ligne.
sysbench oltp_read_write --db-ps-mode=auto --percentile=95 --mysql-host=$HOST --mysql-port=$PORT --mysql-user=$USER --mysql-db=$DB --tables=1 --table-size=50 --threads=16 --report-interval=1 --time=100 run -
Dans une session distincte, démarrez une transaction longue sur la table cible afin de bloquer les opérations DDL ultérieures.
SELECT SLEEP(60) FROM sbtest1 LIMIT 1; -
Dans une autre session, avec la fonctionnalité DDL sans blocage désactivée, exécutez l'opération DDL suivante et observez la variation du nombre de transactions par seconde (TPS).
ALTER TABLE sbtest1 ENGINE = InnoDB; -- Expected result: The DDL thread is blocked because it cannot acquire the metadata lock (MDL). -
Activez la fonctionnalité DDL sans blocage en définissant le paramètre
loose_rds_nonblock_ddl_retry_intervalsur 6 et le paramètreloose_rds_nonblock_ddl_lock_wait_timeoutsur 1. Exécutez la même opération DDL et observez la variation du TPS.ALTER TABLE sbtest1 ENGINE = InnoDB; -- Expected result: The DDL thread intermittently acquires the metadata lock (MDL) and is not fully blocked.
Résultats du test
Lorsque la fonctionnalité DDL sans blocage est désactivée, le thread DDL ne parvient pas à obtenir le verrou de métadonnées (MDL) et la session est entièrement bloquée.
Avec la fonctionnalité DDL sans blocage activée, le thread DDL acquiert le verrou de métadonnées (MDL) par intermittence. Cela évite le blocage complet de la session et maintient la stabilité du système.

