Saber conexiones en ORACLE no realizan ningun query o tarea y matarlas.

Buen día a todo:

Mi pregunta como puedo hacer una consulta donde me diga que usuarios(conexiones) a la base de datos de oracle no esten ejecutando nada (query o proceso), en realidad saber que no esten haciendo nada y que tengan ya mucho tiempo en 'INACTIVE' para de este modo eliminarlas.

se me ocurre que con un profile matar todas las que esten en STATUS='SNIPED' de la vista V$SESSION pero que pasa si me guio por el tiempo y estan realizando algun query y los cambia de estado, por eso pienso que si manejo tiempo de conectado (LOGON_TIME) y saber si no hacen nada (PARA ESTO ES EL QUERY qUE MENCIONO) para asi matar las sesiones que en realidad son zombies.

Gracias a todos por sus posibles respuestas.

Y porquè no utilizas el parámetro IDLE_TIME del profile? Con el IDLE_TIME defines el tiempo máximo sin actividad que se permite a las conexiones. Cuando se supera este tiempo, definido en minutos, sin que la conexión haya tenido ninguna actividad, Oracle desconecta al usuario.

 

Por ejemplo, para crear un perfil definiendo un límite de máximo de inactividad de 30 minutos:

 

SQL> create profile prof_inactividad limit idle_time 30;

Y para asignar este perfil a cualquier usuario:

 

SQL> alter user usuario_limitado profile prof_inactividad;

 

De todas maneras pruébalo bien antes de aplicarlo a todos los usuarios, porque las limitaciones de los profiles siempre son delicadas, y pueden producir algún efecto que no se había tenido en cuenta..

En respuesta a por Carlos

  Gracias Carlos por la respuesta, y si eso ya lo tengo en unos usuarios pero en caso de otros necesito saber si no están inactivos pero talvez esten realizando alguna tarea (query) entonces debo de saber que en realidad esten ahi sin hacer nada para así poder eliminar esas sesiones, y el campo IDLE_TIME  hacer que cambie de estatus en v$session a SNIPED.

 

que mas debo hacer para saber que no esten haciendo nada porque no puedo matarlas si enrelizadad estan haciendo u nquery  y tarda 30 min y se quede inavtiva la session.

 

Gracias y Saludos. 

En respuesta a por Pedro Tablas Sanchez

Tienes razón Pedro, con el parámetro IDLE_TIME sólo se controla la inactividad de las sesiones por la parte cliente, pero los procesos que se han lanzado en el servidor pueden seguir ejecutándose con la sesión cliente inactiva.

Podrías probar a utilizar el parámetro EXPIRE_TIME de SQL*NET, que comprueba cada cierto tiempo (los minutos que le especifiques) que las conexiones estén activas a nivel cliente/servidor, la comprobación se hace desde la parte servidora. Ten cuidado, porque parece ser que consume bastantes recursos del servidor.

Te enlazo el Tip Terminating Oracle connections with connect_time, idle_time, expire_time andinbound_connect_timeout de Burleson Consulting, que explica cómo funciona este parámetro y como modificar el fichero sqlnet.ora para ponerlo en funcionamiento.

Buen dia-
como restringir por listener o tnsnames que los usuarios que estan sniped y mato, no queden como killed y ese idle aumente y nunca mueran....??

no puedo hacer un job que los mate por sistema operativo, porque se manejan despachadores y mataria varios usuarios...

alguien tiene alguna idea, agradezco respuestas a mi correo.

quedo atenta
silvia

Hola Carlos como veo que es lo que esta realizando un usuario conectado?
Saludos!!

En respuesta a por Anonimo (no verificado)

Tienes que activar la auditoría de Oracle sobre ese usuario. Te enlazo un tema de Auditoría, seguimiento y seguridad en BD Oracle, en el que encontrarás informacion sobre cómo activar la auditoría sobre usuarios y otros objetos de BBDD Oracle.

Mientras no activas la auditoría, otra manera de ver lo que hace un usuario 'al vuelo' es utilizando esta consulta:

Últimas consultas SQL ejecutadas en Oracle y usuario que las ejecutó

select distinct vs.sql_text, vs.sharable_mem,
vs.persistent_mem, vs.runtime_mem, vs.sorts,
vs.executions, vs.parse_calls, vs.module,
vs.buffer_gets, vs.disk_reads, vs.version_count,
vs.users_opening, vs.loads,
to_char(to_date(vs.first_load_time,
'YYYY-MM-DD/HH24:MI:SS'),'MM/DD HH24:MI:SS') first_load_time,
rawtohex(vs.address) address, vs.hash_value hash_value ,
rows_processed , vs.command_type, vs.parsing_user_id ,
OPTIMIZER_MODE , au.USERNAME parseuser
from v$sqlarea vs , all_users au
where (parsing_user_id != 0) AND
(au.user_id(+)=vs.parsing_user_id)
and (executions >= 1) order by buffer_gets/executions desc