Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Controle de tempo limite de espera de bloqueio DDL

Última atualização: Oct 12, 2026

O RDS for MySQL oferece suporte ao controle de tempo limite de espera de bloqueio DDL. Esse recurso permite usar uma dica para controlar por quanto tempo uma thread DDL aguarda um bloqueio MDL, o que evita o bloqueio de sessões e o acúmulo de conexões causados por esperas prolongadas de bloqueio.

Visão geral

Introdução: No MySQL, o parâmetro lock_wait_timeout controla o tempo limite do bloqueio MDL. Para controlar com precisão o tempo de espera de uma operação DDL específica, é necessário modificar esse parâmetro antes da execução. O RDS for MySQL oferece uma forma mais simples de controlar o tempo de espera do bloqueio MDL para instruções DDL individuais: você pode especificar o tempo limite diretamente na instrução usando as dicas /*+ WAIT(n) */ e /*+ NO_WAIT() */.

Benefícios: O uso de uma dica oferece melhor compatibilidade do que a introdução de nova sintaxe. A dica é gravada no binlog como um comentário. Instâncias downstream ou serviços de assinatura que não suportam esse recurso ignoram automaticamente a dica, tratando-a como um comentário comum. Isso evita erros de parsing de SQL e interrupções na replicação.

Aplicabilidade

Esse recurso está disponível apenas para instâncias que atendem aos seguintes requisitos de versão. Se a sua instância não atender a esses requisitos, você pode atualizar a versão secundária do mecanismo ou fazer upgrade da versão principal do banco de dados.

  • MySQL 8.4

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

As seguintes limitações se aplicam ao uso desse recurso:

  • Somente as operações CREATE, DROP, ALTER, RENAME, TRUNCATE e OPTIMIZE são suportadas.

  • A dica não entra em vigor em nós secundários ou instâncias somente leitura durante a replicação a partir do nó principal.

  • Na dica /*+ WAIT(n) */, n especifica o tempo de espera em segundos e deve estar no intervalo [0, 31536000].

Sintaxe

Para as operações CREATE, DROP, ALTER, RENAME, TRUNCATE e OPTIMIZE, adicione a dica /*+ WAIT(n) */ ou /*+ NO_WAIT() */ imediatamente após a palavra-chave para controlar o tempo de espera do bloqueio MDL. Exemplos:

-- Criar a tabela t1 e definir o tempo limite de MDL para 10 segundos.
CREATE /*+ WAIT(10) */ TABLE t1(a INT);

-- Adicionar uma coluna à tabela t1 sem aguardar o bloqueio MDL.
ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;

-- Excluir a tabela t1 e definir o tempo limite de MDL para 1 segundo.
DROP /*+ WAIT(1) */ TABLE t1;

Exemplo

Procedimento de teste

  1. Abra uma sessão, crie a tabela t1 e adquira um bloqueio MDL S na tabela.

    CREATE TABLE t1(a INT);
    LOCK TABLE t1 READ;
  2. Em uma segunda sessão, tente alterar e excluir a tabela usando as dicas /*+ WAIT(n) */ e /*+ NO_WAIT() */ e observe os resultados.

    ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;
    DROP /*+ WAIT(1) */ TABLE t1;

Resultados do teste

Com as dicas /*+ WAIT(n) */ e /*+ NO_WAIT() */, as operações DDL falham de forma rápida e previsível quando o bloqueio não é adquirido dentro do tempo limite especificado.

mysql> ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> DROP /*+ WAIT(1) */ TABLE t1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction