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 ... RENAMEcomo 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:
|
|
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
Preemptive DDL enabled
Fale conosco
Se você tiver alguma dúvida sobre operações DDL, entre em contato com o suporte técnico.