Skip to main content

Command Palette

Search for a command to run...

Cómo analizar las conexiones Oracle Listener por minuto y por servicio con un script bash

Updated
8 min read
Cómo analizar las conexiones Oracle Listener por minuto y por servicio con un script bash
C

Mi nombre es Carla y me defino como una apasionada de conocer, compartir ideas, divertirme y aprender todo lo relacionado con Oracle.

Alegre y creativa, con un alto grado de autoexigencia, que busca, incluso sin querer, una forma diferente de ver un mismo problema o solución. Defensora del trabajo en equipo en todas las facetas de la vida y de disfrutar todo lo que haces, siempre con humildad.

Actualmente cuento con más de 15 años de experiencia como administradora de Oracle, habiendo ocupado previamente posiciones como desarrolladora en la rama de Inteligencia de Negocios. Fue en ese momento que me di cuenta de que no quería centrarme en el desarrollo, sino participar en todas las capas que involucraban los datos, desde el despliegue de la base de datos hasta su explotación final.

Siempre estoy dispuesta a ayudar y compartir conocimientos. Creo firmemente que con la tecnología hay que divertirse y no verla como una competencia. La persona con la que tienes que ser el mejor es contigo mismo.

Como DBA, entender el comportamiento del listener de Oracle es clave para detectar posibles cuellos de botella, picos inesperados o problemas de conexión que afectan el rendimiento y la estabilidad de las bases de datos. Una forma sencilla y eficaz de obtener esta información es analizando el archivo listener.log.

Hoy quiero compartir un script bash que he desarrollado para procesar esos logs, obtener estadísticas de conexiones por minuto y desglosarlas por servicio. Te explico cómo funciona y por qué puede ser una herramienta útil en tu día a día.

¿Qué hace este script?

  • Lee uno o varios archivos listener.log de Oracle, incluyendo posibles rotaciones.

  • Filtra las líneas correspondientes a una fecha y rango horario definidos (ejemplo: entre las 08:00 y las 12:00 de un día).

  • Extrae la hora exacta (hasta minuto) y el nombre del servicio (SERVICE_NAME) usado en cada conexión establecida.

Calcula y muestra:

  • El número total de conexiones por minuto.

  • El número total de conexiones por servicio.

  • Presenta el resultado ordenado cronológicamente y alfabéticamente para facilitar su interpretación.

¿Cómo funciona el script?

Variables configurables:

  • LISTENER_LOG_PATH y LISTENER_LOG_PATTERN para definir dónde están los logs y qué archivos leer.

  • FECHA, HORA_INICIO y HORA_FIN para definir el intervalo temporal a analizar.

¿Qué aporta a un DBA?

  • Visibilidad precisa: Podrás identificar en qué minutos se producen picos de conexión y si estos corresponden a servicios específicos, permitiendo detectar patrones anómalos.

  • Diagnóstico rápido: Al saber qué servicios están más activos, puedes priorizar análisis o acciones sobre aplicaciones concretas.

  • Soporte a troubleshooting: Ayuda a relacionar problemas de rendimiento o caídas con la carga real sobre el listener.

  • Automatización sencilla: El script se puede integrar en tareas cron para generar informes periódicos sin intervención manual.

#!/bin/bash

# Ruta a listener.log (puedes usar comodines)
LISTENER_LOG_PATH="/path_a_ruta_listener/listener/trace"
LISTENER_LOG_PATTERN="listener*.log"

# Rango horario a analizar
FECHA="20-JUN-2025"
HORA_INICIO="08:00"
HORA_FIN="12:00"

echo "Conexiones por minuto en listener.log entre \(HORA_INICIO y \)HORA_FIN del $FECHA"
echo

# Leer y procesar los logs
cat \(LISTENER_LOG_PATH/\)LISTENER_LOG_PATTERN 2>/dev/null | grep "$FECHA" | grep "CONNECT_DATA" | \
awk -v start="\(HORA_INICIO" -v end="\)HORA_FIN" '
{
  fecha = $1
  hora = $2
  minuto = substr(hora, 1, 5)

  if (minuto >= start && minuto <= end) {
    conexiones[minuto]++

    match($0, /SERVICE_NAME=[^)]+/, svc)
    if (svc[0] != "") {
      split(svc[0], tmp, "=")
      servicio = tmp[2]
      servicio_conexiones[servicio]++
    }
  }
}

END {
  print "Conexiones por minuto:"
  PROCINFO["sorted_in"] = "@ind_str_asc"
  for (t in conexiones) {
    printf "  %s → %d conexiones\n", t, conexiones[t]
  }

  print "\n Conexiones por SERVICE_NAME:"
  PROCINFO["sorted_in"] = "@ind_str_asc"
  for (s in servicio_conexiones) {
    printf "  %s → %d conexiones\n", s, servicio_conexiones[s]
  }
}'

Ejemplo de salida:

[xxxxxxxx@xxx-xxx-xxx ~]$ ./analisis_listener.sh
Conexiones por minuto en listener.log entre 08:00 y 12:00 del 20-JUN-2025

