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.exeEl 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