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.
Busque em todas as páginas da documentaçã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.
-- 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:
db/migrations/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;| 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 |
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';-- 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);CREATE INDEX CONCURRENTLY falha. Correção: separar migração com executeInTransaction=false.| 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 |
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.
DBA + líder de plantão; agendar janela de alteração; anunciar no canal de status; preparar política de cancelamento de bloqueio.
O humano ainda mescla o PR. CI aplica staging após revisão. Produção nunca auto-DDL do agente.
Versões de Stack: Esta página foi escrita para PostgreSQL 18.4, Flyway 10+ e Liquibase 4+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026