Skill de Segurança de Migração
Pontuação de risco de bloqueio para scripts DDL no PostgreSQL 18.4 - fluxo de trabalho humano e de agente para classificar migrações Flyway/Liquibase antes que elas bloqueiem o tráfego de produção.
Receita
-- Monitoramento de bloqueio (executar durante a migração de staging)
SELECT pid, wait_event_type, wait_event, state, left(query, 80)
FROM pg_stat_activity
WHERE datname = current_database() AND pid <> pg_backend_pid();
SELECT l.mode, c.relname, a.query
FROM pg_locks l
JOIN pg_class c ON c.oid = l.relation
JOIN pg_stat_activity a ON a.pid = l.pid
WHERE NOT l.granted;## Pontuação de risco (resumo)
| DDL | Risco padrão | Padrão mais seguro |
|-----|--------------|---------------|
| CREATE INDEX | ALTO em >1M linhas | CREATE INDEX CONCURRENTLY |
| ADD COLUMN NOT NULL sem default | ALTO | adicionar nullable → preencher → SET NOT NULL |
| ALTER TYPE | ALTO | expandir-contrair + nova coluna |
| DROP COLUMN | MÉDIO | expandir-contrair, depreciar primeiro |
| ADD FK inline | ALTO | ADD NOT VALID → VALIDATE CONSTRAINT |Quando invocar:
- Todo PR que tocar em
db/migrations/ - DDL gerado por consultor ou agente
- Migração de hotfix durante incidente
Exemplo de Trabalho
Arquivo de migração: V20260709__orders_priority.sql
ALTER TABLE orders ADD COLUMN priority text NOT NULL DEFAULT 'normal';
CREATE INDEX idx_orders_priority ON orders (priority);Análise da Skill:
## Risco de bloqueio: ALTO
### Constatações
1. `CREATE INDEX` sem CONCURRENTLY obtém ShareLock, bloqueia escritas na tabela grande de orders
2. `ADD COLUMN ... DEFAULT` é apenas metadados no PG 11+ para default estático - OK
3. A construção do índice é o principal bloqueador (~45M linhas)
### Migração mais segura (arquivos separados)
-- V20260709_1__orders_priority_column.sql
ALTER TABLE orders ADD COLUMN IF NOT EXISTS priority text NOT NULL DEFAULT 'normal';
-- V20260709_2__orders_priority_index.sql (executar na janela de alteração)
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_priority ON orders (priority);-- Rollback
DROP INDEX CONCURRENTLY IF EXISTS idx_orders_priority;
ALTER TABLE orders DROP COLUMN IF EXISTS priority;Aprofundamento
Matriz de Pontuação
| Fator | Baixo | Alto |
|---|---|---|
| Linhas da tabela | < 100k | > 10M |
| Tráfego | staging | pico de prod OLTP |
| Modo de bloqueio | ShareUpdateExclusive | AccessExclusive |
| Estimativa de duração | < 1s metadados | minutos de construção de índice |
Entrada de Contagem de Linhas
SELECT c.relname, c.reltuples::bigint AS est_rows
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'public' AND c.relname = 'orders';Ressalvas do CONCURRENTLY
-- CONCURRENTLY não pode ser executado dentro do bloco de transação do flyway
-- Use o padrão flyway outOfOrder + executeInTransaction=false conforme a documentação do runner
CREATE INDEX CONCURRENTLY idx_orders_priority ON orders (priority);Armadilhas
- Flyway envolve em transação -
CREATE INDEX CONCURRENTLYfalha. Correção: separar migração comexecuteInTransaction=false. - VALIDATE CONSTRAINT ainda precisa de share lock - mais curto que varredura completa da tabela para verificação de FK, mas planeje a janela.
- DROP COLUMN em uma etapa - quebra a versão antiga do aplicativo durante a implantação. Correção: expandir-contrair entre lançamentos.
- Renomear coluna com alteração de TIPO - reescreve a tabela. Correção: nova coluna, preenchimento, corte.
- Rollback ausente - equipes somente para frente ainda documentam SQL de rollback manual para sev-1.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| expandir-contrair | Alterações de coluna sem tempo de inatividade | Tabela nova |
| pg_repack | Apenas inchaço | Mudança de esquema |
| Corte de replicação lógica | Grande reescrita | Adição simples de índice |
FAQs
ADD COLUMN é sempre de baixo risco?
DEFAULT estático é apenas metadados no PG moderno. Defaults voláteis ou expressões GERADAS podem reescrever. Leia as notas de lançamento do PG 18 para casos extremos.
Quem aprova migrações de ALTO risco?
DBA + líder de plantão; agendar janela de alteração; anunciar no canal de status; preparar política de cancelamento de bloqueio.
O agente pode aplicar automaticamente BAIXO risco em staging?
O humano ainda mescla o PR. CI aplica staging após revisão. Produção nunca auto-DDL do agente.
Relacionados
- Noções Básicas de Skills de Agente - regras de invocação
- Noções Básicas de Migrações - layout da pasta
- DDL de Zero Downtime - padrões
- Padrão Expandir-Contratar - alterações de coluna
- Migrações de Tabela Grande - preenchimento
Versões de Stack: Esta página foi escrita para PostgreSQL 18.4, Flyway 10+ e Liquibase 4+.