ApsaraDB RDS for MySQL optimiza el manejo de los conflictos de claves únicas durante la ejecución de DDL. Esto reduce las fallas y aumenta la tasa de éxito de las operaciones DDL.
Cómo funciona
Contexto: MySQL Online DDL permite escrituras, actualizaciones y eliminaciones concurrentes en una tabla de destino durante una operación DDL. Estas modificaciones se registran en un registro de filas (row log). Justo antes de que finalice la operación DDL, el motor aplica dicho registro para actualizar el nuevo archivo de datos. Si la tabla tiene un índice único y ocurre un conflicto de clave única en los cambios generados durante la operación DDL, falla la aplicación del registro de filas y, por lo tanto, toda la operación DDL. Como esta aplicación ocurre inmediatamente antes de finalizar la operación DDL, una falla en esta etapa resulta muy costosa.
Descripción general: ApsaraDB RDS for MySQL optimiza este comportamiento. Con esta optimización habilitada, los conflictos de claves únicas que ocurren durante Online DDL no provocan que falle la operación DDL.
Notas de uso
Para habilitar la optimización de conflictos de claves únicas en DDL, su instancia de base de datos debe cumplir con uno de los siguientes requisitos de versión. Si la instancia no cumple estos requisitos, upgrade the major engine version o upgrade the minor engine version.
MySQL 8.4
MySQL 8.0 con una versión secundaria del motor 20250531 o posterior
A continuación se detallan las limitaciones aplicables al usar la optimización de conflictos de claves únicas en DDL:
No se admiten operaciones DDL que modifiquen la clave primaria.
No se admiten conflictos en índices únicos creados durante la operación DDL.
Esta función no es compatible con índices únicos que contengan una columna virtual ni con índices únicos de múltiples valores.
Gestión de parámetros
Parámetros
Establezca el parámetro innodb_online_alter_ignore_dup_key_error_for_uk para habilitar o deshabilitar la optimización de conflictos de claves únicas en DDL.
Parámetro | Descripción |
|
|
Modifique el parámetro
Vaya a la página Instances. En la barra de navegación superior, seleccione la región donde reside la instancia RDS. Luego, busque la instancia RDS y haga clic en su ID.
En el panel de navegación, haga clic en parameter settings.
En la pestaña editable parameters, busque el parámetro y configure su valor.
Haga clic en OK y luego en submit parameters. En el cuadro de diálogo que aparece, seleccione cuándo entrará en vigor el cambio.
Comprobar la función
Procedimiento de prueba
Siga estos pasos para probar el comportamiento de ejecución de DDL cuando la optimización de conflictos de claves únicas está habilitada y deshabilitada:
-
Cree una tabla con una clave única e inserte datos.
-- 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); -
Inicie una sesión e inserte continuamente valores duplicados para provocar conflictos de clave única.
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); -
Inicie otra sesión para probar el comportamiento de ejecución de DDL con la optimización de conflictos de claves únicas habilitada y deshabilitada.
ALTER TABLE test_db.unique_test ENGINE = InnoDB;
Resultados de la prueba
-
Cuando la optimización de conflictos de claves únicas en DDL está deshabilitada, la operación DDL falla y devuelve un error.
-- 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' -
Cuando la optimización de conflictos de claves únicas en DDL está habilitada, la operación DDL se completa correctamente.
-- 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