Todos os produtos
Search
Central de documentação

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

Última atualização: Jun 26, 2026

O RDS for MySQL oferece suporte ao controle de tempo limite de espera por bloqueio DDL. Esse recurso permite usar uma hint para definir a duração da espera de uma thread DDL por um bloqueio MDL, evitando o bloqueio de sessões e o acúmulo de conexões causados por longas esperas.

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, modifique esse parâmetro antes da execução. O RDS for MySQL oferece uma forma mais simples de gerenciar o tempo de espera do bloqueio MDL para instruções DDL individuais: especifique o tempo limite diretamente na instrução usando as hints /*+ WAIT(n) */ e /*+ NO_WAIT() */.

Benefícios: O uso de hints proporciona melhor compatibilidade em comparação à introdução de nova sintaxe. A hint é gravada no binlog como comentário. Instâncias downstream ou serviços de assinatura incompatíveis com esse recurso ignoram automaticamente a hint e a tratam como um comentário comum. Isso evita erros de análise de SQL e interrupções na replicação.

Aplicabilidade

Este recurso está disponível apenas para instâncias que atendem aos seguintes requisitos de versão. Caso sua instância não atenda a esses requisitos, atualize a versão secundária do mecanismo ou faça 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 deste recurso:

  • Há suporte apenas para as operações CREATE, DROP, ALTER, RENAME, TRUNCATE e OPTIMIZE.

  • A hint não surte efeito em nós secundários ou instâncias somente leitura durante a replicação a partir do nó primário.

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

Sintaxe

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

-- Create table t1 and set the MDL timeout to 10 seconds.
CREATE /*+ WAIT(10) */ TABLE t1(a INT);

-- Add a column to table t1 with no wait for the MDL lock.
ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;

-- Drop table t1 and set the MDL timeout to 1 second.
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 hints /*+ 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 hints /*+ WAIT(n) */ e /*+ NO_WAIT() */, as operações DDL falham rapidamente e de forma previsível caso a aquisição do bloqueio não ocorra 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