Desbordamiento de ID de Transacción
PostgreSQL reutiliza IDs de transacción de 32 bits. Vacuum debe congelar filas antiguas antes de que el clúster se acerque al apagado por desbordamiento en PostgreSQL 18.4.
Receta
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
SELECT datname, age(datfrozenxid) AS frozen_age, datfrozenxid
FROM pg_database
ORDER BY age(datfrozenxid) DESC;Cuándo usar esto: Los registros mencionan desbordamiento, autovacuum se ejecuta con autovacuum (to prevent wraparound) (para prevenir desbordamiento), o age(datfrozenxid) supera cientos de millones.
Ejemplo de Trabajo
CREATE TABLE ledger (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
amount numeric(12,2) NOT NULL,
updated_at timestamptz NOT NULL DEFAULT now()
);
INSERT INTO ledger (amount)
SELECT (random() * 100)::numeric(12,2) FROM generate_series(1, 100000);
-- La rotación crea tuplas que necesitan congelarse
UPDATE ledger SET amount = amount + 1;
SELECT
c.relname,
age(c.relfrozenxid) AS table_frozen_age,
s.n_dead_tup,
s.last_autovacuum
FROM pg_class c
JOIN pg_stat_user_tables s ON s.relid = c.oid
WHERE c.relname = 'ledger';
SELECT datname, age(datfrozenxid) AS db_frozen_age
FROM pg_database
WHERE datname = current_database();Qué demuestra esto:
age(relfrozenxid)por tabla- Edad de
datfrozenxida nivel de base de datos - Vínculo entre rotación, vacuum y congelación
Inmersión Profunda
Cómo Funciona
- Cada fila tiene IDs de transacción xmin/xmax para visibilidad.
- Vacuum marca las transacciones confirmadas antiguas como congeladas para que los IDs puedan reutilizarse de forma segura.
autovacuum_freeze_max_age(por defecto 200M) fuerza un vacuum agresivo.- El modo de emergencia detiene las conexiones si se viola el horizonte de desbordamiento (raro con un autovacuum saludable).
Umbrales de Monitorización
| Métrica | Nivel de acción |
|---|---|
age(datfrozenxid) > 400M | Investigar retraso de vacuum |
age(datfrozenxid) > 600M | Ajuste urgente |
age(datfrozenxid) > 800M | Respuesta a incidentes |
Notas SQL
SELECT relname, last_autovacuum, last_vacuum
FROM pg_stat_user_tables
ORDER BY age(relid) DESC NULLS LAST
LIMIT 15;
VACUUM FREEZE VERBOSE ledger;Trampas Comunes
- Transacciones abiertas largas - Bloquean la congelación; la edad aumenta. Solución:
idle_in_transaction_session_timeout, monitorizarpg_stat_activity.xact_start. - Slots de replicación sin consumo - Previenen la limpieza de vacuum en el primario. Solución: Eliminar slots obsoletos; monitorizar
pg_replication_slots. - Autovacuum deshabilitado - Vía rápida al riesgo de apagado. Solución: Volver a habilitar inmediatamente;
VACUUM FREEZEmanual. - Solo observar la edad de la base de datos, no la edad de la tabla - Una tabla mala puede arrastrar el horizonte. Solución: Paneles de control
age(relfrozenxid)por tabla. - Aplazar vacuum en archivos de solo adición - Incluso las tablas de solo adición necesitan congelación ocasional. Solución: Vacuum ligero programado.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Reducir autovacuum_freeze_max_age por tabla | Archivo estático enorme | OLTP por defecto |
| Separar/eliminar particiones | Datos antiguos desechables | Se requiere retención legal |
| Clúster de archivo de solo lectura | Dividir datos fríos | Simplicidad de una sola BD |
Preguntas Frecuentes
¿Qué es autovacuum freeze max age?
Fuerza a vacuum a congelar páginas cuando la edad de relfrozenxid de la tabla excede la configuración.
¿vacuum freeze vs normal?
Vacuum freeze prioriza el avance de xmin; puede ejecutarse con la bandera de urgencia.
¿desbordamiento de multixact?
Horizonte separado; monitorizar la edad de pg_database.datminmxid de manera similar.
¿slots de replicación lógica?
Pueden retener xmin; prevenir vacuum si el consumidor se retrasa.
¿monitorización en standby?
Observar las edades del primario; los standbys no avanzan frozenxid localmente para datos de usuario.
¿vacuum_defer_cleanup_age?
Configuración de replicación que retrasa la limpieza; reducir en streaming moderno a menos que sea necesario.
¿registro de apagado inminente?
Vacuum de emergencia o VACUUM FREEZE manual en todas las tablas; matar bloqueadores.
¿trabajo de congelación pg_cron?
Red de seguridad para tablas estáticas con disparadores de autovacuum infrecuentes.
¿vistas de monitorización 18.4?
Combinar pg_stat_user_tables con alertas personalizadas sobre umbrales de edad.
¿Siguiente?
Bloat de tablas e índices cuando vacuum se retrasa pero antes de la emergencia de desbordamiento.
Relacionado
- Ajuste de Autovacuum - Prevenir retraso
- Conceptos Básicos de Vacuum - Rol de congelación
- Conceptos Básicos de Monitorización - Alertas
- Mejores Prácticas de Vacuum - Nunca deshabilitar autovacuum
Versiones de Stack: 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+.