Antes de eliminar una sesión de oracle, debemos estar completamente seguros de estar eliminando al usuario correcto, de lo contrario podríamos afectar gravemente algún procesos ya sea de oracle o del aplicativo.
Para identificar la sesión a eliminar podemos ayudarnos de dos tablas GV$SESSION or GV$SESSION, utilizo las vistas de RAC porque aunque tengamos un solo nodo funciona.
SELECT s.inst_id, s.sid, s.serial#, p.spid, s.username, s.program FROM gv$session s JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id WHERE s.type != 'BACKGROUND';
De esta salida debemos obtener el sid, serial# y el nodo para rac, de lo contrario es suficiente con seleccionar con los dos anteriores.
SQL> ALTER SYSTEM KILL SESSION 'sid,serial#';
En RAC sería de la siguiente forma, pero para 11G
SQL> ALTER SYSTEM KILL SESSION 'sid,serial#,inst_id';
Si queremos que la sesión sea eliminada inmediatamente podemos anexar al comando la instrucción IMMEDIATE.
SQL> ALTER SYSTEM KILL SESSION 'sid,serial#,inst_id' IMMEDIATE;
ALTER SYSTEM DISCONNECT SESSION DISCONNECT SESSION nos da la opción POST_TRANSACTION, la cuál permite que la transacción termine antes de ser desconectada, mientras que la instrucción IMMEDIATE lo hace de manera inmediata. Si nos encontramos en un cluster con sus parámetros propiamente configurados se llevaría acabo un failover.
SQL> ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' [POST_TRANSACTION,IMMEDIATE]