Usando pg_options

Nota: Contribución de Massimo Dal Zotto

El archivo opcional data/pg_options contiene opciones usadas por el backend para controlar los mensajes de trazado y otros parámetros ajustables del mismo. El archivo se vuelve a leer cuando el backend recibe la señal SIGHUP, permitiendo cambiar las opciones de tiempo de ejecución al vuelo, sin que sea preciso reiniciar Postgres. En este archivo se pueden incluír opciones de depuración usadas por el paquete de trazado (backend/utils/misc/trace.c) o parámetros numéricos usados por el backend para controlar su comportamiento.

Todas las pg_options se inicializan a cero al iniciar el backend. Si se añaden o se modifican opciones, serán leídas por todos los backend que se inicien a continuación. Para que cualquier cambio tome efecto en los backend que están activos, es preciso enviar una señal SIGHUP al postmaster, quien reenviará la señal a todos los backend activos. Se pueden activar los cambios para un backend específico enviándole directamente una señal SIGHUP.

Las pg_options pueden especificarse también con la opción -T de Postgres:

postgres opciones -T "verbose=2,query,hostlookup-"
    

Las funciones usadas para indicar errores y mensajes de depuración pueden usar la facilidad syslog(2). Los mensajes que se escriben en stdout o stderr incluyen un prefijo con la fecha, la hora y el número de proceso del backend que las genera.

#timestamp          #pid    #message
980127.17:52:14.173 [29271] StartTransactionCommand
980127.17:52:14.174 [29271] ProcessUtility: drop table t;
980127.17:52:14.186 [29271] SIIncNumEntries: table is 70% full
980127.17:52:14.186 [29286] Async_NotifyHandler
980127.17:52:14.186 [29286] Waking up sleeping backend process
980127.19:52:14.292 [29286] Async_NotifyFrontEnd
980127.19:52:14.413 [29286] Async_NotifyFrontEnd done
980127.19:52:14.466 [29286] Async_NotifyHandler done
    

Este formato facilita la lectura de los mensajes y permite saber exactamete lo que hace cada backend y en qué momento. También facilita la escritura de scripts awk o perl sencillos que analicen los historiales para detectar errores o problemas en la base de datos o para calcular estadísticas temporales de transaciones.

Los mensajes escritos a través de syslog utilizan la facilidad LOG_LOCAL0. El uso de syslog se controla mediante la opción syslog en pg_options. Por desgracia, muchas funciones llaman directamente a printf() para escribir sus mensajes a stdout o stderr, cuya salida no se puede controlar mediante la opción syslog ni puede incluír fecha y hora. Sería recomendable sustituir todas las llamadas a printf con la macro PRINTF, y todas las escrituras a stderr por la macro EPRINTF, para poder controlar toda la salida de un modo uniforme.

El formato del archivo pg_options es como sigue:

# comentario
option=valor_entero  # Establece el valor de  option
option                # establece option = 1
option+               # establece option = 1
option-               # establece option = 0
    
Observe que keyword puede ser una abreviatura de un nombre de opción de los definidos en backend/utils/misc/trace.c.

Ejemplo 22-1. Archivo pg_options

Por ejemplo, mi archivo pg_options contiene los siguientes valores:

verbose=2
query
hostlookup
showportnumber
      

Opciones reconocidas

Actualmente están definidas las opciones:

all

Marca de traza global. Los valores permitidos son:

0

Mensajes de trazado activados individualmente

1

Activar todos los mensajes de trazado

-1

Inhibir todos los mensajes de trazado

verbose

Marca de verbosidad. Valores permitidos:

0

Sin mensajes, éste es el valor por omisión.

1

Escribir mensajes de información.

2

Escribir más mensajes de información.

query

Trazar peticiones. Valores permitidos:

0

No escribir la petición.

1

Escribir una versión condensada de la petición en una línea.

4

Escribir la consulta completa.

plan

Escribir el plan de consulta.

parse

Escribir la salida del traductor de consultas.

rewritten

Escribir la consulta reescrita.

parserstats

Escribir las estadísticas del traductor de consultas.

plannerstats

Escribir las estadísticas del planificador.

executorstats

Escribir las estadísticas de ejecución.

shortlocks

De momento no se usa, pero se precisa para habilitar nuevas características en el futuro.

locks

Trazar bloqueos.

userlocks

Trazar bloqueos de usuario.

spinlocks

Trazar 'spin locks'.

notify

Trazar funciones de notificación.

malloc

Sin uso por el momento.

palloc

Sin uso por el momento.

lock_debug_oidmin

Minimum relation oid traced by locks.

lock_debug_relid

oid, if not zero, of relation traced by locks.

lock_read_priority

Sin uso por el momento.

deadlock_timeout

Temporizador de comprobación de bloqueos circulares..

syslog

Marca de syslog. Valores permitidos:

0

Mensajes a stdout/stderr.

1

Mensajes a stdout/stderr y syslog.

2

Mensajes solamente a syslog.

hostlookup

Habilitar la consulta de nombre de host en ps_status.

showportnumber

Mostrar el número de puerto en ps_status.

notifyunlock

Desbloqueo de pg_listener después de notify.

notifyhack

Borrar tuplas duplicadas de pg_listener.