Todos os produtos
Search
Central de documentação

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

Última atualização: Jun 26, 2026

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

innodb_online_alter_ignore_dup_key_error_for_uk

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

  • Escopo: parâmetro global.

  • Tipo de dado: Boolean.

  • Valor padrão: ON.

  • Valores válidos: ON ou OFF.

  • Reinicialização necessária: Não.

Modifique 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, localize a instância RDS e clique em seu ID.

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

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