Alterações de schema em bancos de dados ativos envolvem riscos: bloqueios prolongados de tabela podem paralisar sua aplicação. O Online DDL no PolarDB-X minimiza o bloqueio de tabelas para permitir a execução simultânea de operações DDL e transações DML, mantendo o banco de dados responsivo durante as mudanças de schema.
Pré-requisitos
Antes de executar operações de Online DDL, confirme os seguintes itens:
A versão do nó de computação deve ser 5.4.16-16717637 ou posterior para habilitar a gravação múltipla assíncrona em operações DDL executadas logicamente. Consulte Notas de versão.
Os requisitos de versão e condições variam conforme o tipo de DDL. Consulte Instruções de partição, Instant ADD COLUMN, Alterar tipos de coluna sem bloquear tabelas, Sequence, Colunas geradas, Como usar índices secundários globais e Instruções de grupo de tabelas.
Como funciona
O PolarDB-X executa comandos DDL de duas formas, dependendo do tipo de operação.
O DDL executado fisicamente é enviado aos nós de dados. O nó de computação gerencia o encaminhamento no nível de shard, a coordenação e os metadados. Operações desta categoria — CREATE LOCAL INDEX, ALTER/ADD COLUMN e CREATE/DROP TABLE — seguem os mesmos princípios de execução online do MySQL DDL.
O DDL executado logicamente roda inteiramente nos nós de computação. Ao iniciar uma operação DDL lógica, o sistema cria uma tabela temporária, copia os dados existentes para ela e captura simultaneamente as atualizações incrementais de DML. Após a sincronização dos dados históricos e incrementais, o sistema transfere o tráfego da tabela original para a temporária sem bloqueá-la. Esta categoria inclui GLOBAL INDEX, CREATE/DROP PARTITION, CREATE/DROP PRIMARY KEY e Alterar tipos de coluna sem bloquear tabelas.
Impacto de cada tipo de DDL na carga de trabalho
Para avaliar o impacto de uma operação DDL no banco de dados, verifique três aspectos:
Bloqueio de tabela
O Online DDL bloqueia comandos DML apenas por alguns segundos durante a troca final de tabela. Durante a maior parte da execução, o DML roda livremente.
Operações DDL não online mantêm a tabela bloqueada durante todo o processo.
Preenchimento de dados (backfill)
Operações que alteram apenas metadados — como
INSTANT ADD COLUMNeRENAME TABLE— são concluídas instantaneamente, sem necessidade de backfill.Os comandos
DROP TABLEeDROP INDEXmodificam metadados e removem arquivos físicos rapidamente, também sem backfill.Todas as demais operações DDL copiam os dados originais para novos índices clusterizados ou secundários. O tempo de execução varia conforme o volume de dados, a concorrência e as especificações da instância.
Gravação múltipla síncrona
Operações DDL executadas logicamente que exigem backfill precisam também gravar o tráfego DML concomitante na tabela temporária. Como essas gravações múltiplas utilizam transações distribuídas para garantir atomicidade, as operações DML rodam como operações lógicas nesse período, o que reduz o desempenho do DML online.
Para minimizar esse impacto, o PolarDB-X implementa gravação múltipla assíncrona para MOVE/SPLIT PARTITION, Alterar tipos de coluna sem bloquear tabelas e REBALANCE. O tráfego DML é armazenado em cache e reexecutado após a conclusão do backfill, reduzindo conflitos e encurtando a janela de degradação de desempenho.
No caso de DDL executado fisicamente com backfill de dados e sem bloqueio, a gravação múltipla assíncrona nativa ocorre automaticamente via logs online. Operações sem backfill não exigem gravação múltipla.
Referência de recursos do Online DDL
Ao usar MODIFY COLUMN ou CHANGE COLUMN, sempre especifique os atributos completos da coluna. A omissão de atributos pode causar modificações inesperadas. Execute SHOW FULL CREATE TABLE TABLE_NAME para visualizar as definições completas das colunas antes de fazer alterações.
Operações de índice
|
Operação |
Executada logicamente |
Bloqueia a tabela |
Reconstrói a tabela |
Faz backfill de dados |
Gravação múltipla assíncrona |
|
Criar um índice secundário local (LSI) |
Não |
Não |
Não |
Sim |
— |
|
Excluir um LSI |
Não |
Não |
Não |
Não |
— |
|
Renomear um LSI |
Não |
Não |
Não |
Não |
— |
|
Criar um índice secundário global (GSI) |
Sim |
Não |
Sim |
Sim |
Não |
|
Excluir um GSI |
Sim |
Não |
Não |
Não |
— |
|
Renomear um GSI |
Sim |
Não |
Não |
Não |
— |
Operações de tabela
|
Operação |
Executada logicamente |
Bloqueia a tabela |
Reconstrói a tabela |
Faz backfill de dados |
Gravação múltipla assíncrona |
|
Modificar o formato de linha (ROW_FORMAT) |
Não |
Não |
Sim |
Sim |
— |
|
OPTIMIZE TABLE |
Não |
Não |
Sim |
Sim |
— |
|
Renomear uma tabela |
Não |
Não |
Não |
Não |
— |
|
Modificar o conjunto de caracteres padrão |
Não |
Não |
Sim |
Sim |
— |
|
Converter o conjunto de caracteres |
Não |
Sim |
Sim |
Sim |
— |
|
Truncar uma tabela sem GSIs (TRUNCATE TABLE WITHOUT GSI) |
Não |
Não |
Sim |
Não |
— |
|
Truncar uma tabela com GSIs (TRUNCATE TABLE WITH GSI) |
Sim |
Não |
Sim |
Não |
— |
Operações de partição
Os recursos de Online DDL nesta tabela aplicam-se tanto a grupos de tabelas quanto a tabelas individuais.
| Operação | Executada logicamente | Bloqueia a tabela | Reconstrói a tabela | Faz backfill de dados | Gravação múltipla assíncrona |
|---|---|---|---|---|---|
| Migrar uma partição | Sim | Não | Sim (apenas partições relevantes) | Sim | Sim* |
| Dividir uma partição | Sim | Não | Sim (apenas partições relevantes) | Sim | |
| Mesclar partições | Sim | Não | Sim (apenas partições relevantes) | Sim | Não |
| Adicionar uma partição | Sim | Não | Não | Não† | — |
| Excluir uma partição | Sim | Não | Não | Não‡ | — |
| Reorganizar partições | Sim | Não | Sim (apenas partições relevantes) | Sim | Não |
| Limpar uma partição | Sim | Não | Não | Não | — |
| Renomear uma partição | Sim | Não | Não | Não | — |
| Modificar uma partição | Sim | Não | Sim (apenas partições relevantes) | Sim | Não |
\* Condições para gravação múltipla assíncrona na migração de partição:
Tabelas lógicas e GSIs com chave primária explícita ou implícita: suportado.
Índices secundários globalmente únicos (sem chave primária): não suportado.
† Comportamento de backfill ao adicionar uma partição:
Tabela RANGE ou RANGE COLUMNS sem partição
MAXVALUE: backfill desnecessário. Caso contrário, ocorre backfill de dados de partições específicas.Tabela LIST ou LIST COLUMNS sem partição
DEFAULT: backfill desnecessário. Caso contrário, ocorre backfill de dados de partições específicas.
‡ Comportamento de backfill ao excluir uma partição:
Tabela RANGE ou RANGE COLUMNS: sem backfill ao excluir a última partição; backfill necessário para as demais.
Tabela LIST ou LIST COLUMNS sem partição
DEFAULT: backfill desnecessário. Caso contrário, o backfill é obrigatório.
Operações de sequence
|
Operação |
Executada logicamente |
Bloqueia a tabela |
Reconstrói a tabela |
Faz backfill de dados |
Gravação múltipla assíncrona |
|
Criar uma sequence |
Sim |
Não |
Não |
Não |
— |
|
Excluir uma sequence |
Sim |
Não |
Não |
Não |
— |
|
Modificar atributos da sequence |
Sim |
Não |
Não |
Não |
— |
|
Converter o tipo da sequence |
Sim |
Não |
Não |
Não |
— |
Operações comuns de coluna
As operações de coluna dividem-se em operações comuns (sem relação com chave primária, chaves de partição ou colunas geradas), alterações de chave primária e de partição, e operações de colunas geradas. Execute SHOW FULL CREATE TABLE TABLE_NAME para visualizar os atributos completos da coluna antes de determinar a categoria da operação.
|
Operação |
Executada logicamente |
Bloqueia a tabela |
Reconstrói a tabela |
Faz backfill de dados |
Gravação múltipla assíncrona |
|
Adicionar uma coluna (ver Nota 1) |
Não |
Não |
Sim |
Sim |
— |
|
Excluir uma coluna |
Não |
Não |
Sim |
Sim |
— |
|
Renomear uma coluna |
Não |
Não |
Não |
Não |
— |
|
Alterar a ordem das colunas |
Não |
Não |
Sim |
Sim |
— |
|
Alterar o valor padrão de uma coluna |
Não |
Não |
Não |
Não |
— |
|
Remover o valor padrão de uma coluna |
Não |
Não |
Não |
Não |
— |
|
Modificar o tipo de dados de uma coluna |
Não |
Sim |
Sim |
Sim |
— |
|
Aumentar o comprimento de uma coluna VARCHAR (ver Nota 2 e Nota 3) |
Não |
Não |
Não |
Não |
— |
|
Aumentar o comprimento de uma coluna CHAR (ver Nota 3) |
Não |
Sim |
Sim |
Sim |
— |
|
Alterar uma coluna para NULL |
Não |
Não |
Sim |
Sim |
— |
|
Alterar uma coluna para NOT NULL* |
Não |
Não |
Sim |
Sim |
— |
\* Se o SQL_MODE contiver strict_trans_tables ou strict_all_tables, trata-se de uma operação online. Caso contrário, utiliza-se o algoritmo COPY, que bloqueia a tabela e copia os dados.
Nota 1 — Opções de algoritmo para adição de coluna:
Quando se especifica explicitamente ALGORITHM=INSTANT ou ALGORITHM=OMC, o comportamento muda:
|
Operação |
Executada logicamente |
Bloqueia a tabela |
Reconstrói a tabela |
Faz backfill de dados |
Gravação múltipla assíncrona |
|
Não |
Não |
Não |
Não |
— |
|
|
Alterar o tipo de coluna online |
Sim |
Não |
Sim |
Sim |
Sim |
Nota 2 — Extensão de VARCHAR em nós de dados 5,7 vs. 8,0:
Nós de dados 5,7 permitem aumentar o comprimento de colunas VARCHAR com o algoritmo INPLACE. Nós de dados 8,0 não oferecem esse suporte.
O overhead de armazenamento muda no limite de 256 bytes: colunas com até 255 bytes usam 1 byte para armazenar o comprimento; colunas com 256 bytes ou mais usam 2 bytes. Aumentar uma coluna VARCHAR além desse limite exige mais do que uma simples alteração de metadados.
|
Operação |
Executada logicamente |
Bloqueia a tabela |
Reconstrói a tabela |
Faz backfill de dados |
Gravação múltipla assíncrona |
|
Aumentar comprimento de VARCHAR para mais de 256 bytes |
Não |
Não |
Sim |
Sim |
— |
Nota 3 — Extensão de CHAR em nós de dados 5,7 vs. 8,0:
Nós de dados 5,7 permitem aumentar o comprimento de colunas CHAR com o algoritmo INPLACE. Nós de dados 8,0 não oferecem esse suporte.
|
Operação |
Executada logicamente |
Bloqueia a tabela |
Reconstrói a tabela |
Faz backfill de dados |
Gravação múltipla assíncrona |
|
Aumentar comprimento de coluna CHAR |
Não |
Não |
Sim |
Sim |
— |
Operações de chave primária e coluna de sharding
|
Operação |
Executada logicamente |
Bloqueia a tabela |
Reconstrói a tabela |
Faz backfill de dados |
Gravação múltipla assíncrona |
|
Adicionar uma chave primária |
Sim |
Não |
Sim |
Sim |
Não |
|
Excluir a chave primária original e adicionar uma nova |
Sim |
Não |
Sim |
Sim |
Não |
|
Alterar o método de sharding, o número de shards ou as colunas de sharding |
Sim |
Não |
Sim (GSI ou tabela primária recriada) |
Sim |
Não |
|
Alterar a definição da coluna de sharding de um GSI ou tabela primária |
Sim |
Não |
Sim (GSI ou tabela primária recriada) |
Sim |
Não |
Operações de coluna gerada
|
Operação |
Executada logicamente |
Bloqueia a tabela |
Reconstrói a tabela |
Faz backfill de dados |
Gravação múltipla assíncrona |
|
Adicionar uma coluna virtual |
Não |
Não |
Não |
Não |
— |
|
Remover uma coluna virtual |
Não |
Não |
Não |
Não |
— |
|
Adicionar uma coluna armazenada |
Não |
Sim |
Sim |
Sim |
— |
|
Remover uma coluna armazenada |
Não |
Não |
Sim |
Sim |
— |
|
Adicionar uma coluna lógica |
Sim |
Não |
Sim |
Sim |
Não |
|
Remover uma coluna lógica |
Sim |
Não |
Sim |
Sim |
— |
Controlar o comportamento da execução online
O PolarDB-X oferece controle direto sobre o algoritmo de execução usado por uma operação DDL:
Para adicionar uma coluna sem backfill de dados, especifique
ALGORITHM=INSTANT. Isso aciona o recurso Instant ADD COLUMN, que conclui a operação modificando apenas metadados.Para modificar uma coluna online sem bloquear a tabela, especifique
ALGORITHM=OMC. Isso utiliza execução lógica (online modify column).DDLs executados logicamente rodam online por padrão, sem necessidade de especificação especial.
Para que DDLs executados fisicamente (operações comuns de coluna e de índice local) rodem online, especifique
ALGORITHM=INPLACE. Se a operação não suportar execução online, um erro será retornado. Caso suporte, a operação é executada diretamente.
O que esperar durante um DDL em tabela grande
Em operações DDL que fazem backfill de dados — como criar um GSI em uma tabela grande ou dividir uma partição — considere os pontos abaixo:
Impacto no desempenho de DML durante o backfill: Em operações DDL executadas logicamente sem suporte a gravação múltipla assíncrona, o DML online roda como operações lógicas até a conclusão do backfill. Sempre que possível, planeje DDLs em tabelas grandes durante janelas de baixo tráfego.
Consumo de recursos: O backfill copia dados para novos índices. O tempo de execução depende do volume de dados, da concorrência e das especificações da instância.
A tabela permanece acessível: O Online DDL bloqueia o DML apenas por alguns segundos durante a troca final de tabela. Sua aplicação continua lendo e gravando normalmente durante toda a operação.