Todos os produtos
Search
Central de documentação

PolarDB:Como impedir que transações de longa duração em nós somente leitura bloqueiem operações DDL

Última atualização: Oct 12, 2026

PolarDB oferece o parâmetro polar_slave_work_on_nonblock_mdl_mode. Ao ativar esse parâmetro, você impede que transações de longa duração nos nós somente leitura do PolarDB bloqueiem operações DDL no nó primário. Este tópico descreve como ativar esse parâmetro no PolarDB.

Limites

As versões do cluster PolarDB devem atender a um dos seguintes requisitos:

  • PolarDB for MySQL 8.0 com versão de revisão 8.0.1.1.23 ou posterior

  • PolarDB for MySQL 5.7 com versão de revisão 5.7.1.0.19 ou posterior

  • PolarDB for MySQL 5.6 com versão de revisão 5.6.1.0.32 ou posterior

Nota

Verifique a versão do kernel do seu cluster consultando Consultar a versão do mecanismo.

O nível de isolamento de transação nos nós somente leitura do PolarDB deve ser Read Committed ou Read Uncommitted para que o parâmetro polar_slave_work_on_nonblock_mdl_mode tenha efeito.

polar_slave_work_on_nonblock_mdl_mode tem efeito apenas nos nós somente leitura do PolarDB.

Informações de fundo

Os nós somente leitura do PolarDB executam transações de longa duração que mantêm continuamente bloqueios de metadados (MDLs) nas tabelas acessadas. Esses bloqueios impedem que as operações DDL no nó primário do PolarDB concluam a sincronização de MDL. As operações DDL acabam atingindo o tempo limite e retornam o erro ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize.

Nota

O tempo limite para sincronização de MDL é controlado pelo parâmetro replica_lock_wait_timeout, cujo valor padrão é 50 segundos.

Quando esse problema ocorre, execute o comando show processlist no nó primário do PolarDB. Se o campo State no resultado da consulta exibir Wait for syncing with replicas, execute o seguinte comando em um nó somente leitura do PolarDB para consultar as informações de MDL em estado de espera: select * from information_schema.innodb_log_mdl_slot where slot_state = "SLOT_ACQUIRING". Se esse comando retornar o resultado a seguir, existe um problema de espera de MDL no nó somente leitura do PolarDB.

+---------+----------------+-----------+----------+-----------+
| slot_id | slot_state     | slot_name | slot_lsn | thread_id |
+---------+----------------+-----------+----------+-----------+
|       0 | SLOT_ACQUIRING | test/t    | 35025648 | thread-0  |
+---------+----------------+-----------+----------+-----------+

Notas de uso

polar_slave_work_on_nonblock_mdl_mode resolve apenas o bloqueio de DDL causado por transações de longa duração. Após ativar o polar_slave_work_on_nonblock_mdl_mode, você ainda pode encontrar falhas de sincronização de MDL causadas por consultas grandes (ou seja, consultas que demoram mais que o tempo limite de sincronização de MDL).

Os MDLs adquiridos por LOCK TABLES e FLUSH TABLES devem ser liberados explicitamente com a execução de UNLOCK TABLES. Portanto, polar_slave_work_on_nonblock_mdl_mode não resolve o bloqueio de MDL causado por LOCK TABLES e FLUSH TABLES.

Procedimento

  1. Faça login no console do PolarDB.

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

  3. Encontre o cluster desejado e clique no respectivo ID.

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

  5. Encontre o parâmetro loose_polar_slave_work_on_nonblock_mdl_mode e clique em Modify Parameter.

    Na caixa de pesquisa, insira loose_polar_slave_work_on_nonblock_mdl_mode. O valor atual desse parâmetro para o cluster é ON, o parâmetro global é Yes e o intervalo de modificação é [ON|OFF]. Clique em Modify Parameter.

  6. Após modificar o parâmetro, clique em Submit Changes. Na caixa de diálogo Save Changes, clique em OK.

Exemplos

Após ativar o polar_slave_work_on_nonblock_mdl_mode, a mesma transação em um nó somente leitura pode ver esquemas de tabela diferentes, conforme o exemplo a seguir:

  1. Primeiro, consulte test.t em um nó somente leitura:

    mysql> begin;
    mysql> select * from test.t;
    +------+
    | a    |
    +------+
    |    1 |
    +------+
    1 row in set (0.00 sec)
  2. Em seguida, execute uma operação DDL em test.t no nó primário:

    mysql> alter table test.t add column b int;
    Query OK, 0 rows affected (0.32 sec)
    Records: 0  Duplicates: 0  Warnings: 0
  3. Por fim, consulte test.t novamente no nó somente leitura:

    mysql> select * from test.t;
    +------+------+
    | a    | b    |
    +------+------+
    |    1 | NULL |
    +------+------+
    1 row in set (0.00 sec)

O exemplo anterior demonstra que, quando polar_slave_work_on_nonblock_mdl_mode está ativado, uma operação DDL no nó primário faz com que a mesma transação no nó somente leitura veja um número diferente de colunas. Se você desativar o polar_slave_work_on_nonblock_mdl_mode, a operação DDL no nó primário continua esperando a transação no nó somente leitura até que a transação seja confirmada ou o tempo limite seja atingido (erro: ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize).

Fale conosco

Se tiver dúvidas sobre operações DDL, Fale conosco.