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,TRUNCATEeOPTIMIZE.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
-
Abra uma sessão, crie a tabela
t1e adquira um bloqueio MDL S na tabela.CREATE TABLE t1(a INT); LOCK TABLE t1 READ; -
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