A linguagem de manipulação de dados (DML) sem bloqueio no Data Management (DMS) permite executar instruções UPDATE, DELETE e INSERT...SELECT em grandes conjuntos de dados sem bloquear tabelas ou degradar o desempenho do banco de dados. O mecanismo do DMS divide automaticamente os dados de destino em lotes e executa a instrução lote a lote, com uma breve pausa entre cada execução para proteger a replicação entre primário e secundário e reduzir a carga do banco de dados.
Contexto
Com o crescimento dos dados de negócios, é comum precisar limpar dados históricos ou atualizar grandes partes de uma tabela. Duas abordagens frequentes apresentam riscos significativos:
Criação de scripts para divisão de dados: O uso da cláusula
LIMITpara paginar exclusões ou atualizações é um erro frequente. ComoLIMITsem varredura por índice força uma varredura completa da tabela, o bloqueio ainda pode ocorrer. Mesmo com uma divisão correta, um intervalo de lotes mal ajustado pode causar atrasos graves na replicação entre os bancos de dados primário e secundário.Extração manual por DBA: Dividir manualmente grandes conjuntos de dados consome tempo, está sujeito a erros e torna-se difícil de ajustar durante a execução.
Além dos riscos mencionados, dois modos de falha adicionais podem ocorrer ao operar diretamente em tabelas grandes:
Uma única instrução SQL que afeta muitas linhas pode fazer com que o número de entradas de log exceda o limite superior, resultando na falha total da instrução.
A execução de uma instrução SQL sem o uso de índices especificados pode causar bloqueio de tabela, aumentar a carga do banco de dados e, em casos graves, levar a falhas nos negócios.
A DML sem bloqueio elimina ambos os riscos ao automatizar a divisão em lotes e o controle de fluxo dentro do DMS.
Funcionamento
A DML sem bloqueio processa uma única instrução SQL em três etapas:
Divisão de dados — O mecanismo do DMS analisa a instrução e divide as linhas correspondentes em vários lotes com base em intervalos de índice, evitando varreduras completas da tabela.
Execução em lotes — O DMS executa a instrução em um lote por vez, mantendo apenas bloqueios de curta duração no nível da linha durante cada lote.
Intervalo de espera — Após a conclusão de cada lote, o DMS aguarda brevemente antes de iniciar o próximo. Esse intervalo permite que o banco de dados secundário acompanhe a replicação, mantendo o atraso entre primário e secundário dentro de limites aceitáveis.
Benefícios
As operações de alteração de grandes volumes de dados não afetam seus negócios.
Redução do impacto no desempenho e no armazenamento do banco de dados.
Garantia de eficiência na execução mesmo para grandes volumes de alterações de dados.
Bancos de dados suportados
|
Mecanismo de banco de dados |
Instâncias suportadas |
|
MySQL |
ApsaraDB RDS for MySQL, PolarDB for MySQL, MyBase for MySQL, PolarDB for Xscale, bancos de dados MySQL de terceiros |
|
PostgreSQL |
ApsaraDB RDS for PostgreSQL, PolarDB for PostgreSQL, MyBase for PostgreSQL, bancos de dados PostgreSQL de terceiros |
|
MariaDB |
ApsaraDB for MariaDB, bancos de dados MariaDB de terceiros |
|
OceanBase |
ApsaraDB for OceanBase no modo MySQL |
|
Compatível com Oracle |
PolarDB for PostgreSQL (Compatible with Oracle) |
Limitações
Somente as instruções UPDATE, DELETE e INSERT...SELECT são suportadas.
UPDATE e DELETE
|
Restrição |
Detalhes |
|
Escopo da tabela |
Apenas tabela única |
|
Cláusula WHERE |
Obrigatória. Para atualizar ou excluir todas as linhas, use |
|
Subconsultas |
Não suportadas |
|
Cláusula LIMIT |
Não suportada — o uso de |
INSERT...SELECT
|
Restrição |
Detalhes |
|
Escopo do SELECT |
Apenas tabela única |
|
Cláusula WHERE |
Obrigatória na cláusula SELECT. Para selecionar todas as linhas, use |
|
Cláusulas não permitidas |
|
Casos de uso
Limpeza de dados históricos — Exclua linhas desnecessárias sem bloquear leituras ou gravações na tabela de produção.
Atualização de todas as linhas — Aplique uma atualização de coluna em toda a tabela sem causar atrasos na replicação ou interrupção do serviço.