martes, 15 de noviembre de 2011

Matar sesiones Oracle en Linux

A veces necesitamos matar sesiones de la base de datos Oracle, muchas veces estas sesiones se quedan “colgadas” e inactivas incluso por días, otras veces aunque están en estado activo se nos pide que las eliminemos.

Para matar una sesión contamos con el comando ALTER SYSTEM KILL SESSION 'sid, serial#'

Previamente debemos de conocer el sid y el serial# de la sesión que deseamos eliminar, en este caso queremos "matar" al usuario USER1:
SQL: select sid, serial#, username, status from v$session;

       SID    SERIAL# USERNAME   STATUS
---------- ---------- ---------- --------
       370        226            ACTIVE
       373        557 USER1      INACTIVE
       381         90 SYS        ACTIVE
       383          1            ACTIVE
       385          1            ACTIVE
       386          7            ACTIVE
       389          3            ACTIVE
       390          3            ACTIVE
       391          4            ACTIVE
       393          1            ACTIVE
       394          1            ACTIVE
       395          1            ACTIVE
       396          1            ACTIVE
       397          1            ACTIVE
       398          1            ACTIVE
       399          1            ACTIVE
       400          1            ACTIVE

17 rows selected.

El comando para eliminar el sid 373 es el siguiente:
SQL: alter system kill session '373,557';

System altered.

Sin embargo hay ocasiones en que ALTER SYSTEM KILL SESSION no libera los bloqueos que tenía la sesión que matamos. Esto sucede cuando una sesión no puede ser interrumpida hasta que terminie la operación que está realizando. En este caso, la sesión mantiene todos los recursos que obtuvo de nuestro servidor hasta que termina la operación. Normalmente, la sesión que ejecutó el ALTER SYSTEM KILL SESSION recibe el mensaje: “the session has been marked to be terminated”; y la sesión aparece en v$session con status “KILLED”

SQL> select sid, serial#, username, status from v$session;

       SID    SERIAL# USERNA STATUS
---------- ---------- ------ --------
       370        108        ACTIVE
       373        557 USER1  KILLED
       381         90 SYS    ACTIVE
       383          1        ACTIVE
       385          1        ACTIVE
       386          7        ACTIVE
       389          3        ACTIVE
       390          3        ACTIVE
       391          4        ACTIVE
       393          1        ACTIVE
       394          1        ACTIVE
       395          1        ACTIVE
       396          1        ACTIVE
       397          1        ACTIVE
       398          1        ACTIVE
       399          1        ACTIVE
       400          1        ACTIVE

17 rows selected.

Para poder matar el proceso del usuario en Linux, lo hacemos con un kill -9, conociendo previamente el proceso del usuario.

*** EN EL CASO QUE ESTÉN BAJO CON ORACLE BAJO WINDOWS, SUGIERO REVISAR COMANDO ORAKILL.EXE ***

Primeramente encontramos el thread con el siguiente query (debemos de conocer el thread previamente a ejecutar el comando ALTER SYSTEM KILL SESSION, de otra manera Oracle perdería la referencia al thread en cuestión):
SQL> select p.spid Thread, s.username Username, s.program
  2  from   v$process p, v$session s
  3  where  p.addr = s.paddr and s.username is not null;

THREAD       USERNAME   PROGRAM
------------ --------  -------------
364          SYS       sqlplus.exe
4524         USER1     sqlplus.exe
El comando por lo tanto sería:
kill -9 4524

A continuación en v$session vemos que ya no existe la sesión del usuario QUICK
SQL> select sid, serial#, username, status from v$session;


       SID    SERIAL# USERNAME   STATUS
---------- ---------- ---------- --------
       370        226            ACTIVE
       381         90 SYS        ACTIVE
       383          1            ACTIVE
       385          1            ACTIVE
       386          7            ACTIVE
       389          3            ACTIVE
       390          3            ACTIVE
       391          4            ACTIVE
       393          1            ACTIVE
       394          1            ACTIVE
       395          1            ACTIVE
       396          1            ACTIVE
       397          1            ACTIVE
       398          1            ACTIVE
       399          1            ACTIVE
       400          1            ACTIVE

16 rows selected.

Y con ésto, finalmente nos liberamos de esas molestas sesiones en estado KILLED que ocupan recursos en nuestra Base de Datos Oracle.

No hay comentarios:

Publicar un comentario