Alterar uma coluna para um tipo não compatível em binário — como converter uma coluna int4 para int8 — força o PostgreSQL a reescrever a tabela inteira. Durante a reescrita, a tabela é bloqueada e todas as leituras e gravações ficam suspensas. Embora muitas operações DDL no PostgreSQL (como CREATE INDEX CONCURRENTLY) suportem execução concorrente, alterações de tipo de coluna não compatíveis em binário ainda exigem uma reescrita completa da tabela com bloqueio. A extensão rds_online_ddl elimina essa janela de bloqueio, permitindo alterar tipos de colunas em tabelas ativas sem interromper o tráfego da aplicação.
Pré-requisitos
Antes de começar, verifique se sua instância atende a todos os requisitos abaixo:
Versão principal do engine: PostgreSQL 12 ou posterior
Versão secundária do engine: 20250830 ou posterior
Parâmetro da instância:
wal_levelestá definido comological. Para alterar esse parâmetro, consulte Modificar parâmetros da instância.Schema da tabela: A tabela de destino possui uma chave primária ou uma constraint UNIQUE
Conta: Uma conta privilegiada está criada na instância
Instalar e remover a extensão
Execute esses comandos usando uma conta privilegiada.
Instalar:
CREATE EXTENSION rds_online_ddl;
Para verificar a instalação, execute:
SELECT * FROM pg_extension;
Remover:
DROP EXTENSION rds_online_ddl;
Alterar o tipo de uma coluna online
Chame rds_online_ddl.alter_table() com o nome completo da tabela e uma instrução ALTER TABLE:
SELECT rds_online_ddl.alter_table('<schema>.<table>', '<ALTER TABLE statement>');
|
Parâmetro |
Descrição |
|
|
Nome completo da tabela, por exemplo |
|
|
Uma cláusula padrão |
Exemplo: atualizar uma coluna inteira de int4 para int8
-
Crie uma tabela de teste e carregue dados de amostra.
CREATE TABLE test (id int4 PRIMARY KEY, info TEXT); INSERT INTO test SELECT x, repeat(x::text, 2) FROM generate_series(1, 1000000) AS x; -
Execute a alteração online do tipo da coluna.
SELECT rds_online_ddl.alter_table('public.test', 'ALTER COLUMN id TYPE int8'); -
(Opcional) Monitore o progresso. Em tabelas grandes, a operação pode levar bastante tempo. Para acompanhar o status, consulte a view de progresso:
Campo
Descrição
insert_initialLinhas de dados históricos copiadas até o momento
nindexes_builtÍndices criados na tabela temporária
nindexes_totalTotal de índices a criar
insert_applied/update_applied/delete_appliedAlterações incrementais aplicadas por tipo de operação
insert_decoded/update_decoded/delete_decodedAlterações incrementais decodificadas por tipo de operação
SELECT * FROM rds_online_ddl.pg_stat_progress_online_ddl;
Antes de executar em produção
Teste primeiro. Execute a mesma operação em um ambiente de teste e verifique os resultados antes de aplicar em dados de produção.
Verifique o espaço em disco. A operação requer espaço livre equivalente a pelo menos 2x o tamanho total da tabela e seus índices. Por exemplo, se a tabela e seus índices somam 10 GB, tenha ao menos 20 GB livres.
Faça backup dos seus dados. Confirme que existe um backup válido antes de prosseguir.
Como funciona
A extensão evita bloqueios prolongados na tabela operando sobre uma cópia temporária e substituindo-a ao final. O bloqueio exclusivo na etapa 6 é mantido apenas pelo tempo necessário para a troca.
O processo completo:
Crie uma tabela temporária com o mesmo schema da tabela original.
Execute a operação
ALTER COLUMN TYPEespecificada na tabela temporária.Copie os dados históricos da tabela original para a tabela temporária.
Crie todos os índices da tabela original na tabela temporária.
Use decodificação lógica para sincronizar as alterações incrementais (inserções, atualizações e exclusões) geradas durante as etapas anteriores na tabela temporária, garantindo a consistência final dos dados.
Adquira um bloqueio exclusivo breve na tabela original e atualize seu schema.
Troque os arquivos subjacentes da tabela original pelos da tabela temporária, incluindo todos os índices.
Exclua a tabela temporária e confirme a transação.
A operação é atômica. Se falhar ou for interrompida em qualquer ponto, a tabela retorna automaticamente ao schema original — nenhuma recuperação manual é necessária.
Limitações
|
Limitação |
Detalhes |
|
Tipos de tabela não suportados |
Tabelas com constraints de chave estrangeira não são suportadas. Tabelas particionadas não são suportadas. Apenas tabelas regulares são suportadas. |
|
Armazenamento |
Requer aproximadamente 2x o tamanho total da tabela original e seus índices em espaço livre em disco. |
|
Cláusula |
A cláusula |
Solução de problemas
|
Sintoma |
Causa provável |
Resolução |
|
|
A tabela de destino não possui chave primária ou constraint UNIQUE |
Adicione uma constraint |
|
|
|
Defina |
|
Erro de espaço em disco insuficiente |
O espaço livre em disco é inferior a 2x o tamanho da tabela |
Libere espaço em disco ou expanda o armazenamento da instância antes de prosseguir |
Faturamento
A extensão rds_online_ddl é gratuita.