Quando uma transação de longa duração em um nó somente leitura mantém um metadata lock (MDL) em uma tabela, as operações de linguagem de definição de dados (DDL) no nó primário ficam bloqueadas até o término da transação ou até o tempo de replica_lock_wait_timeout expirar (padrão: 50 segundos). Ao atingir o tempo limite, a operação DDL falha com a mensagem ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize.
Defina polar_slave_work_on_nonblock_mdl_mode como ON para permitir que as operações DDL continuem no nó primário sem aguardar a liberação de MDLs conflitantes nos nós somente leitura.
Como funciona
Em um cluster PolarDB for MySQL, as operações DDL no nó primário precisam sincronizar os MDLs com todos os nós somente leitura antes da conclusão. Caso uma transação de longa duração em um nó somente leitura mantenha um MDL na tabela de destino, a sincronização do MDL será bloqueada até o fim da transação ou até replica_lock_wait_timeout expirar.
Com polar_slave_work_on_nonblock_mdl_mode definido como ON, as operações DDL no nó primário prosseguem imediatamente, sem esperar pelos MDLs conflitantes nos nós somente leitura. A contrapartida é que uma transação em um nó somente leitura pode observar esquemas de tabela diferentes dentro de uma única transação se uma operação DDL for executada simultaneamente no nó primário.
Este parâmetro resolve o bloqueio de MDL apenas quando a causa raiz é uma transação de longa duração. Ele não resolve bloqueios causados porLOCK TABLESouFLUSH TABLES— esses MDLs exigem um comandoUNLOCK TABLESexplícito para liberação.
Pré-requisitos
Antes de ativar este parâmetro, verifique se o cluster atende a todas as condições abaixo.
Requisito de versão — o cluster deve estar em uma das seguintes versões:
PolarDB for MySQL 8.0, versão de revisão 8.0.1.1.23 ou posterior
PolarDB for MySQL 5.7, versão de revisão 5.7.1.0.19 ou posterior
PolarDB for MySQL 5.6, versão de revisão 5.6.1.0.32 ou posterior
Para verificar a versão de revisão do cluster, consulte Consultar a versão do mecanismo .
Requisito de nível de isolamento — o nível de isolamento de transação nos nós somente leitura deve ser Read Committed ou Read Uncommitted. O parâmetro não tem efeito sob os isolamentos Repeatable Read ou Serializable.
Diagnosticar bloqueio de MDL
Antes de ativar o parâmetro, confirme que transações de longa duração (e não LOCK TABLES ou FLUSH TABLES) são a causa raiz do bloqueio. O parâmetro não desbloqueia MDLs mantidos por bloqueios explícitos de tabela.
Etapa 1: No nó primário — execute SHOW PROCESSLIST e verifique se alguma linha apresenta State = Wait for syncing with replicas. Em caso afirmativo, uma operação DDL está bloqueada aguardando a sincronização de MDL em um nó somente leitura.
SHOW PROCESSLIST;
Etapa 2: Em um nó somente leitura — identifique a transação que causa o bloqueio:
SELECT * FROM information_schema.innodb_log_mdl_slot WHERE slot_state = 'SLOT_ACQUIRING';
Se a consulta retornar linhas, uma transação de longa duração mantém um MDL:
+---------+----------------+-----------+----------+-----------+
| slot_id | slot_state | slot_name | slot_lsn | thread_id |
+---------+----------------+-----------+----------+-----------+
| 0 | SLOT_ACQUIRING | test/t | 35025648 | thread-0 |
+---------+----------------+-----------+----------+-----------+
Próximas etapas com base na saída:
|
Situação |
Ação |
|
A consulta retorna linhas (transação de longa duração confirmada) |
Ative |
|
A consulta não retorna linhas |
O bloqueio não é causado por uma transação de longa duração. Verifique se há instruções |
Ativar o parâmetro
Faça login no console do PolarDB.
No canto superior esquerdo, selecione a região onde o cluster está implantado.
Localize o cluster e clique em seu ID.
No painel de navegação à esquerda, escolha Settings and Management > Parameters.
-
Encontre
loose_polar_slave_work_on_nonblock_mdl_modee clique em Modify Parameter.
-
Clique em Submit Changes. Na caixa de diálogo Save Changes, clique em OK.

Limitações e efeitos colaterais
|
Categoria |
Detalhe |
|
Escopo |
Aplica-se apenas a nós somente leitura. Não surte efeito no nó primário. |
|
Bloqueio/limpeza de tabelas |
Não ignora MDLs mantidos por |
|
Tempo limite de consulta paralela |
Após ativar este parâmetro, falhas na sincronização de MDL ainda podem ocorrer se consultas paralelas nos nós somente leitura durarem mais que |
|
Consistência de esquema |
Quando o parâmetro está definido como |
Comportamento de consistência de esquema quando o parâmetro está ON
Quando polar_slave_work_on_nonblock_mdl_mode está definido como ON, uma operação DDL no nó primário deixa de esperar por transações em andamento nos nós somente leitura. Como resultado, uma única transação em um nó somente leitura pode observar dois esquemas de tabela diferentes.
|
Nó somente leitura (Sessão 1) |
Nó primário (Sessão 2) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
O segundo SELECT na Sessão 1 retorna o esquema atualizado porque a operação DDL na Sessão 2 foi concluída enquanto a transação ainda estava aberta.
Quando o parâmetro está definido como OFF (padrão), a operação DDL na Sessão 2 fica bloqueada até que a Sessão 1 faça commit ou até replica_lock_wait_timeout expirar, retornando ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize.
Fale conosco
Se você tiver dúvidas sobre operações DDL, entre em contato com o suporte técnico.