Todos os produtos
Search
Central de documentação

PolarDB:DDL preemptivo

Última atualização: Jun 28, 2026

PolarDB for MySQL oferece o recurso de DDL preemptivo para evitar falhas em operações de Data Definition Language (DDL) causadas por consultas extensas ou transações longas em tabelas de nós somente leitura.

Sintomas

Ao executar uma operação DDL em um banco de dados PolarDB for MySQL, pode ocorrer um erro indicando a impossibilidade de obter um bloqueio de metadados (MDL). As seguintes mensagens de erro são exibidas:

ERROR HY000: Fail to get MDL on replica during DDL synchronize
ERROR HY000: Fail to get table lock on replica; you can 'set polar_support_mdl_sync_preemption = ON' and try restarting transaction

Pré-requisitos

Seu cluster PolarDB for MySQL deve utilizar uma das seguintes revisões:

  • PolarDB for MySQL 5.6: revisão 5.6.1.0.43 ou posterior.

  • PolarDB for MySQL 5.7: revisão 5.7.1.0.34 ou posterior.

  • PolarDB for MySQL 8.0.1: revisão 8.0.1.1.39 ou posterior.

  • PolarDB for MySQL 8.0.2: revisão 8.0.2.2.14 ou posterior.

Para verificar a revisão do seu cluster, consulte Visualizar a versão de um cluster.

Limitações

O recurso de DDL preemptivo é compatível apenas com nós somente leitura e não tem suporte no nó primário.

Observações de uso

  • Ativar o DDL preemptivo pode encerrar conexões que acessam a tabela de destino em um nó somente leitura ou reverter consultas SQL em andamento nessa tabela. Use esse recurso com cautela.

  • O DDL preemptivo só entra em vigor se o valor do parâmetro loose_replica_lock_wait_timeout for maior que o valor do parâmetro loose_polar_mdl_sync_preempt_after_wait_second somado a 5.

  • No PolarDB for MySQL 8.0.1 e no PolarDB for MySQL 8.0.2, esse recurso não suporta operações de renomeação. Recomendamos usar a instrução ALTER TABLE ... RENAME como alternativa.

Informações de fundo

O PolarDB for MySQL utiliza uma arquitetura de armazenamento compartilhado. Durante a execução de uma operação DDL, o nó primário adquire primeiro um bloqueio exclusivo de metadados (MDL-X) e instrui todos os nós somente leitura a adquirirem o mesmo bloqueio. Se uma transação estiver acessando a tabela de destino em um nó somente leitura, o processo de sincronização do bloqueio MDL será bloqueado. Caso o nó somente leitura não consiga adquirir o bloqueio MDL-X dentro do tempo limite especificado, o cliente retornará o erro ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize. Esse problema é comum em clusters PolarDB for MySQL com múltiplos nós somente leitura. O recurso de DDL preemptivo foi projetado para resolver essa questão.

Procedimento

Ative o recurso de DDL preemptivo por meio do parâmetro loose_polar_support_mdl_sync_preemption e defina o tempo limite de espera para preempção com o parâmetro loose_polar_mdl_sync_preempt_after_wait_second. Para mais informações, consulte Especificar parâmetros de cluster e nó. A tabela a seguir descreve os parâmetros.

Parameter

Level

Description

loose_polar_support_mdl_sync_preemption

Session

Controla o recurso de DDL preemptivo. Valores válidos:

  • ON: Ativa o recurso de DDL preemptivo.

  • OFF (Padrão): Desativa o recurso de DDL preemptivo.

loose_polar_mdl_sync_preempt_after_wait_second

Global

Define o tempo limite de espera, em segundos, quando a sincronização do bloqueio MDL está bloqueada. Se o bloqueio não for adquirido após esse período, o sistema inicia a preempção das threads bloqueantes.

Valores válidos: 1 a 31536000. Unidade: segundos. Valor padrão: 10.

Exemplos

Preemptive DDL disabled

  1. Em um nó somente leitura, execute uma consulta na tabela test.t1.

    mysql> use test;
    Database changed
    # A large query that runs for 100 seconds
    mysql> select sleep(100) from t1;
  2. No nó primário, adicione uma coluna à tabela.

    mysql > alter table t1 add column c int;
    ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize

    Este exemplo demonstra que, com o recurso de DDL preemptivo desativado, a operação DDL fica bloqueada e acaba falhando. Isso ocorre porque a transação longa no nó somente leitura impede a sincronização do bloqueio MDL.

    mysql> select sleep(100) from t1;
    +------------+
    | sleep(100) |
    +------------+
    |          0 |
    +------------+
    1 row in set (1 min 40.00 sec)

Preemptive DDL enabled

  1. Em um nó somente leitura, execute uma consulta na tabela test.t1.

    mysql> use test;
    Database changed
    # A large query that runs for 100 seconds
    mysql> select sleep(100) from t1;
  2. No nó primário, adicione uma coluna à tabela.

    mysql> alter table t1 add column c int;
    Query OK, 0 rows affected (11.13 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    Este exemplo mostra que, quando o recurso de DDL preemptivo está ativado, a sincronização do bloqueio MDL é inicialmente bloqueada pela transação longa. Após um período de espera, o recurso realiza a preempção da thread bloqueante e a operação DDL é concluída com sucesso.

    mysql> select sleep(100) from t1;
    ERROR 2013 (HY000): Lost connection to MySQL server during query

Fale conosco

Se você tiver alguma dúvida sobre operações DDL, entre em contato com o suporte técnico.