Upgrades, versiones y compatibilidad en PostgreSQL | Nicolás Garzón
Actualizar PostgreSQL no es cambiar un número de versión. Es migrar un sistema con datos, extensiones, collations, drivers, consultas, procedimientos operativos y una ventana real de rollback.
PostgreSQL publica major versions con nuevas capacidades y cambios internos, mientras que las minor versions corrigen errores y seguridad dentro de una misma major.
Texto
Copiar minor upgrade
18.3 → 18.4
→ mismo formato principal de datos
→ instalación de binarios/parches
→ reinicio o acción del proveedor
major upgrade
17 → 18
→ cambia el formato interno
→ exige migración mediante pg_upgrade, dump/restore, replicación lógica o servicio administradoNo planifiques con números memorizados. Antes de cada upgrade confirma la política oficial, releases soportadas, notas de versión y compatibilidad del proveedor.
Cada major recibe soporte durante un periodo limitado. Permanecer fuera de soporte implica:
Sin correcciones oficiales de seguridad.
Bugs conocidos sin backport.
Extensiones y drivers que dejan de probar esa rama.
Mayor distancia y riesgo para el siguiente salto.
Menos experiencia reciente disponible en operación.
El plan debe comenzar antes del fin de soporte, no durante la última semana.
Un minor upgrade suele conservar compatibilidad binaria dentro de la major, pero todavía requiere disciplina:
Leer release notes completas desde la versión instalada.
Identificar fixes de corrupción, planner, replication y seguridad.
Probar en staging representativo.
Verificar extensions empaquetadas por el sistema operativo.
Preparar restart/failover.
Ejecutar smoke tests y comparar métricas.
Un bug corregido puede cambiar un plan o resultado que accidentalmente dependía del comportamiento anterior.
Valida compatibilidad y migra rápidamente reutilizando o copiando archivos físicos.
Downtime menor que dump/restore para clusters grandes.
Conserva la mayoría de objetos.
Proceso oficial y conocido.
Necesita binarios antiguos y nuevos.
Las extensions deben existir para la versión nueva.
Requiere espacio o decisiones como --link.
Deben regenerarse estadísticas.
Rollback se vuelve delicado tras aceptar nuevas escrituras.
Texto
Copiar pg_dump / pg_dumpall
→ crear cluster limpio
→ restaurar schema y datos
→ reconstruir índices y statistics
Portabilidad.
Reescribe almacenamiento y elimina bloat físico.
Permite revisar ownership y objetos.
Puede durar horas o días.
Requiere espacio adicional.
Debe coordinarse la ventana de escritura.
La restauración paralela no acelera todos los objetos por igual.
Texto
Copiar nuevo cluster
→ copiar schema
→ initial sync
→ replicar cambios
→ validar lag y datos
→ detener writes brevemente
→ sincronizar sequences
→ cutover
Downtime final reducido.
Permite observar el nuevo cluster antes del corte.
No replica automáticamente todo el DDL, roles, sequences, large objects ni extensions.
Requiere capacidad doble temporal.
Cambios de schema deben ser compatibles.
El rollback después del cutover necesita replicación inversa o reconciliación.
El proveedor puede automatizar infraestructura, pero sigue siendo responsabilidad del equipo validar:
Compatibilidad de aplicación.
Extensions.
Read replicas.
Parameter groups.
Backups y restore.
Duración y comportamiento del endpoint.
Texto
Copiar 1. inventario del cluster
2. instalar versión y extensions destino
3. ejecutar checks
4. tomar backup y establecer freeze de cambios
5. detener origen de forma limpia
6. ejecutar pg_upgrade
7. iniciar destino
8. actualizar extensions
9. regenerar statistics
10. ejecutar smoke/integration tests
11. observar y liberar tráfico--link evita copiar los archivos y reduce espacio/tiempo, pero el cluster anterior comparte data files. Iniciar o modificar el antiguo después del upgrade puede destruir la posibilidad de rollback.
Databases, tamaño y crecimiento.
Roles y memberships.
Extensions y versiones.
Replication slots y publications.
Collations y providers.
Tablespaces.
Prepared transactions.
Configuración y parámetros obsoletos.
Funciones en lenguajes externos.
Objetos inválidos.
Clientes y versiones de drivers.
RPO, RTO y ventana de mantenimiento.
Sin inventario, el upgrade descubre dependencias durante el incidente.
SQL
Copiar SELECT extname, extversion
FROM pg_extension
ORDER BY extname;
Paquete disponible para destino.
Ruta de actualización soportada.
Cambios de tipos/operator classes.
Necesidad de ALTER EXTENSION ... UPDATE.
Restricciones del proveedor.
Una extensión instalada pero no actualizada puede dejar objetos con versión antigua.
Actualizar sistema operativo, glibc o ICU puede cambiar reglas de comparación.
Orden diferente.
Índices B-tree con orden incompatible.
Unique indexes que aceptaron valores antes considerados distintos.
Resultados de range scans incorrectos hasta reindexar.
Después de detectar mismatch, sigue la guía de la versión: valida datos, reconstruye índices afectados y actualiza la versión registrada de la collation.
PostgreSQL mantiene gran compatibilidad, pero debes probar:
Driver y ORM soportando la nueva major.
Mapping de tipos.
SCRAM/TLS.
Prepared statements y pooling.
Nuevos reserved words.
Parsing de mensajes y SQLSTATE.
Herramientas de backup/monitoring.
La base “arranca” antes de que el sistema esté validado.
Cost model.
Estadísticas.
Join strategies.
Parallelism.
CTE behavior.
JIT.
Partition pruning.
Una query puede mejorar o empeorar sin modificar SQL. Captura queries representativas y compara:
SQL
Copiar EXPLAIN ( ANALYZE , BUFFERS, SETTINGS) No intentes conservar todos los planes antiguos. Identifica regresiones reales y corrige estadísticas, query o índices.
Revisa release notes por:
Features eliminadas o deprecadas.
Cambios de defaults.
Validaciones más estrictas.
Cambios en funciones y casts.
Privilegios.
Catálogos internos.
No construyas aplicaciones contra columnas internas de pg_catalog sin considerar evolución.
No copies postgresql.conf completo al nuevo cluster.
Empieza desde defaults de la versión nueva.
Aplica únicamente parámetros justificados.
Elimina opciones obsoletas.
Revisa unidades y rangos.
Compara pg_settings.
Mantén configuración versionada.
Un tuning antiguo puede ser contraproducente en hardware o versión nueva.
CRUD principal.
Transacciones y retries.
Jobs y reporting.
RLS y roles.
Funciones y triggers.
Latencia p50/p95/p99.
Throughput.
Planes críticos.
WAL y checkpoints.
Vacuum y autovacuum.
Backup y restore.
Replica/failover.
Monitoring y alertas.
Deployment y migrations.
Herramientas administrativas.
Drivers.
ORMs.
BI/ETL.
Extensions.
Scripts de mantenimiento.
No basta comparar count(*) global.
Conteos por tabla y partición.
Checksums por rangos lógicos.
Totales de negocio.
PK/FK y constraints.
Muestreo de filas.
Comparación de queries críticas.
Verificación de sequences.
La validación debe poder ejecutarse sin saturar producción.
Planifica una secuencia explícita:
Texto
Copiar anunciar ventana
→ detener jobs y writers
→ esperar/terminar transacciones controladamente
→ verificar lag cero
→ sincronizar sequences
→ cambiar endpoint
→ smoke tests
→ abrir tráfico progresivamente
→ observarDefine quién autoriza continuar o abortar.
Antes del corte, rollback puede ser reiniciar el origen.
Después de escrituras en destino, existen dos historias. Volver requiere:
Replicación inversa preparada.
Exportar/reconciliar cambios.
Restaurar y aceptar pérdida según RPO.
Forward fix en destino.
Por eso debe definirse un point of no return .
Durante cutover pueden perderse conexiones después de commit. Requests reintentados pueden duplicar operaciones. Idempotency keys y reconciliación son parte del upgrade de producción, no solo del código cotidiano.
En replicación física, primary y standby deben seguir combinaciones compatibles. Estrategias:
Upgrade de cluster completo.
Crear nuevas replicas desde destino.
Switchover coordinado si el proveedor lo soporta.
No asumas que una replica de otra major puede seguir WAL físico ordinario.
Conexiones y errores.
Locks y queries largas.
CPU, memoria e I/O.
WAL generation y archive failures.
Replication lag.
Autovacuum.
Latencia del pool.
Error rate de aplicación.
Define baseline antes del cambio.
--link reduce espacio, pero dificulta rollback. Logical migration requiere capacidad doble.
Puede bloquear toda la estrategia o exigir retirar/migrar datos.
Reindex puede durar más que el upgrade.
El nuevo primary comienza a producir IDs existentes.
Retiene WAL y llena disco durante migración.
Puede quedar olvidada y retener locks; resuélvela antes.
Updates/deletes pueden requerir replica identity y generar coste alto.
Tratar major upgrade como minor patch.
No leer release notes intermedias.
Probar solo con una database vacía.
Olvidar extensions, sequences y collations.
Copiar configuración completa.
No definir rollback después del primer write.
Actualizar al final del soporte sin ensayo.
Confiar exclusivamente en el botón del proveedor.
Texto
Copiar objetivo y versiones
responsables
prechecks
backups y restore verificado
comandos/acciones exactas
estimaciones de duración
checks por etapa
criterios de abort
cutover
rollback/forward fix
observación posterior
Minor y major upgrades son operaciones distintas.
Compatibilidad incluye aplicación, extensions, collations y operación.
pg_upgrade, dump/restore y logical replication tienen trade-offs diferentes.
El rollback cambia cuando el destino acepta escrituras.
La validación debe medir datos, negocio y rendimiento.
Mantener una versión soportada es trabajo continuo.
¿Por qué pg_upgrade --link complica rollback?
¿Qué objetos no resuelve automáticamente una migración lógica?
¿Por qué actualizar libc/ICU puede exigir reindex?
¿Qué significa point of no return?
¿Por qué no debes copiar postgresql.conf completo?
Ver respuestas
Porque origen y destino comparten archivos y modificar uno invalida la copia anterior.
Roles, DDL, sequences, extensions, large objects y otros objetos fuera de las tablas publicadas.
Porque cambia el orden de comparación respecto al usado al construir el índice.
El momento tras el cual volver al origen requiere reconciliar o perder escrituras nuevas.
Porque defaults, parámetros y necesidades cambian entre versiones; solo deben migrarse ajustes justificados.
Antipatrones de PostgreSQL con contexto transforma reglas simplistas en criterios de decisión.