O ApsaraDB RDS for MySQL otimiza o tratamento de conflitos de chave única durante a execução de DDL, reduzindo falhas e aumentando a taxa de sucesso das operações DDL.
Como funciona
Contexto: O MySQL Online DDL permite escritas, atualizações e exclusões simultâneas em uma tabela de destino durante uma operação DDL. Essas modificações são registradas em um row log. Imediatamente antes de a operação DDL ser concluída, o mecanismo aplica o row log para atualizar o novo arquivo de dados. Se a tabela tiver um índice único e ocorrer um conflito de chave única nas alterações geradas durante a operação DDL, a aplicação do row log falha e toda a operação DDL é cancelada. Como essa aplicação acontece exatamente antes da conclusão do DDL, uma falha nesse estágio tem custo elevado.
Visão geral: O ApsaraDB RDS for MySQL otimiza esse comportamento. Com essa otimização ativa, conflitos de chave única durante o Online DDL não causam a falha da operação DDL.
Notas de uso
Para ativar a otimização de conflitos de chave única em DDL, a instância de banco de dados deve atender a um dos seguintes requisitos de versão. Se a instância não atender a esses requisitos, atualize a versão principal do mecanismo ou atualize a versão secundária do mecanismo.
MySQL 8.4
MySQL 8.0 com versão secundária do mecanismo 20250531 ou posterior
As seguintes limitações se aplicam ao usar a otimização de conflitos de chave única em DDL:
Operações DDL que alteram a chave primária não são compatíveis.
Conflitos em índices únicos criados durante a operação DDL não são compatíveis.
Este recurso não é compatível com índices únicos que contenham uma coluna virtual nem com índices únicos com múltiplos valores.
Gerenciamento de parâmetros
Parâmetros
Ative ou desative a otimização de conflitos de chave única em DDL definindo o parâmetro innodb_online_alter_ignore_dup_key_error_for_uk.
Parameter | Description |
|
|
Modifique o parâmetro
Acesse a página Instances. Na barra de navegação superior, selecione a região onde a instância RDS reside. Em seguida, localize a instância RDS e clique em seu ID.
No painel de navegação, clique em parameter settings.
Na aba editable parameters, localize o parâmetro e configure seu valor.
Clique em OK e, em seguida, clique em submit parameters. Na caixa de diálogo exibida, selecione quando a alteração entra em vigor.
Verifique o recurso
Procedimento de teste
Siga estas etapas para testar o comportamento da execução de DDL com a otimização de conflitos de chave única ativa e desativada:
-
Crie uma tabela com uma chave única e insira dados.
-- 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 uma sessão e insira valores duplicados continuamente para acionar conflitos de chave ú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 outra sessão para testar o comportamento da execução de DDL com a otimização de conflitos de chave única ativa e desativada.
ALTER TABLE test_db.unique_test ENGINE = InnoDB;
Resultados do teste
-
Com a otimização de conflitos de chave única desativada, a operação DDL falha e retorna um erro.
-- 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' -
Com a otimização de conflitos de chave única ativa, a operação DDL é concluída com êxito.
-- 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