matar sesiones oracle



El otro día recibí una alerta acerca de algunos bloqueos en esta base de datos, esta consulta me parece mas funcional que las basadas en v$lock, puesto que es mas rápida:

SQL> SELECT * FROM dba_waiters where MODE_HELD <>'None' or MODE_REQUESTED <>'Share';

WAITING_SESSION HOLDING_SESSION LOCK_TYPE                  MODE_HELD                                MODE_REQUESTED                             LOCK_ID1   LOCK_ID2
--------------- --------------- -------------------------- ---------------------------------------- ---------------------------------------- ---------- ----------
            398             336 Transaction                Exclusive                                Share                                        327692    9591040
            397             336 Transaction                Exclusive                                Share                                        327692    9591040
            394             336 Transaction                Exclusive                                Share                                        327692    9591040
            373             336 Transaction                Exclusive                                Share                                        327692    9591040
            347             336 Transaction                Exclusive                                Share                                        327692    9591040
            333             336 Transaction                Exclusive                                Share                                        327692    9591040
            316             336 Transaction                Exclusive                                Share                                        327692    9591040
            294             336 Transaction                Exclusive                                Share                                        327692    9591040
            293             336 Transaction                Exclusive                                Share                                        327692    9591040
            242             336 Transaction                Exclusive                                Share                                        327692    9591040
            201             336 Transaction                Exclusive                                Share                                        327692    9591040
            197             336 Transaction                Exclusive                                Share                                        327692    9591040
            194             336 Transaction                Exclusive                                Share                                        327692    9591040
            172             336 Transaction                Exclusive                                Share                                        327692    9591040
             88             336 Transaction                Exclusive                                Share                                        327692    9591040
             57             336 Transaction                Exclusive                                Share                                        327692    9591040
             13             336 Transaction                Exclusive                                Share                                        327692    9591040

17 rows selected.


Como se puede ver, la sessión 336 es la que está bloqueando a las demás

Así que se me pidió matar la sesión

Como para matar una session es necesario conocer el SERIAL# además de el SID de la sessión hago:

SQL> SELECT SID, SERIAL#, STATUS, SERVER  FROM V$SESSION  WHERE SID=336;

  SID    SERIAL# STATUS     SERVER
----- ---------- ---------- ---------
  336      40580 ACTIVE     DEDICATED
Y luego con esta información la meto en el " alter kill" para matarla...

SQL>ALTER SYSTEM KILL SESSION '=336,40580';
Statement processed.


pero esta sesión estará corriendo hasta que se complete el rollback de oracle... esto es porque cuando se lanza una cualquier operación DML (Operaciones de modificación de datos), Oracle realiza los cambios directamente en la tabla aunque no hagas "commit", pasando los bloques modificados al tablespace de undo...
Este método es muy eficiente si al final de la transacción se hace commit, pero si se hace rollback la base de datos tiene que volver a pasar todos los datos del undo a la tabla y borrar los que ya ha escrito... imagina que tienes una DML corriendo durante dos horas, si a las dos horas la matas, esta hace rollback y tendrá que volver a escribir en la tabla de nuevo todos los datos que se había llevado al undo..


column SID format 9999
column SPID format 9999999
column USERNAME format a15
column PROCESS format 99999
column MACHINE format a15
column PROGRAM format a55
column STATUS format a10
col LOGON_TIME for a27

select S.INST_ID,S.SID, P.SPID, S.USERNAME, S.MACHINE, S.PROGRAM, S.STATUS, to_char(LOGON_TIME, 'Dy DD-Mon-YYYY HH24:MI:SS') LOGON_TIME from gv$session S,  gv$process P where P.addr=S.paddr and S.INST_ID=P.INST_ID and S.SID=336;SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL>

   INST_ID   SID SPID         USERNAME        MACHINE         PROGRAM                                                 STATUS     LOGON_TIME
---------- ----- ------------ --------------- --------------- ------------------------------------------------------- ---------- ---------------------------
         1   336 22569        ORA_app          hostname02     serverSDM@hostname02   (TNS V1-V3)                       KILLED     Fri 29-Sep-2017 17:04:18


Aquí podemos ver que la sesión está en estado killed.. para estimar cuanto va a tardar podemos consultar la vista V$SESSION_LONGOPS

Comentarios

Entradas populares de este blog

Ampliar tablespace Oracle

Oracle máximo de sesiones

Bloqueos en Oracle