En muchas ocasiones tenemos la necesidad de matar una o varias sesiones de un usuario en una base de datos Oracle 11g, las sesiones de usuario las tenemos que matar desde Oracle y no desde el Sistema perativo, aunque podemos realizarlo desde el Sistema Operativo si no lograrmos eliminarlas desde Oracle.
Lo primero que vamos a hacer es identificar la sesión de usuaurio que tenemos que matar, para ello utilizaremos la siguiente Query:
SQL> SELECT a.USERNAME, a.SID, a.SERIAL#, b.SPID
FROM v$session a, v$process b
WHERE a.PADDR= b.ADDR
ORDER by 1;
La salida será algo parecido ha esto:
USERNAME SID SERIAL# SPID
----------- ---- ------- ------
TUUSUARIO_1 108 3917 56061
TUUSUARIO_2 158 58 51062
TUUSUARIO_3 41 4647 14649
La Select anterior nos devuelve el nombre de usuario, el número de proceso Oracle, el número serial del proceso Oracle y el PID del proceso Oracle en el Sistema Operativo.
Una vez tengamos identificada la sesión de usuario que queremos matar utilizamos la instrucción ALTER SYSTEM KILL SESSION desde SqlPlus.
ALTER SYSTEM KILL SESSION 'SID, SERIAL#';
Ejemplo:
SQL> ALTER SYSTEM KILL SESSION '108, 3917';
Es posible que la sesión no muera de forma inmediata ya que puede que se este realizando alguna transacción, esto dependera de lo que estubierá realizando el usuario.
A veces puede ocurrir que la sesión nunca muera por que se haya quedado zombi, en ese caso tendremos que matarla desde el promt del Sistema Operativo, para ello utilizaremos el PID que tenemos en la columna SPID.
Ejemplo para Unix/Linux
#kill -9 56061
Hasta aquí para matar sesiones de forma individual, pero, ¿Cómo matar múltiples sesiones? , por ejemplo las 20 sesiones del usuario user1,
SELECT a.USERNAME, a.SID, a.SERIAL#, b.SPID
FROM v$session a, v$process b
WHERE a.PADDR= b.ADDR
ORDER by 1;
USERNAME SID SERIAL# SPID
------------------------------ ---------- ---------- ------------------------
user1 125 5 2498
user1 143 29 2638
user1 2 1 2418
user1 127 1 2422
user1 3 1 2424
user1 128 1 2426
user1 4 1 2428
user1 129 1 2430
user1 5 1 2432
user1 130 1 2434
user1 6 1 2436
USERNAME SID SERIAL# SPID
------------------------------ ---------- ---------- ------------------------
user1 131 1 2438
user1 7 1 2440
user1 132 1 2442
user1 8 1 2444
user1 9 3 2500
user1 135 3 2502
user1 10 1 2504
user1 136 3 2506
user1 12 1 2508
user2 140 3 2522
user3 17 23 2652
USERNAME SID SERIAL# SPID
------------------------------ ---------- ---------- ------------------------
user3 134 11 2524
user4 21 5 2540
user5 1 1 2414
user5 126 1 2416
26 filas seleccionadas.
La forma de hacer esto es construyendo una Query que nos devuelva la instrucción KILL completa para cada sesión, está es la Query.
SQL> SELECT 'ALTER SYSTEM KILL SESSION ' || '''' || a.SID || ', ' || a.SERIAL# || ''';'
FROM v$session a, v$process b
WHERE a.PADDR= b.ADDR
AND a.username 'user1';
'ALTERSYSTEMKILLSESSION'||''''||A.SID||','||A.SERIAL#||''';'
--------------------------------------------------------------------------------
ALTER SYSTEM KILL SESSION '1, 1';
ALTER SYSTEM KILL SESSION '126, 1';
ALTER SYSTEM KILL SESSION '2, 1';
ALTER SYSTEM KILL SESSION '127, 1';
ALTER SYSTEM KILL SESSION '3, 1';
ALTER SYSTEM KILL SESSION '128, 1';
ALTER SYSTEM KILL SESSION '4, 1';
ALTER SYSTEM KILL SESSION '129, 1';
ALTER SYSTEM KILL SESSION '5, 1';
ALTER SYSTEM KILL SESSION '130, 1';
ALTER SYSTEM KILL SESSION '6, 1';
'ALTERSYSTEMKILLSESSION'||''''||A.SID||','||A.SERIAL#||''';'
--------------------------------------------------------------------------------
ALTER SYSTEM KILL SESSION '131, 1';
ALTER SYSTEM KILL SESSION '7, 1';
ALTER SYSTEM KILL SESSION '132, 1';
ALTER SYSTEM KILL SESSION '8, 1';
ALTER SYSTEM KILL SESSION '125, 5';
ALTER SYSTEM KILL SESSION '9, 3';
ALTER SYSTEM KILL SESSION '135, 3';
ALTER SYSTEM KILL SESSION '10, 1';
ALTER SYSTEM KILL SESSION '136, 3';
20 filas seleccionadas.
La cláusula WHERE la podéis complicar todo lo que sea necesario para obtener el resultado deseado, en este ejemplo quería matar las sesiones del usuario user1.
¿Cómo proceder? Copiáis el resultado a un editor, limpiáis de cabeceras y del resto para dejar solo las instrucciones, copiáis desde el editor al promtp de SqlPplus, pulsáis return y se ejecutarán todas las instrucciones, si son muchas podéis crear un archivo y llamar al archivo desde el prompt, recordar que el nombre del archivo tiene que estar precedido por la @roga para que SqlPlus ejecute el contenido.
Así quedaría una vez realizada la limpieza.
ALTER SYSTEM KILL SESSION '1, 1';
ALTER SYSTEM KILL SESSION '126, 1';
ALTER SYSTEM KILL SESSION '2, 1';
ALTER SYSTEM KILL SESSION '127, 1';
ALTER SYSTEM KILL SESSION '3, 1';
ALTER SYSTEM KILL SESSION '128, 1';
ALTER SYSTEM KILL SESSION '4, 1';
ALTER SYSTEM KILL SESSION '129, 1';
ALTER SYSTEM KILL SESSION '5, 1';
ALTER SYSTEM KILL SESSION '130, 1';
ALTER SYSTEM KILL SESSION '6, 1';
ALTER SYSTEM KILL SESSION '131, 1';
ALTER SYSTEM KILL SESSION '7, 1';
ALTER SYSTEM KILL SESSION '132, 1';
ALTER SYSTEM KILL SESSION '8, 1';
ALTER SYSTEM KILL SESSION '125, 5';
ALTER SYSTEM KILL SESSION '9, 3';
ALTER SYSTEM KILL SESSION '135, 3';
ALTER SYSTEM KILL SESSION '10, 1';
ALTER SYSTEM KILL SESSION '136, 3';