• Categoría: Oracle
  • Visto: 86725

Ratio: 4 / 5

Inicio activadoInicio activadoInicio activadoInicio activadoInicio desactivado
 
Oracle

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.

Sintaxis

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';