Conexiones por minuto:
  08:00 → 1274 conexiones
  08:01 → 1319 conexiones
  08:02 → 1326 conexiones
  08:03 → 1335 conexiones
  08:04 → 1254 conexiones
  08:05 → 1195 conexiones
  08:06 → 1196 conexiones
  08:07 → 1193 conexiones
  08:08 → 1194 conexiones
  08:09 → 1217 conexiones
  08:10 → 1192 conexiones
  08:11 → 1194 conexiones
  08:12 → 1211 conexiones
  08:13 → 1187 conexiones
  08:14 → 1199 conexiones
  08:15 → 1178 conexiones
  08:16 → 1209 conexiones
  08:17 → 1178 conexiones
  08:18 → 1177 conexiones
  08:19 → 1192 conexiones
  08:20 → 1213 conexiones
  08:21 → 1194 conexiones
  08:22 → 1177 conexiones
  08:23 → 1184 conexiones
  08:24 → 1183 conexiones
  08:25 → 1192 conexiones
  08:26 → 1220 conexiones
  08:27 → 1200 conexiones
  08:28 → 1220 conexiones
  08:29 → 1184 conexiones
  08:30 → 1196 conexiones
  08:31 → 1214 conexiones
  08:32 → 1233 conexiones
  08:33 → 1201 conexiones
  08:34 → 1223 conexiones
  08:35 → 1209 conexiones
  08:36 → 1219 conexiones
  08:37 → 1212 conexiones
  08:38 → 1194 conexiones
  08:39 → 1196 conexiones
  08:40 → 1219 conexiones
  08:41 → 1227 conexiones
  08:42 → 1207 conexiones
  08:43 → 1194 conexiones
  08:44 → 1204 conexiones
  08:45 → 1236 conexiones
  08:46 → 1212 conexiones
  08:47 → 1209 conexiones
  08:48 → 1215 conexiones
  08:49 → 1213 conexiones
  08:50 → 1183 conexiones
  08:51 → 1165 conexiones
  08:52 → 1204 conexiones
  08:53 → 1224 conexiones
  08:54 → 1182 conexiones
  08:55 → 1180 conexiones
  08:56 → 1187 conexiones
  08:57 → 1218 conexiones
  08:58 → 1214 conexiones
  08:59 → 1211 conexiones
  09:00 → 1240 conexiones
  09:01 → 1253 conexiones
  09:02 → 1239 conexiones
  09:03 → 1256 conexiones
  09:04 → 1225 conexiones
  09:05 → 1253 conexiones
  09:06 → 1230 conexiones
  09:07 → 1236 conexiones
  09:08 → 1200 conexiones
  09:09 → 1210 conexiones
  09:10 → 1240 conexiones
  09:11 → 1235 conexiones
  09:12 → 1209 conexiones
  09:13 → 1221 conexiones
  09:14 → 1195 conexiones
  09:15 → 1194 conexiones
  09:16 → 1221 conexiones
  09:17 → 1219 conexiones
  09:18 → 1178 conexiones
  09:19 → 1189 conexiones
  09:20 → 1212 conexiones
  09:21 → 1201 conexiones
  09:22 → 1228 conexiones
  09:23 → 1230 conexiones
  09:24 → 1238 conexiones
  09:25 → 1229 conexiones
  09:26 → 1219 conexiones
  09:27 → 1208 conexiones
  09:28 → 1240 conexiones
  09:29 → 1222 conexiones
  09:30 → 1222 conexiones
  09:31 → 1215 conexiones
  09:32 → 1219 conexiones
  09:33 → 1224 conexiones
  09:34 → 1213 conexiones
  09:35 → 1223 conexiones
  09:36 → 1208 conexiones
  09:37 → 1187 conexiones
  09:38 → 1236 conexiones
  09:39 → 1205 conexiones
  09:40 → 1202 conexiones
  09:41 → 1187 conexiones
  09:42 → 1214 conexiones
  09:43 → 1204 conexiones
  09:44 → 1194 conexiones
  09:45 → 1198 conexiones
  09:46 → 1209 conexiones
  09:47 → 1240 conexiones
  09:48 → 1221 conexiones
  09:49 → 1212 conexiones
  09:50 → 1237 conexiones
  09:51 → 1223 conexiones
  09:52 → 1221 conexiones
  09:53 → 1222 conexiones
  09:54 → 1238 conexiones
  09:55 → 1227 conexiones
  09:56 → 1234 conexiones
  09:57 → 1238 conexiones
  09:58 → 1221 conexiones
  09:59 → 1233 conexiones
  10:00 → 1279 conexiones
  10:01 → 1227 conexiones
  10:02 → 1236 conexiones
  10:03 → 1195 conexiones
  10:04 → 1203 conexiones
  10:05 → 1218 conexiones
  10:06 → 1186 conexiones
  10:07 → 1221 conexiones
  10:08 → 1232 conexiones
  10:09 → 1176 conexiones
  10:10 → 1178 conexiones
  10:11 → 1222 conexiones
  10:12 → 1206 conexiones
  10:13 → 1218 conexiones
  10:14 → 1205 conexiones
  10:15 → 1218 conexiones
  10:16 → 1251 conexiones
  10:17 → 1247 conexiones
  10:18 → 1288 conexiones
  10:19 → 1263 conexiones
  10:20 → 1290 conexiones
  10:21 → 1223 conexiones
  10:22 → 1241 conexiones
  10:23 → 1208 conexiones
  10:24 → 1220 conexiones
  10:25 → 1267 conexiones
  10:26 → 1239 conexiones
  10:27 → 1207 conexiones
  10:28 → 1231 conexiones
  10:29 → 1245 conexiones
  10:30 → 1247 conexiones
  10:31 → 1197 conexiones
  10:32 → 1205 conexiones
  10:33 → 1207 conexiones
  10:34 → 1231 conexiones
  10:35 → 1197 conexiones
  10:36 → 1218 conexiones
  10:37 → 1234 conexiones
  10:38 → 1184 conexiones
  10:39 → 1222 conexiones
  10:40 → 1237 conexiones
  10:41 → 1221 conexiones
  10:42 → 1232 conexiones
  10:43 → 1243 conexiones
  10:44 → 1233 conexiones
  10:45 → 1268 conexiones
  10:46 → 1204 conexiones
  10:47 → 1225 conexiones
  10:48 → 1257 conexiones
  10:49 → 1235 conexiones
  10:50 → 1228 conexiones
  10:51 → 1217 conexiones
  10:52 → 1258 conexiones
  10:53 → 1246 conexiones
  10:54 → 1243 conexiones
  10:55 → 1229 conexiones
  10:56 → 1222 conexiones
  10:57 → 1220 conexiones
  10:58 → 1197 conexiones
  10:59 → 1220 conexiones
  11:00 → 1220 conexiones
  11:01 → 1216 conexiones
  11:02 → 1246 conexiones
  11:03 → 1254 conexiones
  11:04 → 1231 conexiones
  11:05 → 1226 conexiones
  11:06 → 1238 conexiones
  11:07 → 1219 conexiones
  11:08 → 1211 conexiones
  11:09 → 1231 conexiones
  11:10 → 1227 conexiones
  11:11 → 1242 conexiones
  11:12 → 1210 conexiones
  11:13 → 1225 conexiones
  11:14 → 1245 conexiones
  11:15 → 1231 conexiones
  11:16 → 1246 conexiones
  11:17 → 1253 conexiones
  11:18 → 1253 conexiones
  11:19 → 1228 conexiones
  11:20 → 1248 conexiones
  11:21 → 1225 conexiones
  11:22 → 1202 conexiones
  11:23 → 1198 conexiones
  11:24 → 1207 conexiones
  11:25 → 1244 conexiones
  11:26 → 1222 conexiones
  11:27 → 1201 conexiones
  11:28 → 1229 conexiones
  11:29 → 1223 conexiones
  11:30 → 1240 conexiones
  11:31 → 1212 conexiones
  11:32 → 1230 conexiones
  11:33 → 1248 conexiones
  11:34 → 1237 conexiones
  11:35 → 1226 conexiones
  11:36 → 1248 conexiones
  11:37 → 1232 conexiones
  11:38 → 1238 conexiones
  11:39 → 1245 conexiones
  11:40 → 1250 conexiones
  11:41 → 1261 conexiones
  11:42 → 1252 conexiones
  11:43 → 1252 conexiones
  11:44 → 1228 conexiones
  11:45 → 1241 conexiones
  11:46 → 1213 conexiones
  11:47 → 1210 conexiones
  11:48 → 1202 conexiones
  11:49 → 1238 conexiones
  11:50 → 1232 conexiones
  11:51 → 1235 conexiones
  11:52 → 1228 conexiones
  11:53 → 1222 conexiones
  11:54 → 1201 conexiones
  11:55 → 1261 conexiones
  11:56 → 1218 conexiones
  11:57 → 1247 conexiones
  11:58 → 1223 conexiones
  11:59 → 702 conexiones

Conexiones por SERVICE_NAME:
  servicio1.xxxxx.xxx → 18104 conexiones
  cdbxxx.xxxxx.xxx → 309 conexiones
  servicio2.xxxxxx.xxx → 715 conexiones
  servicio3.xxxxxx.xxx → 1847 conexiones
  servicio4.xxxxx.xxx → 55783 conexiones
  pdb_xxx.xxxxx.xxx → 6 conexiones
  servicio5.xxxxx.xxx → 15 conexiones
  servicio6.xxxxx.xxx → 215613 conexiones

Mejoras y personalizaciones

  • Añadir un parámetro para filtrar por usuario o IP origen.

  • Generar gráficos con herramientas como gnuplot o exportar a CSV.

  • Integrar alertas si se detectan picos fuera de lo normal.

Dando rienda suelta a la imaginación y necesidades puede ser tu gran aliado.

J

Menuda maravilla!!! Genial, de verdad, muchas gracias por compartir.

More from this blog

Carla Muñoz López

64 posts

Soy DBA senior de bases de datos Oracle y me defino como una persona alegre y creativa. Apasionada por conocer, compartir ideas, divertirme y seguir aprendiendo todo lo relacionado con Oracle.