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 DEDICATEDY 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
Publicar un comentario