Todos os produtos
Search
Central de documentação

ApsaraDB RDS:DDL não bloqueante

Última atualização: Jun 26, 2026

O recurso de DDL não bloqueante do ApsaraDB RDS for MySQL evita o bloqueio de sessões e o acúmulo de conexões quando uma operação de Data Definition Language (DDL) não consegue obter um bloqueio de metadados (MDL). Isso melhora a estabilidade e a disponibilidade da instância durante a execução de DDL.

Como funciona

Contexto: No MySQL, uma operação de DDL precisa obter um bloqueio de metadados exclusivo (MDL-X) na tabela de destino para garantir a consistência dos metadados. Se houver transações não confirmadas ou consultas de longa execução na tabela, o thread de DDL entra em estado pendente por não conseguir obter o bloqueio imediatamente. Como um bloqueio MDL-X pendente tem a prioridade mais alta, ele bloqueia todo o acesso subsequente à tabela de destino. Esse comportamento pode causar bloqueio de sessões, acúmulo de conexões e atrasos nas respostas. Em casos graves, todo o sistema de negócios pode ficar indisponível.

Funcionamento: O recurso de DDL não bloqueante do ApsaraDB RDS for MySQL altera a forma como os threads de DDL obtêm e aguardam bloqueios de metadados (MDL). Uma única espera longa é substituída por uma série de esperas curtas e intermitentes. Nos intervalos entre as tentativas, o thread de DDL libera sua solicitação do bloqueio MDL-X, permitindo que novas sessões acessem a tabela de destino. Assim, o thread de DDL deixa de bloquear o acesso de outras sessões à tabela de destino por períodos prolongados.

Observações de uso

Para usar o recurso de DDL não bloqueante, sua instância deve atender a um dos seguintes requisitos de versão. Caso sua instância não atenda aos requisitos, atualize a versão secundária do mecanismo ou atualize a versão principal do banco de dados:

  • MySQL 8.4

  • MySQL 8.0 com versão secundária do mecanismo 20250531 ou posterior

O recurso de DDL não bloqueante apresenta as seguintes limitações:

  • Somente as operações ALTER TABLE, CREATE INDEX e DROP INDEX são suportadas. Para executar uma operação OPTIMIZE TABLE, use ALTER TABLE ... ENGINE = InnoDB.

  • Este recurso permanece inativo em nós secundários e instâncias somente leitura durante a sincronização de dados do nó primário.

  • A ativação deste recurso reduz a prioridade das operações de DDL. Isso aumenta a probabilidade de falha caso o bloqueio de metadados (MDL) não seja obtido.

Gerenciamento de parâmetros

Parâmetros

Use os parâmetros loose_rds_nonblock_ddl_retry_interval e loose_rds_nonblock_ddl_lock_wait_timeout para controlar e ajustar o recurso de DDL não bloqueante. Quando este recurso está ativado, o thread de DDL tenta obter o bloqueio de metadados (MDL) de forma intermitente. Se uma tentativa falhar, o thread libera a solicitação de MDL e aguarda antes de tentar novamente.

Parâmetro

Descrição

loose_rds_nonblock_ddl_retry_interval

  • Descrição: Intervalo de tempo entre as tentativas após falha do thread de DDL ao obter um bloqueio de metadados (MDL).

  • Escopo: Nível de sessão.

  • Tipo de dado: Integer.

  • Valor padrão: 0. O valor 0 indica que o recurso de DDL não bloqueante está desativado.

  • Valores válidos: 0 a 31536000. Unidade: segundos.

  • Requer reinicialização da instância: Não.

loose_rds_nonblock_ddl_lock_wait_timeout

  • Descrição: Tempo limite para cada tentativa intermitente do thread de DDL de obter um bloqueio de metadados (MDL).

  • Escopo: Nível de sessão.

  • Tipo de dado: Integer.

  • Valor padrão: 1.

  • Valores válidos: 1 a 31536000. Unidade: segundos.

  • Requer reinicialização da instância: Não.

Modifique parâmetros

  1. Acesse a página Instances. Na barra de navegação superior, selecione a região onde a instância RDS está localizada. Em seguida, localize a instância RDS e clique em no ID da instância.

  2. No painel de navegação à esquerda, clique em Parameters.

  3. Na aba Editable Parameters, pesquise o parâmetro que deseja modificar e altere seu valor.

  4. Clique em OK e depois em Submit Parameters. Na caixa de diálogo, especifique quando as alterações entrarão em vigor.

Eficácia do recurso

Método de teste

Este teste usa o sysbench para comparar o impacto de desempenho de uma operação de DDL com e sem o recurso de DDL não bloqueante. Execute as etapas a seguir:

  1. Use o sysbench para criar uma tabela e inserir dados.

    sysbench oltp_read_write --db-ps-mode=auto --percentile=95 --mysql-host=$HOST --mysql-port=$PORT --mysql-user=$USER --mysql-db=$DB --tables=1 --table-size=50 --threads=16 prepare
  2. Inicie um teste de estresse com o sysbench para simular tráfego de negócios online.

    sysbench oltp_read_write --db-ps-mode=auto --percentile=95 --mysql-host=$HOST --mysql-port=$PORT --mysql-user=$USER --mysql-db=$DB --tables=1 --table-size=50 --threads=16 --report-interval=1 --time=100 run
  3. Em uma sessão separada, inicie uma transação de longa execução na tabela de destino para bloquear operações de DDL subsequentes.

    SELECT SLEEP(60) FROM sbtest1 LIMIT 1;
  4. Em outra sessão, com o recurso de DDL não bloqueante desativado, execute a seguinte operação de DDL e observe a alteração nas Transações Por Segundo (TPS).

    ALTER TABLE sbtest1 ENGINE = InnoDB;
    -- Expected result: The DDL thread is blocked because it cannot acquire the metadata lock (MDL).
  5. Ative o recurso de DDL não bloqueante definindo o parâmetro loose_rds_nonblock_ddl_retry_interval como 6 e o parâmetro loose_rds_nonblock_ddl_lock_wait_timeout como 1. Execute a mesma operação de DDL e observe a alteração no TPS.

    ALTER TABLE sbtest1 ENGINE = InnoDB;
    -- Expected result: The DDL thread intermittently acquires the metadata lock (MDL) and is not fully blocked.

Resultados do teste

  • Com o recurso de DDL não bloqueante desativado, o thread de DDL não consegue obter o bloqueio de metadados (MDL), resultando no bloqueio completo da sessão.

  • Quando o recurso de DDL não bloqueante está ativado, o thread de DDL obtém o bloqueio de metadados (MDL) de forma intermitente. Isso evita o bloqueio total da sessão e mantém a estabilidade do sistema.

image.png

image