Administro una gran base de datos (algunos cientos de conciertos) que contiene tablas con varios roles, algunos de ellos con millones de registros. Algunas tablas solo reciben una gran cantidad de inserciones y eliminaciones, algunas otras pocas inserciones y una gran cantidad de actualizaciones.
La base de datos se ejecuta en PostgreSQL 8.4 en un sistema Debian 6.0 amd64 con 16 gigabytes de RAM.
La pregunta es a veces el proceso de autovacío en una tabla, lleva mucho tiempo (días) en completarse. Quiero poder decir aproximadamente cuánto tiempo llevará un comando de vacío en particular, para poder decidir si cancelarlo o no. Además, si hubiera un indicador de progreso para las operaciones de vacío de Postgres, sería realmente útil.
Editar:
No estoy buscando una solución a prueba de balas. Solo una pista aproximada sobre el número de tuplas muertas o los bytes de E / S necesarios es suficiente para decidir. Es realmente molesto no tener idea de cuándo VACUUM
terminará, en absoluto.
He visto que pg_catalog.pg_stat_all_tables
tiene una columna para la cantidad de tuplas muertas. Por lo tanto, es posible tener una estimación, incluso si eso significa que uno tiene que ir a ANALYZE
la mesa antes. Por otro lado, autovacuum_vacuum_threshold
y la autovacuum_vacuum_scale_factor
configuración por sí sola demuestra que el propio postgres sabe algo sobre la cantidad de cambio en las tablas y probablemente también lo pone en manos del DBA.
No estoy seguro de qué consulta ejecutar, porque cuando ejecuto VACUUM VERBOSE
, veo que no solo se procesan las tablas, sino también los índices.
fuente
VACUUM FULL
en 9.0+, ya que reescribe completamente la tabla. También debería funcionar para regularVACUUM
, pero aún no lo he probado. Porqueautovacuum
funcionaría si pudieras atrapar el proceso de trabajo de vacío automático en una tabla determinada, pero no sé cómo lograrlo.Esto es muy difícil de determinar. Puede sintonizar autovacuum para ser más agresivo o más suave. Pero cuando se configura en leve y se está quedando atrás y la carga de E / S de base es demasiado alta, puede suceder que nunca alcance un estado de vacío adecuado; entonces verá que el proceso se ejecuta y se ejecuta y se ejecuta. Además, las ediciones posteriores de PostreSQL han mejorado mucho las capacidades de vacío automático, esto solo puede ser suficiente para pasar a una de ellas (preferiblemente 9.2 como la más reciente).
La barra de progreso parece una buena idea, pero imagino que no es tan fácil de implementar de manera significativa. Como tiene una carga constante en sus mesas, es muy posible que el progreso aparentemente esté retrocediendo (quiero decir que el recuento de filas muertas / porcentaje aumenta en lugar de disminuir), entonces, ¿qué conclusión saca?
fuente
VACUUM ANALYZE VERBOSE
al menos imprime alguna actividad en la consola, ya que lo hace es cosa. Es mejor que simplemente mirar un mensaje estático preguntándose si algo está atascado durante horas.VACUUM
, no para autovacuum, pero sigue siendo algo.En nuestra producción, una de las tablas más grandes tenía este registro:
Este es, con mucho, el peor consumo de recursos, todas las otras tablas han tomado menos de 2 s.
Para ver estos tipos de registros, debe ejecutar esto:
(durante 5 ms), vuelva a cargar el archivo de configuración.
fuente
Encontré útil esta publicación y esta publicación , pero como otros han mencionado, puede ser difícil calcular el progreso general del vacío, ya que el proceso involucra algunas operaciones separadas.
Utilizo esta consulta para monitorear el progreso del escaneo de la tabla de vacío, que parece ser la mayor parte del trabajo:
Sin embargo, esto no incluirá el escaneo de índice, que ocurre después, y puede tomar el mismo tiempo, si no más, si tiene una tonelada de índices. Desafortunadamente, no puedo encontrar ninguna manera de monitorear el escaneo / aspiración de índices.
fuente