Estimados listeros


Tenemos un Server con postgres , dedicado, y con baja carga y hace unos días
se presentó una situación que ya se había presentado en Diciembre pasado y
que entonces abordamos parcialmente (osea..le dimos un placebo al cliente ya
que nuestras sospechas iban contra él, pero no pudimos demostrarlo).



La situación…     Bajo desconocidas circunstancias se están generando
bloqueos en una tabla de la BD que terminan finalmente por botar la
aplicación que trabaja sobre ésta. No tengo una configuración  de log
detallado pero en las dos ocasiones ha aparecido el texto “Ya existe una
transacción en curso” en el mismo momento del problema…… hasta lo que sé
este warning representa un error en algún código que no está cerrando
sesiones correctamente y seguramente por ahí está quedando algún lock
tomado.



En fin, los procedimientos de la BD son sencillísimos y sólo en uno de ellos
se tiene un bloque con Select FOR Update ya que existe una pequeña
posibilidad de que un proceso asíncrono con la lectura del dato lo pudiera
modificar antes o concurrentemente…..  Los desarrolladores de la aplicación
sólo ejecutan los procedimientos almacenados (no tienen código SQL en
bruto)….. asi que nuestra sospecha del causante de esa sesión mal cerrada va
por una conección del cliente que usa un “motor connect driver db:psql” (que
ni conozco) y a través del cual ejecutan una sentencia de tipo Select…… (
tengo entendido que un select también puede generar Locks en ciertas
circunstancias).



Mi intención es aumentar los niveles del Log de postgres y también colocar
via crontab alguna Query para sacar una foto cada x minutos de tal forma de
encontrar si nuestra sospecha es real...lo justo y necesario para esa
finalidad sin que esto implique un costo alto en performance. Los parámetros
que se me ocurre modificar son log_min_messages y log_min_error_statement
dejarlos en nivel notice…  especificar una duración para
log_min_duration_statement… habilitar log_connections, log_hostname..
configurar el log_line_prefix…  otro que creo debo modificar es
log_lock_waits.. pero está asociado a deadlock_timeout y por ahí me enredo
en el sentido de afectar o registras cosas de más…….en fin, son sólo
nociones para hacer cambios .. por eso prefiero que alguien mas
experimentado me pueda apoyar en esto…..

 Adjunto la sección LOGGING de mi postgresql.conf que actualmente está en
producción para que me indiquen donde modificar….   Y lo otro que necesito
es tener una Query que me entregue información del estado de la DB y los
eventuales locks cada x minutos para complementar lo del Log…  me imagino
que sería una combinación entre pg_locks, pg_stat_activity…..o las funciones
pg_stat_get_backend_xxxx…  yo tengo los usos de éstas en querys
individuales, pero no se si exista otra o algo más integral para mis fines….

Si estiman que debo considerar otros parámetros además del logging no duden
en indicármelo.


Bueno.. eso…Perdonen lo extenso… me gusta dar los detalles de los contextos
que planteo..



Saludos

Andrés
#------------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#------------------------------------------------------------------------------

# - Where to Log -

#log_destination = 'stderr'             # Valid values are combinations of
                                        # stderr, csvlog, syslog and eventlog,
                                        # depending on platform.  csvlog
                                        # requires logging_collector to be on.

# This is used when logging to stderr:
logging_collector = on                  # Enable capturing of stderr and csvlog
                                        # into log files. Required to be on for
                                        # csvlogs.
                                        # (change requires restart)

# These are only used if logging_collector is on:
log_directory = 'pg_log'                # directory where log files are written,
                                        # can be absolute or relative to PGDATA
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
                                        # can include strftime() escapes
log_truncate_on_rotation = on           # If on, an existing log file of the
                                        # same name as the new log file will be
                                        # truncated rather than appended to.
                                        # But such truncation only occurs on
                                        # time-driven rotation, not on restarts
                                        # or size-driven rotation.  Default is
                                        # off, meaning append to existing files
                                        # in all cases.
log_rotation_age = 1d                   # Automatic rotation of logfiles will
                                        # happen after that time.  0 disables.
log_rotation_size = 0                   # Automatic rotation of logfiles will
                                        # happen after that much log output.
                                        # 0 disables.
# These are relevant when logging to syslog:
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'

#silent_mode = off                      # Run server silently.
                                        # DO NOT USE without syslog or
                                        # logging_collector
                                        # (change requires restart)


# - When to Log -

#client_min_messages = notice           # values in order of decreasing detail:
                                        #   debug5
                                        #   debug4
                                        #   debug3
                                        #   debug2
                                        #   debug1
                                        #   log
                                        #   notice
                                        #   warning
                                        #   error

#log_min_messages = warning             # values in order of decreasing detail:
                                        #   debug5
                                        #   debug4
                                        #   debug3
                                        #   debug2
                                        #   debug1
                                        #   info
                                        #   notice
                                        #   warning
                                        #   error
                                        #   log
                                        #   fatal
                                        #   panic

#log_error_verbosity = default          # terse, default, or verbose messages
#log_min_error_statement = error        # values in order of decreasing detail:
                                        #   debug5
                                        #   debug4
                                        #   debug3
                                        #   debug2
                                        #   debug1
                                        #   info
                                        #   notice
                                        #   warning
                                        #   error
                                        #   log
                                        #   fatal
                                        #   panic (effectively off)

#log_min_duration_statement = -1        # -1 is disabled, 0 logs all statements
                                        # and their durations, > 0 logs only
                                        # statements running at least this 
number
                                        # of milliseconds


# - What to Log -

#debug_print_parse = off
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on
#log_checkpoints = off
#log_connections = off
#log_disconnections = off
#log_duration = off
#log_hostname = off
log_line_prefix = '%t'                  # special values:
                                        #   %u = user name
                                        #   %d = database name
                                        #   %r = remote host and port
                                        #   %h = remote host
                                        #   %p = process ID
                                        #   %t = timestamp without milliseconds
                                        #   %m = timestamp with milliseconds
                                        #   %i = command tag
                                        #   %c = session ID
                                        #   %l = session line number
                                        #   %s = session start timestamp
                                        #   %v = virtual transaction ID
                                        #   %x = transaction ID (0 if none)
                                        #   %q = stop here in non-session
                                        #        processes
                                        #   %% = '%'
                                        # e.g. '<%u%%%d> '
#log_lock_waits = off                   # log lock waits >= deadlock_timeout
log_statement = 'none'                  # none, ddl, mod, all
#log_temp_files = -1                    # log temporary files equal or larger
                                        # than the specified size in kilobytes;
                                        # -1 disables, 0 logs all temp files

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a