Hace ya casi medio año que estaba en un proyecto de migración y me tocó tocar un poco un entorno bajo Oracle RAC y me encontré con una curiosidad. Había tres nodos, respondían lógicamente a SID pero cada máquina tenía la base de datos bajo un sid diferente: SID1, SID2, SID3.

Bueno, hasta ahí bien, lo habitual en una instalación de RAC. Pero tenía que hacer un drop de un usuario y fallaba, y aparentemente no había sesiones activas, lo hacía mediante la siguiente query en uno de los nodos:

select * from v$session;

Luego por curiosidad lancé la query en las otras instancias y ahí encontré sesiones activas que tuve que matar para poder hacer el drop. Así que se me planteó la duda de si las sesiones de RAC no eran comunes (yo creía que si!), a lo que David de Oracle me confirmó que no son comunes, que cada nodo activo tiene las suyas propias pero que bajo RAC hay vistas globales de tipo “gv$“.

Mirando esta vista salen todas las sesiones de RAC junto con una columna inst_id que identifica el nodo donde se encuentran activas.

select * from gv$session;

Si no usamos RAC estas vistas existen igualmente y inst_id siempre es 1. Así que si creamos tests de chequeo (scripts, Nagios…) mejor usar las vistas globales por si un día chequeamos una base de datos bajo RAC y así no tenemos que cambiar nada.

También me comentó que desde cualquier nodo en teoría pueden matarse las sesiones de los otros nodos añadiendo el @inst_id en el comando:

alter system kill session ‘sid,serial#@inst_id’;