¿La tabla tiene alguna FOREIGN KEY ON DELETE CASCADE? ¡Cuidado! ¡la recuperación puede estar incompleta!


Si estás dando los primeros pasos con pgBadger y descubres que los informes los genera sin tener en cuenta las sentencias SQL que se ejecutan en el servidor.. no te vuelvas loco.

Seguramente no has ejecutado mal pgBadger. Tampoco has instalado mal la aplicación ni hay incompatibilidad de versiones. 

Lo que ocurre es mucho más sencillo que todo eso.

Simplemente revisa los siguientes tres puntos:

1. ¿Estoy analizando el log correcto?

Comprueba si a pgBadger le estás indicando correctamente cuál es el log del servidor que quieres analizar.

Si tienes dudas de si es o no el log correcto, aquí tienes un artículo que te explica cómo localizar la ubicación del log de un servidor PostgreSQL.

2. ¿Tengo configurados correctamente los parámetros del log que son obligatorios para usar pgBadger?

En honor a la verdad pgBadger es poco exigente pero tiene como requisito que dos parámetros estén configurados tal y como necesita.

Estos son:

lc_messages = ‘en_US.UTF-8’

Los mensajes del log deben estar en inglés con o sin soporte local.

No admite otras configuraciones como ‘es_ES.UTF-8’.

log_line_prefix

pgBadger admite cualquier tipo de formato personalizado del prefijo de la línea de log establecido en este parámetro, siempre que al menos se especifique una secuencia de tiempo, es decir, %t, %m o %n y una secuencia relacionada con el proceso, es decir, %p o %c.

Si el valor de su parámetro log_line_prefix está personalizado y cumple con la premisa anterior, simplemente ejecute pgBadger con la opción -p seguida del valor de log_line_prefix, por ejemplo:

pgbadger -p «%t [%p] %l %q %a %h » /var/log/postgresql.log

3. ¿Tengo configurado alguno de los parámetros que registran sentencias en el log?

En este caso, uno de los dos parámetros tiene que estar habilitado para que se registren sentencias en el log y si están configurados los dos, el parámetro log_statement prevalecerá sobre log_min_duration_statement.

log_min_duration_statement

Este parámetro está deshabilitado por defecto (valor ‘-1’) y tiene que tener un valor positivo cualquiera.

El valor que le indiquemos será el tiempo, en milisegundos, que tendrá que tardar como mínimo una sentencia en ser ejecutada para que se registre en el log, junto con su duración. Así que, si queremos que se registren todas las sentencias en el log, el valor de este parámetro tendrá que ser 0.

Si queremos que sólo registre en el log las sentencias que tengan una duración mayor a 1 segundo la estableceremos como:

log_min_duration_statement = 1000

log_statements

Por defecto tendrá el valor ‘none’ (ninguna). Es decir, que no registre ninguna sentencia.

Si quiere habilitar este parámetro tendrá que indicar alguno de los otros valores posibles: ddl (registra sentencias DDL), mod (registra sentencias DDL y DML) o ALL (registra todas las sentencias, sea del tipo que sean).

La diferencia principal entre establecer log_min_duration_statement = 0 o log_statements = ‘all’ es que en el primer caso se registrarán también las duraciones, además de la sentencia, y en el segundo caso sólo la sentencia.