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