ApsaraDB RDS for MySQL optimise la gestion des conflits de clé unique durant l'exécution des instructions DDL. Cette amélioration réduit les échecs et augmente le taux de réussite des opérations DDL.
Fonctionnement
Contexte : La fonctionnalité MySQL Online DDL permet d'effectuer des écritures, mises à jour et suppressions concurrentes sur une table cible pendant une opération DDL. Ces modifications sont enregistrées dans un journal de lignes (row log). Juste avant la fin de l'opération DDL, le moteur applique ce journal pour mettre à jour le nouveau fichier de données. Si la table possède un index unique et qu'un conflit de clé unique survient dans les changements générés durant l'opération DDL, l'application du journal de lignes échoue, entraînant l'échec de toute l'opération DDL. Comme cette application intervient juste avant la finalisation de l'opération DDL, un échec à ce stade est particulièrement coûteux.
Présentation : ApsaraDB RDS for MySQL optimise ce comportement. Lorsque cette optimisation est activée, les conflits de clé unique qui se produisent durant une opération Online DDL n'entraînent pas l'échec de celle-ci.
Notes d'utilisation
Pour activer l'optimisation des conflits de clé unique lors des opérations DDL, votre instance de base de données doit satisfaire à l'une des exigences de version suivantes. Si votre instance ne remplit pas ces conditions, mettez à niveau la version majeure du moteur ou mettez à niveau la version mineure du moteur.
MySQL 8.4
MySQL 8.0 avec une version mineure du moteur égale ou supérieure à 20250531
Les limitations suivantes s'appliquent lorsque vous utilisez l'optimisation des conflits de clé unique lors des opérations DDL :
Les opérations DDL qui modifient la clé primaire ne sont pas prises en charge.
Les conflits sur les index uniques créés durant l'opération DDL ne sont pas pris en charge.
Cette fonctionnalité ne prend pas en charge les index uniques contenant une colonne virtuelle ni les index uniques multivalués.
Gestion des paramètres
Paramètres
Vous pouvez activer ou désactiver l'optimisation des conflits de clé unique lors des opérations DDL en configurant le paramètre innodb_online_alter_ignore_dup_key_error_for_uk.
Paramètre | Description |
|
|
Modifier le paramètre
Accédez à la page Instances. Dans la barre de navigation supérieure, sélectionnez la région où se trouve l'instance RDS. Localisez ensuite l'instance RDS et cliquez sur son ID.
Dans le volet de navigation, cliquez sur parameter settings.
Sous l'onglet editable parameters, localisez le paramètre et configurez sa valeur.
Cliquez sur OK, puis sur submit parameters. Dans la boîte de dialogue qui s'affiche, sélectionnez le moment où la modification prendra effet.
Vérifier la fonctionnalité
Procédure de test
Suivez les étapes ci-dessous pour tester le comportement d'exécution des instructions DDL lorsque l'optimisation des conflits de clé unique est activée, puis désactivée :
-
Créez une table avec une clé unique et insérez-y des données.
-- Create a table with a unique key CREATE DATABASE IF NOT EXISTS test_db; USE test_db; DROP TABLE IF EXISTS unique_test; CREATE TABLE unique_test ( id INT AUTO_INCREMENT PRIMARY KEY, user_id VARCHAR(50) NOT NULL, name VARCHAR(100), UNIQUE KEY uk_user_id (user_id) ); -- Insert initial data (for example, 2,000,000 rows) DELIMITER $$ DROP PROCEDURE IF EXISTS insert_initial_data $$ CREATE PROCEDURE insert_initial_data(IN num_rows INT) BEGIN DECLARE i INT DEFAULT 1; START TRANSACTION; WHILE i <= num_rows DO SET @uid = CONCAT('user_', i); SET @name = CONCAT('Name_', i); INSERT INTO unique_test (user_id, name) VALUES (@uid, @name); SET i = i + 1; END WHILE; COMMIT; END $$ DELIMITER ; CALL insert_initial_data(2000000); -
Ouvrez une session et insérez continuellement des valeurs dupliquées pour déclencher des conflits de clé unique.
USE test_db; DELIMITER $$ DROP PROCEDURE IF EXISTS insert_duplicate_loop $$ CREATE PROCEDURE insert_duplicate_loop( IN loop_count INT ) BEGIN DECLARE i INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR 1062 BEGIN END; -- Ignore duplicate key errors WHILE i < loop_count DO -- Try to insert an existing user_id to trigger a unique key conflict INSERT INTO unique_test (user_id, name) VALUES ('user_1', 'ConflictUser'); SET i = i + 1; END WHILE; END $$ DELIMITER ; -- Loop 100,000 times to insert duplicates CALL insert_duplicate_loop(100000); -
Ouvrez une autre session pour tester le comportement d'exécution des instructions DDL avec l'optimisation des conflits de clé unique activée, puis désactivée.
ALTER TABLE test_db.unique_test ENGINE = InnoDB;
Résultats des tests
-
Lorsque l'optimisation des conflits de clé unique lors des opérations DDL est désactivée, l'opération DDL échoue et renvoie une erreur.
-- innodb_online_alter_ignore_dup_key_error_for_uk = OFF mysql> ALTER TABLE test_db.unique_test ENGINE = InnoDB; ERROR 1062 (23000): Duplicate entry 'user_1' for key 'unique_test.uk_user_id' -
Lorsque l'optimisation des conflits de clé unique lors des opérations DDL est activée, l'opération DDL se termine avec succès.
-- innodb_online_alter_ignore_dup_key_error_for_uk = ON mysql> ALTER TABLE test_db.unique_test ENGINE = InnoDB; Query OK, 0 rows affected (6.03 sec) Records: 0 Duplicates: 0 Warnings: 0