Fundamentos de Gestión de Cambios
8 ejemplos para empezar con la gestión de cambios en Postgres: 5 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
8 ejemplos para empezar con la gestión de cambios en Postgres: 5 básicos y 3 intermedios.
# Las migraciones se ejecutan a través de tu herramienta estándar con revisión
flyway -url="$DATABASE_URL" info
# o
liquibase --changelog-file=db/changelog.xml statusdocs/ o runbooks/.Asigna un nivel a cada migración antes de fusionarla.
| Nivel | Ejemplos | Aprobación | Ventana |
|---|---|---|---|
| Bajo | CREATE INDEX CONCURRENTLY, añadir columna nullable | Revisión de PR | En cualquier momento |
| Medio | Relleno de NOT NULL, nueva FK con NOT VALID | Jefe de equipo + DBA | Horario comercial |
| Alto | ALTER TYPE, reescritura de tabla, adjuntar partición | DBA + CAB | Ventana de mantenimiento |
| Digno de Sev | pg_upgrade, migración de almacenamiento principal | Ejecutivo + firma de DR | Ventana dedicada |
-- risk: medium en los comentarios del encabezado.Relacionado: Mejores Prácticas de Gestión de Cambios - lista de verificación de aplicación
Evita que las migraciones esperen indefinidamente por bloqueos.
-- Establecer al inicio de la sesión de migración (callback de Flyway o pre-sql de Liquibase)
SET lock_timeout = '5s';
SET statement_timeout = '30min';
SET idle_in_transaction_session_timeout = '5min';
ALTER TABLE orders ADD COLUMN IF NOT EXISTS priority smallint;Primer paso seguro de expandir/contraer.
-- Expandir: añadir columna (instantáneo en PostgreSQL 11+ para valor nulo por defecto)
ALTER TABLE customers ADD COLUMN IF NOT EXISTS tier text;
-- Despliegue de la aplicación escribe el nivel solo en las nuevas filas (con flag de funcionalidad)
-- Relleno en lotes
UPDATE customers SET tier = 'standard' WHERE tier IS NULL AND id BETWEEN 1 AND 10000;NOT NULL sin un valor por defecto en un solo paso en tablas grandes.UPDATE con rangos de claves primarias para evitar bloqueos largos.Solo después de que el código ya no lea la columna.
-- Verifica cero lecturas en pg_stat_user_tables (aproximado) y métricas de la aplicación
SELECT relname, seq_scan, idx_scan FROM pg_stat_user_tables WHERE relname = 'customers';
-- Contraer
ALTER TABLE customers DROP COLUMN IF EXISTS legacy_code;Cada DDL de producción vincula la evidencia.
## CHG-2044 Añadir orders.priority
- Nivel de riesgo: Medio
- Migración: V2044__orders_priority.sql
- Radio de explosión: tabla orders (42M filas), servicio de checkout
- Reversión: DROP COLUMN priority (después de revertir la aplicación)
- Prueba de bloqueo: pasada en staging 2026-07-08
- Consciente del personal de guardia: síEXPLAIN para cualquier índice nuevo.Relacionado: Ventanas de Mantenimiento - cuándo programar
NOT VALIDAñade la aplicación de restricciones sin bloquear escrituras en filas existentes.
ALTER TABLE line_items
ADD CONSTRAINT line_items_order_id_fkey
FOREIGN KEY (order_id) REFERENCES orders(id)
NOT VALID;
-- Valida más tarde en una ventana más pequeña (todavía toma ShareUpdateExclusiveLock)
ALTER TABLE line_items VALIDATE CONSTRAINT line_items_order_id_fkey;NOT VALID solo añade metadatos; las filas incorrectas existentes permanecen hasta la validación.VALIDATE CONSTRAINT.Construcción concurrente para tablas OLTP.
CREATE INDEX CONCURRENTLY IF NOT EXISTS orders_customer_id_idx
ON orders (customer_id);
-- Flyway: desactiva el envoltorio de transacción para este script# Verifica que el índice sea válido
psql -c "SELECT indisvalid FROM pg_index WHERE indexrelid = 'orders_customer_id_idx'::regclass;"REINDEX CONCURRENTLY (ver solución de problemas).CREATE INDEX CONCURRENTLY en un bloque de transacción.Trata pg_upgrade como un lanzamiento de producto, no como un parche.
## Pre-vuelo
- [ ] Copia de seguridad lógica + punto de control PITR verificado
- [ ] Matriz de compatibilidad de extensiones (pgvector, PostGIS)
- [ ] Reversión = mantener el clúster antiguo detenido, revertir DNS
- [ ] Cadena de conexión de la aplicación probada en PG 18.4 stagingpg_upgrade --check en un clon primero.Relacionado: Antes/Después: Actualización de Versión Principal - referencia narrativa
Versiones de la pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.
Revisado por Chris St. John·Última actualización: 16 jul 2026