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