Habilidad de Seguridad de Migración
Puntuación de riesgo de bloqueo para scripts DDL en PostgreSQL 18.4 - flujo de trabajo de agente y humano para clasificar migraciones de Flyway/Liquibase antes de que bloqueen el tráfico de producción.
Busca en todas las páginas de la documentación
Puntuación de riesgo de bloqueo para scripts DDL en PostgreSQL 18.4 - flujo de trabajo de agente y humano para clasificar migraciones de Flyway/Liquibase antes de que bloqueen el tráfico de producción.
-- Vigilancia de bloqueo (ejecutar durante la migración 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;## Puntuación de riesgo (resumen)
| DDL | Riesgo por defecto | Patrón más seguro |
|---|---|---|
| CREATE INDEX | ALTO en >1M filas | CREATE INDEX CONCURRENTLY |
| ADD COLUMN NOT NULL sin default | ALTO | añadir nullable → rellenar → SET NOT NULL |
| ALTER TYPE | ALTO | expandir-contraer + nueva columna |
| DROP COLUMN | MEDIO | expandir-contraer, primero desaprobar |
| ADD FK en línea | ALTO | ADD NOT VALID → VALIDATE CONSTRAINT |Cuándo invocar:
db/migrations/Archivo de migración: V20260709__orders_priority.sql
ALTER TABLE orders ADD COLUMN priority text NOT NULL DEFAULT 'normal';
CREATE INDEX idx_orders_priority ON orders (priority);Análisis de la habilidad:
## Riesgo de bloqueo: ALTO
### Hallazgos
1. `CREATE INDEX` sin CONCURRENTLY toma ShareLock, bloquea escrituras en la tabla `orders` grande
2. `ADD COLUMN ... DEFAULT` es solo metadatos en PG 11+ para default estático - OK
3. La construcción del índice es el principal bloqueador (~45M filas)
### Migración más segura (archivos 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 (ejecutar en la ventana de cambios)
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_priority ON orders (priority);-- Reversión
DROP INDEX CONCURRENTLY IF EXISTS idx_orders_priority;
ALTER TABLE orders DROP COLUMN IF EXISTS priority;| Factor | Bajo | Alto |
|---|---|---|
| Filas de tabla | < 100k | > 10M |
| Tráfico | staging | OLTP de producción pico |
| Modo de bloqueo | ShareUpdateExclusive | AccessExclusive |
| Estimación de duración | < 1s metadatos | minutos de construcción 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 no se puede ejecutar dentro del bloque de transacción de flyway
-- Usar el patrón outOfOrder + executeInTransaction=false de flyway según la documentación del runner
CREATE INDEX CONCURRENTLY idx_orders_priority ON orders (priority);CREATE INDEX CONCURRENTLY falla. Solución: separar la migración con executeInTransaction=false.| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| expandir-contraer | Cambios de columna sin tiempo de inactividad | Tabla completamente nueva |
| pg_repack | Solo hinchazón (bloat) | Cambio de esquema |
| Corte de replicación lógica | Reescribir importante | Añadir índice simple |
El DEFAULT estático es solo metadatos en PG moderno. Los defaults volátiles o las expresiones GENERATED pueden reescribir. Lee las notas de la versión de PG 18 para casos extremos.
DBA + líder de guardia; programar ventana de cambios; anunciar en el canal de estado; preparar política de cancelación de bloqueo.
El humano aún fusiona el PR. CI aplica staging después de la revisión. Producción nunca hace DDL automático desde el agente.
Versiones de pila: Esta página fue escrita para PostgreSQL 18.4, Flyway 10+ y Liquibase 4+.
Revisado por Chris St. John·Última actualización: 16 jul 2026