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 INDEXeDROP INDEXsão suportadas. Para executar uma operaçãoOPTIMIZE TABLE, useALTER TABLE ... ENGINE = InnoDBcomo 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 |
|
|
|
|
Modificar 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, encontre a instância RDS e clique 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 o valor.
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:
-
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 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 -
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; -
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). -
Ative o recurso de DDL sem bloqueio 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 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.

