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.


No hay comentarios:

Publicar un comentario

Te agradezco tus comentarios. Te esperamos de vuelta.

Todos los Sábados a las 8:00PM