Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Otimização de conflito de chave única em DDL

Última atualização: Oct 12, 2026

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

innodb_online_alter_ignore_dup_key_error_for_uk

  • Descrição: Ativa ou desativa a otimização de conflito de chave única em DDL.

  • Escopo: parâmetro global.

  • Tipo de dados: Boolean.

  • Valor padrão: ON.

  • Valores válidos: ON ou OFF.

  • Requer reinicialização: Não.

Modificar o parâmetro

  1. 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.

  2. No painel de navegação, clique em parameter settings.

  3. Na aba editable parameters, localize o parâmetro e configure seu valor.

  4. 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:

  1. 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);
  2. 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);
  3. 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