O ApsaraDB RDS for MySQL otimiza o tratamento de conflitos de chave única durante a execução de DDL. Isso reduz as falhas e aumenta a taxa de sucesso das operações de DDL.
Como funciona
Contexto: O MySQL Online DDL permite gravações, atualizações e exclusões simultâneas em uma tabela de destino durante uma operação de DDL. O sistema registra essas modificações em um log de linhas. Pouco antes de o DDL terminar, o mecanismo aplica o log de linhas 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 de DDL, a aplicação do log de linhas falhará e toda a operação de DDL falhará. Como a aplicação do log de linhas ocorre logo antes da conclusão do DDL, uma falha nessa etapa é muito custosa.
Visão geral: O ApsaraDB RDS for MySQL otimiza esse comportamento. Com essa otimização ativada, os conflitos de chave única que ocorrem durante o Online DDL não causam a falha da operação de DDL.
Notas de uso
Para ativar a otimização de conflito de chave única em DDL, sua instância de banco de dados deve atender a um dos seguintes requisitos de versão. Se a sua 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 conflito de chave única em DDL:
Não há suporte para operações de DDL que alteram a chave primária.
Não há suporte para conflitos em índices únicos criados durante a operação de DDL.
Este recurso não oferece suporte a índices únicos que contenham uma coluna virtual ou índices únicos com vários valores.
Gerenciamento de parâmetros
Parâmetros
Você pode ativar ou desativar a otimização de conflito de chave única em DDL definindo o parâmetro innodb_online_alter_ignore_dup_key_error_for_uk.
Parâmetro | Descrição |
|
|
Modificar 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, encontre a instância RDS e clique no ID da instância.
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 entrará em vigor.
Verifique o recurso
Procedimento de teste
Siga estas etapas para testar o comportamento de execução do DDL quando a otimização de conflito de chave única em DDL está ativada 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 de execução do DDL com a otimização de conflito de chave única em DDL ativada e desativada.
ALTER TABLE test_db.unique_test ENGINE = InnoDB;
Resultados do teste
-
Quando a otimização de conflito de chave única em DDL está desativada, a operação de 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' -
Quando a otimização de conflito de chave única em DDL está ativada, a operação de DDL é concluída com sucesso.
-- 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