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 INDEXeDROP INDEXsão suportadas. Para executar uma operaçãoOPTIMIZE TABLE, useALTER 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 |
|
|
|
|
Modifique parâmetros
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.
No painel de navegação à esquerda, clique em Parameters.
Na aba Editable Parameters, pesquise o parâmetro que deseja modificar e altere seu valor.
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:
-
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 -
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 -
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; -
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). -
Ative o recurso de DDL não bloqueante definindo o parâmetro
loose_rds_nonblock_ddl_retry_intervalcomo 6 e o parâmetroloose_rds_nonblock_ddl_lock_wait_timeoutcomo 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.

