viernes, 7 de agosto de 2009

Kill Session en RAC Oracle10g/Oracle11g

Cuando tenemos una instancia en modo "Single Instance" ó "No RAC", podemos utilizar el siguiente conjunto de sentencias, para que desde una línea de comando de SQL*Plus, utilizando un usuario con privilegios, concluir - matar - la sessión de un usuario.

column machine format a40
select username, status, sid, serial#, machine, action, module from v$session
/
alter system kill session '&SID,&SERIAL' immediate
/

Sin embargo, cuando estamos en un ambiente RAC y hemos configurado nuestro LISTENER para "Transparent Application Failover" - TAF, los usuarios son conectados en forma aleatoria a cualquiera de los Nodos disponibles.
En un ambiente RAC, no podemos observar la información de conexiones activas en la base de datos, directamente en la vista v$session.
Para obtener la información de conexión de usuarios en la instancias, es necesario consultar la información de la vista gv$session y establecer previamente en cual instancia estamos conectados.

Con la consulta a la vista v$instance, podemos establecer el Nodo actual en el que estamos trabajando.

select instance_number UBICADO_EN_INSTANCIA from v$instance
/

Una vez establecido el Nodo actual de trabajo, podemos con la siguiente consulta, desplegar la información de sessiones activas ó inactivas en la base de datos. En el siguiente ejemplo, hago un filtrado por el campo de "machine" donde no corresponda con el patrón de "racd%", esto porque mis nodos se llaman racdb1 y racdb2. Con este filtrado, evito tocar las sessiones asociadas a procesos background de la base de datos, para evitar errores.

select inst_id ID_INSTANCIA, sid, serial#, username, machine, terminal, program from gv$session
where machine NOT LIKE 'racd%'
/

Si la sessión que necesitamos "matar", se encuentra en la misma instancia en donde estamos conectados, debemos utilizar la sentencia normal y corriente, empleada en una "SINGLE INSTANCE".

Si la sessión esta en un nodo distinto a donde nos encontramos, es necesario, agregar el número de la instancia, en donde esta conectado el usuario.

La sintáxis sería así:

alter system kill session '&SID,&SERIAL,@&INSTANCIA' immediate
/

Ejemplo: alter system kill session '2,38839,@2' immediate;

Complementariamente, pueden leer el post de Sebastián D'Alessandro "Detectar sesiones bloqueándose entre instancias de un RAC", como lectura complementaria a este artículo.


3 comentarios:

  1. Compañero, recuerda como dice en la nota es necesario establecer inicialmente en cuál nodo estas conectado, antes de intentar matar una sesión de usuario en un RAC, si me regalas tu correo, te puedo ampliar la nota.
    Saludos.

    ResponderEliminar
  2. Hola,

    estoy interesado en saber si realmente funciona esta instrucción para matar sesiones de diferentes instancias en Oracle 10g. Parece que con el comentario de Ronald Vargas existe esa posibilidad y necesito saber este dato.

    Por favor, enviadme la informacion a david.delbarrio@gmail.com

    Muchas gracias y un saludo

    ResponderEliminar

Te agradezco tus comentarios. Te esperamos de vuelta.

Todos los Sábados a las 8:00PM

Optimismo para una vida Mejor

Optimismo para una vida Mejor
Noticias buenas que comentar