Todos os produtos
Search
Central de documentação

ApsaraDB RDS:DDL sem bloqueio

Última atualização: Oct 12, 2026

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

Como funciona

Contexto: No MySQL, uma operação de DDL precisa adquirir um metadata lock 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 de espera porque não consegue adquirir o lock imediatamente. Como um lock MDL-X pendente tem a prioridade mais alta, ele bloqueia todo o acesso subsequente à tabela de destino. Isso pode causar bloqueio de sessões, acúmulo de conexões e atrasos nas respostas. Em casos graves, pode tornar todo o sistema indisponível.

Introdução: O recurso de DDL sem bloqueio no ApsaraDB RDS for MySQL altera a forma como os threads de DDL adquirem e aguardam metadata locks (MDL). Ele substitui uma única espera longa por uma série de esperas curtas e intermitentes. Durante os intervalos entre as esperas, o thread de DDL libera a solicitação do lock MDL-X, o que permite que novas sessões acessem a tabela de destino. Assim, o thread de DDL não bloqueia outras sessões de acessar a tabela de destino por um período prolongado.

Observações de uso

Para usar o recurso de DDL sem bloqueio, a instância deve atender a um dos seguintes requisitos de versão. Se a instância não atender 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 sem bloqueio tem 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 como alternativa.

  • Este recurso fica inativo em nós secundários e instâncias somente leitura quando os dados são sincronizados a partir do nó primário.

  • Ativar este recurso reduz a prioridade das operações de DDL. Isso aumenta a probabilidade de falha de uma operação de DDL por não conseguir adquirir um metadata lock (MDL).

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 sem bloqueio. Quando este recurso está ativado, o thread de DDL tenta adquirir um metadata lock (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: O intervalo de tempo entre as tentativas de repetição após um thread de DDL não conseguir adquirir um metadata lock (MDL).

  • Escopo: Nível de sessão.

  • Tipo de dados: Integer.

  • Valor padrão: 0. O valor 0 indica que o recurso de DDL sem bloqueio 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: O tempo limite para cada tentativa intermitente de um thread de DDL adquirir um metadata lock (MDL).

  • Escopo: Nível de sessão.

  • Tipo de dados: Integer.

  • Valor padrão: 1.

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

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

Modificar 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, encontre a instância RDS e clique 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 o valor.

  4. Clique em OK e, em seguida, clique 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 no desempenho de uma operação de DDL com e sem o recurso de DDL sem bloqueio. Execute as seguintes etapas:

  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 carga com o sysbench para simular tráfego de produção.

    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 duração na tabela de destino para bloquear as operações de DDL subsequentes.

    SELECT SLEEP(60) FROM sbtest1 LIMIT 1;
  4. Em outra sessão, com o recurso de DDL sem bloqueio 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 sem bloqueio 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 nas 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

  • Quando o recurso de DDL sem bloqueio está desativado, o thread de DDL não consegue adquirir o metadata lock (MDL) e a sessão fica completamente bloqueada.

  • Quando o recurso de DDL sem bloqueio está ativado, o thread de DDL adquire o metadata lock (MDL) de forma intermitente. Isso impede que a sessão fique completamente bloqueada e mantém a estabilidade do sistema.

image.png

image