Todos os produtos
Search
Central de documentação

PolarDB:Prevent long-running transactions on read-only nodes from blocking DDL operations

Última atualização: Jun 28, 2026

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 por LOCK TABLES ou FLUSH TABLES — esses MDLs exigem um comando UNLOCK TABLES explí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 polar_slave_work_on_nonblock_mdl_mode para evitar ocorrências futuras. Para desbloquear imediatamente a operação DDL atual, encerre a transação bloqueadora usando o thread_id obtido na saída.

A consulta não retorna linhas

O bloqueio não é causado por uma transação de longa duração. Verifique se há instruções LOCK TABLES ou FLUSH TABLES ativas e libere-as com UNLOCK TABLES.

Ativar o parâmetro

  1. Faça login no console do PolarDB.

  2. No canto superior esquerdo, selecione a região onde o cluster está implantado.

  3. Localize o cluster e clique em seu ID.

  4. No painel de navegação à esquerda, escolha Settings and Management > Parameters.

  5. Encontre loose_polar_slave_work_on_nonblock_mdl_mode e clique em Modify Parameter.

    参数配置

  6. 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 LOCK TABLES ou FLUSH TABLES. Libere esses bloqueios com UNLOCK TABLES.

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 replica_lock_wait_timeout (padrão: 50 segundos).

Consistência de esquema

Quando o parâmetro está definido como ON, uma transação em um nó somente leitura pode observar esquemas de tabela diferentes antes e depois de uma operação DDL simultânea no nó primário. Consulte a seção abaixo para ver um exemplo.

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)

BEGIN;

SELECT * FROM test.t; — retorna apenas a coluna a

ALTER TABLE test.t ADD COLUMN b INT; — conclui imediatamente

SELECT * FROM test.t; — retorna as colunas a e b

COMMIT;

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.